From: Timo Sirainen Date: Wed, 7 Jun 2017 21:40:12 +0000 (+0300) Subject: lib-master, config: Move the responsibility of cleaning environment to doveconf X-Git-Tag: 2.2.33.rc1~86 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6766ea3d4803855e2b54517bda700b5c665a4019;p=thirdparty%2Fdovecot%2Fcore.git lib-master, config: Move the responsibility of cleaning environment to doveconf --- diff --git a/src/config/doveconf.c b/src/config/doveconf.c index a54d1845c4..ab896af367 100644 --- a/src/config/doveconf.c +++ b/src/config/doveconf.c @@ -12,6 +12,7 @@ #include "str.h" #include "strescape.h" #include "settings-parser.h" +#include "master-interface.h" #include "master-service.h" #include "all-settings.h" #include "sysinfo-get.h" @@ -865,11 +866,21 @@ int main(int argc, char *argv[]) } else { struct config_export_context *ctx; - env_put("DOVECONF_ENV=1"); ctx = config_export_init(wanted_modules, CONFIG_DUMP_SCOPE_SET, CONFIG_DUMP_FLAG_CHECK_SETTINGS, config_request_putenv, NULL); config_export_by_filter(ctx, &filter); + + if (getenv(DOVECOT_PRESERVE_ENVS_ENV) != NULL) { + /* Standalone binary is getting its configuration via + doveconf. Clean the environment before calling it. + Do this only if the environment exists, because + lib-master doesn't set it if it doesn't want the + environment to be cleaned (e.g. -k parameter). */ + master_service_env_clean(); + } + + env_put("DOVECONF_ENV=1"); if (config_export_finish(&ctx) < 0) i_fatal("Invalid configuration"); execvp(exec_args[0], exec_args); diff --git a/src/lib-master/master-service-settings.c b/src/lib-master/master-service-settings.c index e2345fef3e..5291b91959 100644 --- a/src/lib-master/master-service-settings.c +++ b/src/lib-master/master-service-settings.c @@ -134,7 +134,14 @@ master_service_exec_config(struct master_service *service, master_service_import_environment("USER"); if ((service->flags & MASTER_SERVICE_FLAG_STANDALONE) != 0) master_service_import_environment("LOG_STDERR_TIMESTAMP"); - master_service_env_clean(); + + /* doveconf empties the environment before exec()ing us back + if DOVECOT_PRESERVE_ENVS is set, so make sure it is. */ + if (getenv(DOVECOT_PRESERVE_ENVS_ENV) == NULL) + env_put(DOVECOT_PRESERVE_ENVS_ENV"="); + } else { + /* make sure doveconf doesn't remove any environment */ + env_remove(DOVECOT_PRESERVE_ENVS_ENV); } if (input->use_sysexits) env_put("USE_SYSEXITS=1");