]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm exec: Avoid re-executing doveconf after executing binary
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 20 Dec 2022 21:37:49 +0000 (23:37 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Fri, 27 Jan 2023 13:01:47 +0000 (13:01 +0000)
src/doveadm/doveadm-settings.c
src/doveadm/doveadm-settings.h
src/doveadm/doveadm.c

index 2d76e1def7cdcef1520111e211594705c045c2e9..8a64abd7eb4205f0e46106613b3097d4c23716a0 100644 (file)
@@ -16,6 +16,7 @@ ARRAY_TYPE(doveadm_setting_root) doveadm_setting_roots;
 bool doveadm_verbose_proctitle;
 
 static pool_t doveadm_settings_pool = NULL;
+static int global_config_fd = -1;
 
 static bool doveadm_settings_check(void *_set, pool_t pool, const char **error_r);
 
@@ -257,9 +258,13 @@ void doveadm_read_settings(void)
        input.service = "doveadm";
        input.preserve_user = TRUE;
        input.preserve_home = TRUE;
+       input.return_config_fd = TRUE; /* for doveadm exec */
        if (master_service_settings_read(master_service, &input,
                                         &output, &error) < 0)
                i_fatal("Error reading configuration: %s", error);
+       i_assert(global_config_fd == -1);
+       global_config_fd = output.config_fd;
+       fd_close_on_exec(output.config_fd, TRUE);
 
        doveadm_settings_pool = pool_alloconly_create("doveadm settings", 1024);
        service_set = master_service_settings_get_root_set_dup(master_service,
@@ -282,6 +287,12 @@ void doveadm_read_settings(void)
        }
 }
 
+int doveadm_settings_get_config_fd(void)
+{
+       i_assert(global_config_fd != -1);
+       return global_config_fd;
+}
+
 void doveadm_setting_roots_add(const struct setting_parser_info *info)
 {
        struct doveadm_setting_root *root;
index 13b0a1782502f6702a23add48faa9d35ea177ae5..86a7bfeffa1d52eca0cba0cf8694ab951bfa5ca1 100644 (file)
@@ -58,6 +58,7 @@ void doveadm_setting_roots_add(const struct setting_parser_info *info);
 void *doveadm_setting_roots_get_settings(const struct setting_parser_info *info);
 
 void doveadm_read_settings(void);
+int doveadm_settings_get_config_fd(void);
 
 void doveadm_settings_init(void);
 void doveadm_settings_deinit(void);
index ba79ec6106a86b1cea2b10704ba8bc890bfc940b..c691f2a67c94934df89e833799a1eab702f9963e 100644 (file)
@@ -216,6 +216,11 @@ static void cmd_exec(struct doveadm_cmd_context *cctx)
        if (!doveadm_cmd_param_array(cctx, "args", &args))
                args = NULL;
 
+       /* Avoid re-executing doveconf after the binary is executed */
+       int config_fd = doveadm_settings_get_config_fd();
+       fd_close_on_exec(config_fd, FALSE);
+       env_put(DOVECOT_CONFIG_FD_ENV, dec2str(config_fd));
+
        path = t_strdup_printf("%s/%s", doveadm_settings->libexec_dir, binary);
 
        unsigned int len = str_array_length(args);