dovecot-2.0: Dynamic settings parser allocation logic was wrong.

dovecot at dovecot.org dovecot at dovecot.org
Sat Mar 27 03:44:33 EET 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/fdb352eecdac
changeset: 11002:fdb352eecdac
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Mar 27 03:44:31 2010 +0200
description:
Dynamic settings parser allocation logic was wrong.
Default setting structures were being cleared after settings parser pool was
freed.

diffstat:

 src/lib-master/master-service-settings.c |   6 ------
 src/lib-master/master-service-settings.h |   3 ---
 src/lib-storage/mail-storage-service.c   |  28 ++++++++--------------------
 3 files changed, 8 insertions(+), 29 deletions(-)

diffs (119 lines):

diff -r f483bbface26 -r fdb352eecdac src/lib-master/master-service-settings.c
--- a/src/lib-master/master-service-settings.c	Sat Mar 27 02:58:57 2010 +0200
+++ b/src/lib-master/master-service-settings.c	Sat Mar 27 03:44:31 2010 +0200
@@ -305,12 +305,6 @@
 			pool_alloconly_create("master service settings", 8192);
 	}
 
-	if (input->dyn_parsers != NULL) {
-		settings_parser_info_update(service->set_pool,
-					    input->dyn_parsers_parent,
-					    input->dyn_parsers);
-	}
-
 	p_array_init(&all_roots, service->set_pool, 8);
 	tmp_root = &master_service_setting_parser_info;
 	array_append(&all_roots, &tmp_root, 1);
diff -r f483bbface26 -r fdb352eecdac src/lib-master/master-service-settings.h
--- a/src/lib-master/master-service-settings.h	Sat Mar 27 02:58:57 2010 +0200
+++ b/src/lib-master/master-service-settings.h	Sat Mar 27 03:44:31 2010 +0200
@@ -4,7 +4,6 @@
 #include "network.h"
 
 struct setting_parser_info;
-struct dynamic_settings_parser;
 struct master_service;
 
 struct master_service_settings {
@@ -20,8 +19,6 @@
 
 struct master_service_settings_input {
 	const struct setting_parser_info **roots;
-	const struct dynamic_settings_parser *dyn_parsers;
-	struct setting_parser_info *dyn_parsers_parent;
 	const char *config_path;
 	bool preserve_home;
 	bool never_exec;
diff -r f483bbface26 -r fdb352eecdac src/lib-storage/mail-storage-service.c
--- a/src/lib-storage/mail-storage-service.c	Sat Mar 27 02:58:57 2010 +0200
+++ b/src/lib-storage/mail-storage-service.c	Sat Mar 27 03:44:31 2010 +0200
@@ -46,8 +46,6 @@
 
 	const char *set_cache_module, *set_cache_service;
 	struct master_service_settings_cache *set_cache;
-	const struct dynamic_settings_parser *set_cache_dyn_parsers;
-	struct setting_parser_info *set_cache_dyn_parsers_parent;
 	const struct setting_parser_info **set_cache_roots;
 
 	unsigned int debug:1;
@@ -580,12 +578,11 @@
 	}
 }
 
-static struct setting_parser_info *
+static void
 dyn_parsers_update_parent(pool_t pool,
 			  const struct setting_parser_info ***_roots,
-			  const struct dynamic_settings_parser **_dyn_parsers)
+			  const struct dynamic_settings_parser *dyn_parsers)
 {
-	const struct dynamic_settings_parser *dyn_parsers = *_dyn_parsers;
 	const const struct setting_parser_info **roots = *_roots;
 	const struct setting_parser_info *old_parent, **new_roots;
 	struct setting_parser_info *new_parent, *new_info;
@@ -622,8 +619,8 @@
 		new_info->parent = new_parent;
 		new_dyn_parsers[i].info = new_info;
 	}
-	*_dyn_parsers = new_dyn_parsers;
-	return new_parent;
+
+	settings_parser_info_update(pool, new_parent, new_dyn_parsers);
 }
 
 int mail_storage_service_read_settings(struct mail_storage_service_ctx *ctx,
@@ -635,6 +632,7 @@
 {
 	struct master_service_settings_input set_input;
 	struct master_service_settings_output set_output;
+	const struct dynamic_settings_parser *dyn_parsers;
 	unsigned int i;
 
 	memset(&set_input, 0, sizeof(set_input));
@@ -658,33 +656,23 @@
 		ctx->set_cache = master_service_settings_cache_init(
 			ctx->service, set_input.module, set_input.service);
 		ctx->set_cache_roots = ctx->set_roots;
-		ctx->set_cache_dyn_parsers =
-			mail_storage_get_dynamic_parsers(ctx->pool);
-		ctx->set_cache_dyn_parsers_parent =
-			dyn_parsers_update_parent(ctx->pool,
-						  &ctx->set_cache_roots,
-						  &ctx->set_cache_dyn_parsers);
 	} else {
 		/* already looked up settings at least once.
 		   we really shouldn't be execing anymore. */
 		set_input.never_exec = TRUE;
 	}
 
+	dyn_parsers = mail_storage_get_dynamic_parsers(pool);
 	if (null_strcmp(set_input.module, ctx->set_cache_module) == 0 &&
 	    null_strcmp(set_input.service, ctx->set_cache_service) == 0) {
 		set_input.roots = ctx->set_cache_roots;
-		set_input.dyn_parsers = ctx->set_cache_dyn_parsers;
-		set_input.dyn_parsers_parent =
-			ctx->set_cache_dyn_parsers_parent;
+		dyn_parsers_update_parent(pool, &set_input.roots, dyn_parsers);
 		if (master_service_settings_cache_read(ctx->set_cache,
 						       &set_input,
 						       parser_r, error_r) < 0)
 			return -1;
 	} else {
-		set_input.dyn_parsers = mail_storage_get_dynamic_parsers(pool);
-		set_input.dyn_parsers_parent =
-			dyn_parsers_update_parent(pool, &set_input.roots,
-						  &set_input.dyn_parsers);
+		dyn_parsers_update_parent(pool, &set_input.roots, dyn_parsers);
 		if (master_service_settings_read(ctx->service, &set_input,
 						 &set_output, error_r) < 0) {
 			*error_r = t_strdup_printf(


More information about the dovecot-cvs mailing list