From dbe06905918a415a34c5621b9fdf45be0b9c8e64 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Sat, 27 Mar 2010 03:44:31 +0200 Subject: [PATCH] Dynamic settings parser allocation logic was wrong. Default setting structures were being cleared after settings parser pool was freed. --HG-- branch : HEAD --- 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(-) diff --git a/src/lib-master/master-service-settings.c b/src/lib-master/master-service-settings.c index 49e87c5761..7c1a70511c 100644 --- a/src/lib-master/master-service-settings.c +++ b/src/lib-master/master-service-settings.c @@ -305,12 +305,6 @@ int master_service_settings_read(struct master_service *service, 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 --git a/src/lib-master/master-service-settings.h b/src/lib-master/master-service-settings.h index 2e824358d1..78a8a4af48 100644 --- a/src/lib-master/master-service-settings.h +++ b/src/lib-master/master-service-settings.h @@ -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 { 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 --git a/src/lib-storage/mail-storage-service.c b/src/lib-storage/mail-storage-service.c index 1c43bc0f4d..c2188044ae 100644 --- a/src/lib-storage/mail-storage-service.c +++ b/src/lib-storage/mail-storage-service.c @@ -46,8 +46,6 @@ struct mail_storage_service_ctx { 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 @@ settings_parser_update_children_parent(struct setting_parser_info *parent, } } -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 @@ dyn_parsers_update_parent(pool_t pool, 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 @@ int mail_storage_service_read_settings(struct mail_storage_service_ctx *ctx, { 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 @@ int mail_storage_service_read_settings(struct mail_storage_service_ctx *ctx, 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( -- 2.47.3