OpenSSL: full-chain OCSP stapling. Bug 1466
[exim.git] / src / src / environment.c
index b768a0fd6e158a383e2eb489a67cd16c1b280cd8..9cb90c86fcc00e9a20863196548e115a9ab3cd63 100644 (file)
@@ -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;
 }