]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm: Use a separate memory pool for parsing doveadm command line parameters
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 2 Dec 2024 22:10:06 +0000 (00:10 +0200)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 2 Dec 2024 22:10:06 +0000 (00:10 +0200)
This avoids spending a lot of the data stack for the actual command
processing, causing them to grow the data stack.

src/doveadm/doveadm-cmd-parse.c

index 518984feaff0ca8c3dcf556df700d9a09a223cf1..257e7d1d3111e2aab64575dad60e08d64e1576a1 100644 (file)
@@ -374,12 +374,14 @@ int doveadm_cmdline_run(int argc, const char *const argv[],
 {
        ARRAY_TYPE(doveadm_cmd_param_arr_t) pargv;
        unsigned int pargc;
-       pool_t pool = pool_datastack_create();
+       pool_t pool = pool_alloconly_create("doveadm cmdline", 1024);
 
        i_getopt_reset();
        p_array_init(&pargv, pool, 20);
-       if (doveadm_cmd_process_options(argc, argv, cctx, pool, &pargv) < 0)
+       if (doveadm_cmd_process_options(argc, argv, cctx, pool, &pargv) < 0) {
+               pool_unref(&pool);
                return -1;
+       }
 
        unsigned int ptr_count;
        struct doveadm_cmd_param *ptr = array_get_modifiable(&pargv, &ptr_count);
@@ -411,6 +413,7 @@ int doveadm_cmdline_run(int argc, const char *const argv[],
                                e_error(cctx->event, "Invalid parameter: %s",
                                        t_strarray_join(argv + optind, " "));
                                doveadm_cmd_params_clean(&pargv);
+                               pool_unref(&pool);
                                return -1;
                        }
                        found = TRUE;
@@ -420,6 +423,7 @@ int doveadm_cmdline_run(int argc, const char *const argv[],
                        e_error(cctx->event, "Extraneous arguments found: %s",
                                t_strarray_join(argv + optind, " "));
                        doveadm_cmd_params_clean(&pargv);
+                       pool_unref(&pool);
                        return -1;
                }
                if (is_keyvalue)
@@ -439,6 +443,7 @@ int doveadm_cmdline_run(int argc, const char *const argv[],
                cctx->cmd->cmd(cctx);
 
        doveadm_cmd_params_clean(&pargv);
+       pool_unref(&pool);
        return 0;
 }