From: Timo Sirainen Date: Sat, 4 Oct 2025 13:03:05 +0000 (+0300) Subject: lib-dict-backend: dict-sql - Avoid data stack growth X-Git-Tag: 2.4.2~359 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d7cc1bdc4efe4d0a2aa0e45b27ceeb793c32c8f0;p=thirdparty%2Fdovecot%2Fcore.git lib-dict-backend: dict-sql - Avoid data stack growth --- diff --git a/src/lib-dict-backend/dict-sql-settings.c b/src/lib-dict-backend/dict-sql-settings.c index 24a8c5cf80..998b9b5dab 100644 --- a/src/lib-dict-backend/dict-sql-settings.c +++ b/src/lib-dict-backend/dict-sql-settings.c @@ -284,13 +284,30 @@ dict_sql_map_settings_get(struct event *event, return 0; } +static int +dict_sql_settings_get_map(struct event *event, const char *name, + struct dict_sql_map_settings *set, + const char **error_r) +{ + struct event *map_event = event_create(event); + const char *error; + int ret; + settings_event_add_list_filter_name(map_event, "dict_map", name); + if ((ret = dict_sql_map_settings_get(map_event, set, &error)) < 0) { + *error_r = t_strdup_printf("Failed to get dict_map %s: %s", + name, error); + } + event_unref(&map_event); + return ret; +} + int dict_sql_settings_get(struct event *event, struct dict_sql_map_settings **set_r, const char **error_r) { const struct dict_map_settings *maps_set; struct dict_sql_map_settings *set; - const char *name, *error; + const char *name; int ret = 0; pool_t pool = pool_alloconly_create("dict sql map settings", 128); @@ -305,17 +322,13 @@ int dict_sql_settings_get(struct event *event, } if (array_is_created(&maps_set->maps)) { array_foreach_elem(&maps_set->maps, name) { - struct event *map_event = event_create(event); - settings_event_add_list_filter_name(map_event, - "dict_map", name); - if (dict_sql_map_settings_get(map_event, set, &error) < 0) { - *error_r = t_strdup_printf( - "Failed to get dict_map %s: %s", name, error); + T_BEGIN { + dict_sql_settings_get_map(event, name, set, error_r); + } T_END_PASS_STR_IF(ret < 0, error_r); + if (ret < 0) { ret = -1; - } - event_unref(&map_event); - if (ret < 0) break; + } } }