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