]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-master, config: Move the responsibility of cleaning environment to doveconf
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 7 Jun 2017 21:40:12 +0000 (00:40 +0300)
committerGitLab <gitlab@git.dovecot.net>
Sat, 10 Jun 2017 08:35:40 +0000 (11:35 +0300)
src/config/doveconf.c
src/lib-master/master-service-settings.c

index 439faccb0357bb3cd6e4f52c6abd729dacd9b3c4..d723ed6f9178833f6e84b13725fb357c343361ce 100644 (file)
@@ -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"
@@ -870,11 +871,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);
index 5161645016ae8a83d046a15b567575bd733a55d8..de7608073fe8ea83955bab3f74b62ea5134990ed 100644 (file)
@@ -137,7 +137,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");