X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/2478dbdfba7cf729ddee43a5a77bde8c25ccdede..f168d6a2c93ee92d87744ce09c45a0ec666f889c:/src/src/environment.c diff --git a/src/src/environment.c b/src/src/environment.c index c41d19eba..d96a4e1dd 100644 --- a/src/src/environment.c +++ b/src/src/environment.c @@ -2,16 +2,17 @@ * Exim - an Internet mail transport agent * *************************************************/ -/* Copyright (c) Heiko Schlittermann 2016 +/* + * Copyright (c) The Exim Maintainers 2022 - 2023 + * Copyright (c) Heiko Schlittermann 2016 * hs@schlittermann.de * See the file NOTICE for conditions of use and distribution. + * SPDX-License-Identifier: GPL-2.0-or-later */ #include "exim.h" -#ifndef environ extern char **environ; -#endif /* The cleanup_environment() function is used during the startup phase of the Exim process, right after reading the configurations main @@ -26,7 +27,7 @@ Returns: TRUE if successful BOOL cleanup_environment() { -if (!keep_environment || *keep_environment == '\0') +if (!keep_environment || !*keep_environment) { /* From: https://github.com/dovecot/core/blob/master/src/lib/env-util.c#L55 Try to clear the environment. @@ -40,34 +41,59 @@ 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(); + unsigned deb = debug_selector; + BOOL hc = host_checking; + debug_selector = 0; /* quieten this clearout */ + host_checking = FALSE; + + 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); - if (OK != match_isinlist(name, CUSS &keep_environment, - 0, NULL, NULL, MCL_NOEXPAND, FALSE, NULL)) - if (unsetenv(CS name) < 0) return FALSE; - else p = USS environ; /* RESTART from the beginning */ - else p++; - store_reset(name); + uschar * name = string_copyn(*p, eqp - *p); + + if (match_isinlist(name, CUSS &keep_environment, + 0, NULL, NULL, MCL_NOEXPAND, FALSE, NULL) == OK) + p++; /* next */ + else if (os_unsetenv(name) == 0) + p = USS environ; /* RESTART from the beginning */ + else + { debug_selector = deb; host_checking = hc; return FALSE; } } } + debug_selector = deb; + host_checking = hc; + store_reset(reset_point); + } +DEBUG(D_expand) + { + debug_printf("environment after trimming:\n"); + if (environ) for (uschar ** p = USS environ; *p; p++) + debug_printf(" %s\n", *p); } if (add_environment) { - uschar *p; - int sep = 0; - const uschar* envlist = add_environment; - while ((p = string_nextinlist(&envlist, &sep, NULL, 0))) - putenv(CS p); + int sep = 0; + const uschar * envlist = add_environment; + int old_pool = store_pool; + store_pool = POOL_PERM; /* Need perm memory for any created env vars */ + + for (const uschar * p; p = string_nextinlist(&envlist, &sep, NULL, 0); ) + { + DEBUG(D_expand) debug_printf("adding %s\n", p); + putenv(CS p); + } + store_pool = old_pool; } +#ifndef DISABLE_TLS +tls_clean_env(); +#endif - return TRUE; +return TRUE; }