Commit | Line | Data |
---|---|---|
bc3c7bb7 HSHR |
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 | ||
2478dbdf | 12 | extern char **environ; |
2478dbdf | 13 | |
bc3c7bb7 HSHR |
14 | /* The cleanup_environment() function is used during the startup phase |
15 | of the Exim process, right after reading the configurations main | |
16 | part, before any expansions take place. It retains the environment | |
17 | variables we trust (via the keep_environment option) and allows to | |
18 | set additional variables (via add_environment). | |
19 | ||
20 | Returns: TRUE if successful | |
21 | FALSE otherwise | |
22 | */ | |
23 | ||
24 | BOOL | |
25 | cleanup_environment() | |
26 | { | |
27 | if (!keep_environment || *keep_environment == '\0') | |
2478dbdf HSHR |
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 | } | |
bc3c7bb7 HSHR |
39 | else if (Ustrcmp(keep_environment, "*") != 0) |
40 | { | |
41 | uschar **p; | |
42 | if (environ) for (p = USS environ; *p; /* see below */) | |
43 | { | |
2478dbdf HSHR |
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. */ | |
93a680e4 | 47 | uschar * eqp = Ustrchr(*p, '='); |
bc3c7bb7 | 48 | |
2478dbdf HSHR |
49 | if (eqp) |
50 | { | |
93a680e4 JH |
51 | uschar * name = string_copyn(*p, eqp - *p); |
52 | ||
2478dbdf HSHR |
53 | if (OK != match_isinlist(name, CUSS &keep_environment, |
54 | 0, NULL, NULL, MCL_NOEXPAND, FALSE, NULL)) | |
271019bd | 55 | if (os_unsetenv(name) < 0) return FALSE; |
2478dbdf HSHR |
56 | else p = USS environ; /* RESTART from the beginning */ |
57 | else p++; | |
58 | store_reset(name); | |
59 | } | |
bc3c7bb7 HSHR |
60 | } |
61 | } | |
62 | if (add_environment) | |
63 | { | |
93a680e4 | 64 | uschar * p; |
bc3c7bb7 | 65 | int sep = 0; |
93a680e4 JH |
66 | const uschar * envlist = add_environment; |
67 | ||
68 | while ((p = string_nextinlist(&envlist, &sep, NULL, 0))) putenv(CS p); | |
bc3c7bb7 HSHR |
69 | } |
70 | ||
71 | return TRUE; | |
72 | } |