Compiler quietening
[exim.git] / src / src / environment.c
index 68adf3c0cac91c92476d739307e4efe834aefe63..b05b1aefd7091a7f1333485f95a4b6b17fbc8b02 100644 (file)
@@ -4,6 +4,7 @@
 
 /* Copyright (c) Heiko Schlittermann 2016
  * hs@schlittermann.de
+ * Copyright (c) The Exim Maintainers 2022
  * See the file NOTICE for conditions of use and distribution.
  * SPDX-License-Identifier: GPL-2.0-or-later
  */
@@ -25,10 +26,7 @@ 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')
+if (!keep_environment || !*keep_environment)
   {
   /* From: https://github.com/dovecot/core/blob/master/src/lib/env-util.c#L55
   Try to clear the environment.
@@ -43,6 +41,11 @@ if (!keep_environment || *keep_environment == '\0')
 else if (Ustrcmp(keep_environment, "*") != 0)
   {
   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
@@ -54,31 +57,42 @@ else if (Ustrcmp(keep_environment, "*") != 0)
       {
       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++;
+      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;
+  int old_pool = store_pool;
+  store_pool = POOL_PERM;              /* Need perm memory for any created env vars */
 
-  while ((p = string_nextinlist(&envlist, &sep, NULL, 0)))
+  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
 
-store_pool = old_pool;
 return TRUE;
 }