Mercurial > dovecot > core-2.2
changeset 10592:477bd56cdb3e HEAD
lib-settings: Initialize block{}s, even if they don't have anything inside.
For example if there's an empty userdb {}, it should give an error instead
of being silently ignored.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 27 Jan 2010 23:40:50 +0200 |
parents | 379b993c5ca6 |
children | 2d118c4e6957 |
files | src/lib-settings/settings-parser.c |
diffstat | 1 files changed, 28 insertions(+), 20 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-settings/settings-parser.c Wed Jan 27 23:20:05 2010 +0200 +++ b/src/lib-settings/settings-parser.c Wed Jan 27 23:40:50 2010 +0200 @@ -436,6 +436,29 @@ return 0; } +static void +setting_link_init_set_struct(struct setting_parser_context *ctx, + struct setting_link *link) +{ + void *ptr; + + link->set_struct = p_malloc(ctx->set_pool, link->info->struct_size); + if ((ctx->flags & SETTINGS_PARSER_FLAG_TRACK_CHANGES) != 0) { + link->change_struct = + p_malloc(ctx->set_pool, link->info->struct_size); + array_append(link->change_array, &link->change_struct, 1); + } + + setting_parser_copy_defaults(ctx, link->info, link); + array_append(link->array, &link->set_struct, 1); + + if (link->info->parent_offset != (size_t)-1 && link->parent != NULL) { + ptr = STRUCT_MEMBER_P(link->set_struct, + link->info->parent_offset); + *((void **)ptr) = link->parent->set_struct; + } +} + static int setting_link_add(struct setting_parser_context *ctx, const struct setting_define *def, const struct setting_link *link_copy, char *key) @@ -457,6 +480,9 @@ *link = *link_copy; link->full_key = key; hash_table_insert(ctx->links, key, link); + + if (link->info->struct_size != 0) + setting_link_init_set_struct(ctx, link); return 0; } @@ -520,26 +546,8 @@ ctx->prev_info = link->info; - if (link->set_struct == NULL) { - link->set_struct = - p_malloc(ctx->set_pool, link->info->struct_size); - if ((ctx->flags & SETTINGS_PARSER_FLAG_TRACK_CHANGES) != 0) { - link->change_struct = p_malloc(ctx->set_pool, - link->info->struct_size); - array_append(link->change_array, - &link->change_struct, 1); - } - - setting_parser_copy_defaults(ctx, link->info, link); - array_append(link->array, &link->set_struct, 1); - - if (link->info->parent_offset != (size_t)-1 && - link->parent != NULL) { - ptr = STRUCT_MEMBER_P(link->set_struct, - link->info->parent_offset); - *((void **)ptr) = link->parent->set_struct; - } - } + if (link->set_struct == NULL) + setting_link_init_set_struct(ctx, link); change_ptr = link->change_struct == NULL ? NULL : STRUCT_MEMBER_P(link->change_struct, def->offset);