From: Timo Sirainen Date: Tue, 28 Mar 2023 00:18:13 +0000 (+0300) Subject: config: Handle config_export_by_filter() failures earlier X-Git-Tag: 2.4.0~2204 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=124ca674eb11cbd8b6110bd894493dfb9967a686;p=thirdparty%2Fdovecot%2Fcore.git config: Handle config_export_by_filter() failures earlier --- diff --git a/src/config/config-dump-full.c b/src/config/config-dump-full.c index 190d2528cc..07c83cba56 100644 --- a/src/config/config-dump-full.c +++ b/src/config/config-dump-full.c @@ -171,7 +171,11 @@ int config_dump_full(enum config_dump_full_dest dest, config_dump_full_callback, &dump_ctx); } i_zero(&empty_filter); - config_export_by_filter(export_ctx, &empty_filter); + if (config_export_by_filter(export_ctx, &empty_filter) < 0) { + config_export_free(&export_ctx); + str_free(&dump_ctx.delayed_output); + return -1; + } string_t *path = t_str_new(128); const char *final_path = NULL; diff --git a/src/config/config-request.c b/src/config/config-request.c index 5898d6e107..ba23805bba 100644 --- a/src/config/config-request.c +++ b/src/config/config-request.c @@ -27,8 +27,6 @@ struct config_export_context { struct config_module_parser *dup_parsers; struct master_service_settings_output output; unsigned int section_idx; - - bool failed; }; static void config_export_size(string_t *str, uoff_t size) @@ -398,8 +396,8 @@ config_export_init(enum config_dump_scope scope, return ctx; } -void config_export_by_filter(struct config_export_context *ctx, - const struct config_filter *filter) +int config_export_by_filter(struct config_export_context *ctx, + const struct config_filter *filter) { const char *error; @@ -407,9 +405,10 @@ void config_export_by_filter(struct config_export_context *ctx, &ctx->dup_parsers, &ctx->output, &error) < 0) { i_error("%s", error); - ctx->failed = TRUE; + return -1; } ctx->parsers = ctx->dup_parsers; + return 0; } void config_export_parsers(struct config_export_context *ctx, @@ -482,11 +481,6 @@ int config_export_all_parsers(struct config_export_context **_ctx, *_ctx = NULL; - if (ctx->failed) { - config_export_free(&ctx); - return -1; - } - ctx->section_idx = *section_idx; for (i = 0; ctx->parsers[i].root != NULL; i++) { parser = &ctx->parsers[i]; diff --git a/src/config/config-request.h b/src/config/config-request.h index 238e81ca3a..e921429514 100644 --- a/src/config/config-request.h +++ b/src/config/config-request.h @@ -44,8 +44,8 @@ config_export_init(enum config_dump_scope scope, enum config_dump_flags flags, config_request_callback_t *callback, void *context) ATTR_NULL(1, 5); -void config_export_by_filter(struct config_export_context *ctx, - const struct config_filter *filter); +int config_export_by_filter(struct config_export_context *ctx, + const struct config_filter *filter); void config_export_parsers(struct config_export_context *ctx, const struct config_module_parser *parsers); void config_export_get_output(struct config_export_context *ctx, diff --git a/src/config/doveconf.c b/src/config/doveconf.c index ae71d6e62e..f170b870ab 100644 --- a/src/config/doveconf.c +++ b/src/config/doveconf.c @@ -594,8 +594,10 @@ config_dump_human(const struct config_filter *filter, o_stream_cork(output); ctx = config_dump_human_init(scope, TRUE); - config_export_by_filter(ctx->export_ctx, filter); - ret = config_dump_human_output(ctx, output, 0, setting_name_filter, hide_passwords); + if ((ret = config_export_by_filter(ctx->export_ctx, filter)) < 0) + config_export_free(&ctx->export_ctx); + else + ret = config_dump_human_output(ctx, output, 0, setting_name_filter, hide_passwords); config_dump_human_deinit(ctx); if (setting_name_filter == NULL) @@ -618,7 +620,10 @@ config_dump_one(const struct config_filter *filter, bool hide_key, bool dump_section = FALSE; ctx = config_dump_human_init(scope, FALSE); - config_export_by_filter(ctx->export_ctx, filter); + if (config_export_by_filter(ctx->export_ctx, filter) < 0) { + config_export_free(&ctx->export_ctx); + return -1; + } if (config_export_all_parsers(&ctx->export_ctx, §ion_idx) < 0) return -1; @@ -1021,8 +1026,10 @@ int main(int argc, char *argv[]) CONFIG_DUMP_FLAG_CHECK_SETTINGS, config_request_simple_stdout, setting_name_filters); - config_export_by_filter(ctx, &filter); - ret2 = config_export_all_parsers(&ctx, §ion_idx); + if ((ret2 = config_export_by_filter(ctx, &filter)) < 0) + config_export_free(&ctx); + else + ret2 = config_export_all_parsers(&ctx, §ion_idx); } else if (setting_name_filters != NULL) { ret2 = 0; /* ignore settings-check failures in configuration. this allows