X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/bc3c7bb7d4aba3e563434e5627fe1f2176aa18c0..0768462dc5830cde5ae7a3659577fb557926db28:/src/src/environment.c diff --git a/src/src/environment.c b/src/src/environment.c index aaa84f817..c394eb7e7 100644 --- a/src/src/environment.c +++ b/src/src/environment.c @@ -9,6 +9,8 @@ #include "exim.h" +extern char **environ; + /* The cleanup_environment() function is used during the startup phase of the Exim process, right after reading the configurations main part, before any expansions take place. It retains the environment @@ -23,31 +25,47 @@ BOOL cleanup_environment() { if (!keep_environment || *keep_environment == '\0') - clearenv(); + { + /* From: https://github.com/dovecot/core/blob/master/src/lib/env-util.c#L55 + Try to clear the environment. + a) environ = NULL crashes on OS X. + b) *environ = NULL doesn't work on FreeBSD 7.0. + c) environ = emptyenv doesn't work on Haiku OS + d) environ = calloc() should work everywhere */ + + if (environ) *environ = NULL; + + } else if (Ustrcmp(keep_environment, "*") != 0) { uschar **p; if (environ) for (p = USS environ; *p; /* see below */) { - uschar *name = string_copyn(*p, US Ustrchr(*p, '=') - *p); + /* It's considered broken if we do not find the '=', according to + Florian Weimer. For now we ignore such strings. unsetenv() would complain, + getenv() would complain. */ + uschar * eqp = Ustrchr(*p, '='); - if (OK != match_isinlist(name, CUSS &keep_environment, - 0, NULL, NULL, MCL_NOEXPAND, FALSE, NULL)) - if (unsetenv(CS name) < 0) return FALSE; - else /* nothing */; - else - p++; + if (eqp) + { + uschar * name = string_copyn(*p, eqp - *p); - store_reset(name); + if (OK != match_isinlist(name, CUSS &keep_environment, + 0, NULL, NULL, MCL_NOEXPAND, FALSE, NULL)) + if (os_unsetenv(name) < 0) return FALSE; + else p = USS environ; /* RESTART from the beginning */ + else p++; + store_reset(name); + } } } if (add_environment) { - uschar *p; + uschar * p; int sep = 0; - const uschar* envlist = add_environment; - while ((p = string_nextinlist(&envlist, &sep, NULL, 0))) - putenv(CS p); + const uschar * envlist = add_environment; + + while ((p = string_nextinlist(&envlist, &sep, NULL, 0))) putenv(CS p); } return TRUE;