From: Timo Sirainen Date: Tue, 20 Dec 2022 21:37:49 +0000 (+0200) Subject: doveadm exec: Avoid re-executing doveconf after executing binary X-Git-Tag: 2.4.0~3068 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8c489459f44a2e6927f3bb97d0874e787441f880;p=thirdparty%2Fdovecot%2Fcore.git doveadm exec: Avoid re-executing doveconf after executing binary --- diff --git a/src/doveadm/doveadm-settings.c b/src/doveadm/doveadm-settings.c index 2d76e1def7..8a64abd7eb 100644 --- a/src/doveadm/doveadm-settings.c +++ b/src/doveadm/doveadm-settings.c @@ -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; diff --git a/src/doveadm/doveadm-settings.h b/src/doveadm/doveadm-settings.h index 13b0a17825..86a7bfeffa 100644 --- a/src/doveadm/doveadm-settings.h +++ b/src/doveadm/doveadm-settings.h @@ -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); diff --git a/src/doveadm/doveadm.c b/src/doveadm/doveadm.c index ba79ec6106..c691f2a67c 100644 --- a/src/doveadm/doveadm.c +++ b/src/doveadm/doveadm.c @@ -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);