X-Git-Url: https://vcs.fsf.org/?p=exim.git;a=blobdiff_plain;f=src%2Fsrc%2Fenvironment.c;h=9cb90c86fcc00e9a20863196548e115a9ab3cd63;hp=b768a0fd6e158a383e2eb489a67cd16c1b280cd8;hb=86ede124f0ce622b4f73e05504abc11fece021e3;hpb=271019bd0730f90f81d44ea0946707588df242d6 diff --git a/src/src/environment.c b/src/src/environment.c index b768a0fd6..9cb90c86f 100644 --- a/src/src/environment.c +++ b/src/src/environment.c @@ -24,6 +24,9 @@ Returns: TRUE if successful BOOL cleanup_environment() { +int old_pool = store_pool; +store_pool = POOL_PERM; /* Need perm memory for any created env vars */ + if (!keep_environment || *keep_environment == '\0') { /* From: https://github.com/dovecot/core/blob/master/src/lib/env-util.c#L55 @@ -38,34 +41,43 @@ if (!keep_environment || *keep_environment == '\0') } else if (Ustrcmp(keep_environment, "*") != 0) { - uschar **p; - if (environ) for (p = USS environ; *p; /* see below */) + rmark reset_point = store_mark(); + if (environ) for (uschar ** p = USS environ; *p; /* see below */) { /* 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, '='); + uschar * eqp = Ustrchr(*p, '='); if (eqp) { - uschar *name = string_copyn(*p, eqp - *p); + uschar * name = string_copyn(*p, eqp - *p); + 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); } } + store_reset(reset_point); } if (add_environment) { - uschar *p; - int sep = 0; - const uschar* envlist = add_environment; - while ((p = string_nextinlist(&envlist, &sep, NULL, 0))) - putenv(CS p); + uschar * p; + int sep = 0; + const uschar * envlist = add_environment; + + while ((p = string_nextinlist(&envlist, &sep, NULL, 0))) + { + DEBUG(D_expand) debug_printf("adding %s\n", p); + putenv(CS p); + } } +#ifndef DISABLE_TLS +tls_clean_env(); +#endif - return TRUE; +store_pool = old_pool; +return TRUE; }