diff options
author | netblue30 <netblue30@yahoo.com> | 2016-07-09 12:26:56 -0400 |
---|---|---|
committer | netblue30 <netblue30@yahoo.com> | 2016-07-09 12:26:56 -0400 |
commit | 7c964608ba3560d8869492c674f89a07f5240850 (patch) | |
tree | 767ca55fc82c4e2c661c0fcccb16564449fe2387 /src/firejail/env.c | |
parent | seccomp filter update (diff) | |
download | firejail-7c964608ba3560d8869492c674f89a07f5240850.tar.gz firejail-7c964608ba3560d8869492c674f89a07f5240850.tar.zst firejail-7c964608ba3560d8869492c674f89a07f5240850.zip |
added --rmenv
Diffstat (limited to 'src/firejail/env.c')
-rw-r--r-- | src/firejail/env.c | 55 |
1 files changed, 40 insertions, 15 deletions
diff --git a/src/firejail/env.c b/src/firejail/env.c index 54a6b0036..1a6236407 100644 --- a/src/firejail/env.c +++ b/src/firejail/env.c | |||
@@ -27,12 +27,27 @@ typedef struct env_t { | |||
27 | struct env_t *next; | 27 | struct env_t *next; |
28 | char *name; | 28 | char *name; |
29 | char *value; | 29 | char *value; |
30 | ENV_OP op; | ||
30 | } Env; | 31 | } Env; |
31 | static Env *envlist = NULL; | 32 | static Env *envlist = NULL; |
32 | 33 | ||
33 | static void env_add(Env *env) { | 34 | static void env_add(Env *env) { |
34 | env->next = envlist; | 35 | env->next = NULL; |
35 | envlist = env; | 36 | |
37 | // add the new entry at the end of the list | ||
38 | if (envlist == NULL) { | ||
39 | envlist = env; | ||
40 | return; | ||
41 | } | ||
42 | |||
43 | Env *ptr = envlist; | ||
44 | while (1) { | ||
45 | if (ptr->next == NULL) { | ||
46 | ptr->next = env; | ||
47 | break; | ||
48 | } | ||
49 | ptr = ptr->next; | ||
50 | } | ||
36 | } | 51 | } |
37 | 52 | ||
38 | // load IBUS env variables | 53 | // load IBUS env variables |
@@ -87,7 +102,7 @@ void env_ibus_load(void) { | |||
87 | if (arg_debug) | 102 | if (arg_debug) |
88 | printf("%s\n", buf); | 103 | printf("%s\n", buf); |
89 | EUID_USER(); | 104 | EUID_USER(); |
90 | env_store(buf); | 105 | env_store(buf, SETENV); |
91 | EUID_ROOT(); | 106 | EUID_ROOT(); |
92 | } | 107 | } |
93 | 108 | ||
@@ -126,7 +141,7 @@ void env_defaults(void) { | |||
126 | } | 141 | } |
127 | 142 | ||
128 | // parse and store the environment setting | 143 | // parse and store the environment setting |
129 | void env_store(const char *str) { | 144 | void env_store(const char *str, ENV_OP op) { |
130 | EUID_ASSERT(); | 145 | EUID_ASSERT(); |
131 | assert(str); | 146 | assert(str); |
132 | 147 | ||
@@ -134,11 +149,13 @@ void env_store(const char *str) { | |||
134 | if (*str == '\0') | 149 | if (*str == '\0') |
135 | goto errexit; | 150 | goto errexit; |
136 | char *ptr = strchr(str, '='); | 151 | char *ptr = strchr(str, '='); |
137 | if (!ptr) | 152 | if (op == SETENV) { |
138 | goto errexit; | 153 | if (!ptr) |
139 | ptr++; | 154 | goto errexit; |
140 | if (*ptr == '\0') | 155 | ptr++; |
141 | goto errexit; | 156 | if (*ptr == '\0') |
157 | goto errexit; | ||
158 | } | ||
142 | 159 | ||
143 | // build list entry | 160 | // build list entry |
144 | Env *env = malloc(sizeof(Env)); | 161 | Env *env = malloc(sizeof(Env)); |
@@ -148,10 +165,13 @@ void env_store(const char *str) { | |||
148 | env->name = strdup(str); | 165 | env->name = strdup(str); |
149 | if (env->name == NULL) | 166 | if (env->name == NULL) |
150 | errExit("strdup"); | 167 | errExit("strdup"); |
151 | char *ptr2 = strchr(env->name, '='); | 168 | if (op == SETENV) { |
152 | assert(ptr2); | 169 | char *ptr2 = strchr(env->name, '='); |
153 | *ptr2 = '\0'; | 170 | assert(ptr2); |
154 | env->value = ptr2 + 1; | 171 | *ptr2 = '\0'; |
172 | env->value = ptr2 + 1; | ||
173 | } | ||
174 | env->op = op; | ||
155 | 175 | ||
156 | // add entry to the list | 176 | // add entry to the list |
157 | env_add(env); | 177 | env_add(env); |
@@ -167,8 +187,13 @@ void env_apply(void) { | |||
167 | Env *env = envlist; | 187 | Env *env = envlist; |
168 | 188 | ||
169 | while (env) { | 189 | while (env) { |
170 | if (setenv(env->name, env->value, 1) < 0) | 190 | if (env->op == SETENV) { |
171 | errExit("setenv"); | 191 | if (setenv(env->name, env->value, 1) < 0) |
192 | errExit("setenv"); | ||
193 | } | ||
194 | else if (env->op == RMENV) { | ||
195 | unsetenv(env->name); | ||
196 | } | ||
172 | env = env->next; | 197 | env = env->next; |
173 | } | 198 | } |
174 | } | 199 | } |