]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
config: Handle config_export_by_filter() failures earlier
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 28 Mar 2023 00:18:13 +0000 (03:18 +0300)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 20 Nov 2023 12:20:55 +0000 (14:20 +0200)
src/config/config-dump-full.c
src/config/config-request.c
src/config/config-request.h
src/config/doveconf.c

index 190d2528ccb284987d3cbdb74108c1578413f63b..07c83cba5644d9647eb516e68de389c99a73abcf 100644 (file)
@@ -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;
index 5898d6e107081deec888c47e01415b0600617277..ba23805bbad62e7b69f30da5778a7f48b52d99c0 100644 (file)
@@ -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];
index 238e81ca3a0b9f87399185013c352b921444e754..e921429514f058d7892086e58c25c9527893c763 100644 (file)
@@ -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,
index ae71d6e62e15f3a2b19291e17825a2a3e77686b1..f170b870abf9fd0ed9ea88f7ae196c4fb7518b7a 100644 (file)
@@ -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, &section_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, &section_idx);
+               if ((ret2 = config_export_by_filter(ctx, &filter)) < 0)
+                       config_export_free(&ctx);
+               else
+                       ret2 = config_export_all_parsers(&ctx, &section_idx);
        } else if (setting_name_filters != NULL) {
                ret2 = 0;
                /* ignore settings-check failures in configuration. this allows