# HG changeset patch # User Timo Sirainen # Date 1496871612 -10800 # Node ID 48772f0423cd6d340250b58b2a540a5bdc3aba0c # Parent bca86353ccd5c321bac7aff22538324db1b036ee lib-master, config: Move the responsibility of cleaning environment to doveconf diff -r bca86353ccd5 -r 48772f0423cd src/config/doveconf.c --- a/src/config/doveconf.c Thu Jun 08 00:35:08 2017 +0300 +++ b/src/config/doveconf.c Thu Jun 08 00:40:12 2017 +0300 @@ -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 @@ } 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 -r bca86353ccd5 -r 48772f0423cd src/lib-master/master-service-settings.c --- a/src/lib-master/master-service-settings.c Thu Jun 08 00:35:08 2017 +0300 +++ b/src/lib-master/master-service-settings.c Thu Jun 08 00:40:12 2017 +0300 @@ -134,7 +134,14 @@ 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");