Import Upstream version 4.92
[hcoop/debian/exim4.git] / src / environment.c
CommitLineData
188b6fee
CE
1/*************************************************
2* Exim - an Internet mail transport agent *
3*************************************************/
4
5/* Copyright (c) Heiko Schlittermann 2016
6 * hs@schlittermann.de
7 * See the file NOTICE for conditions of use and distribution.
8 */
9
10#include "exim.h"
11
12extern char **environ;
13
14/* The cleanup_environment() function is used during the startup phase
15of the Exim process, right after reading the configurations main
16part, before any expansions take place. It retains the environment
17variables we trust (via the keep_environment option) and allows to
18set additional variables (via add_environment).
19
20Returns: TRUE if successful
21 FALSE otherwise
22*/
23
24BOOL
25cleanup_environment()
26{
27if (!keep_environment || *keep_environment == '\0')
28 {
29 /* From: https://github.com/dovecot/core/blob/master/src/lib/env-util.c#L55
30 Try to clear the environment.
31 a) environ = NULL crashes on OS X.
32 b) *environ = NULL doesn't work on FreeBSD 7.0.
33 c) environ = emptyenv doesn't work on Haiku OS
34 d) environ = calloc() should work everywhere */
35
36 if (environ) *environ = NULL;
37
38 }
39else if (Ustrcmp(keep_environment, "*") != 0)
40 {
41 uschar **p;
42 if (environ) for (p = USS environ; *p; /* see below */)
43 {
44 /* It's considered broken if we do not find the '=', according to
45 Florian Weimer. For now we ignore such strings. unsetenv() would complain,
46 getenv() would complain. */
2ea97746 47 uschar * eqp = Ustrchr(*p, '=');
188b6fee
CE
48
49 if (eqp)
50 {
2ea97746
CE
51 uschar * name = string_copyn(*p, eqp - *p);
52
53 if (OK != match_isinlist(name, CUSS &keep_environment,
188b6fee 54 0, NULL, NULL, MCL_NOEXPAND, FALSE, NULL))
2ea97746 55 if (os_unsetenv(name) < 0) return FALSE;
188b6fee
CE
56 else p = USS environ; /* RESTART from the beginning */
57 else p++;
58 store_reset(name);
59 }
60 }
61 }
62if (add_environment)
63 {
2ea97746 64 uschar * p;
188b6fee 65 int sep = 0;
2ea97746
CE
66 const uschar * envlist = add_environment;
67
68 while ((p = string_nextinlist(&envlist, &sep, NULL, 0))) putenv(CS p);
188b6fee
CE
69 }
70
71 return TRUE;
72}