aboutsummaryrefslogtreecommitdiffstats
path: root/src/firejail/env.c
diff options
context:
space:
mode:
authorLibravatar netblue30 <netblue30@yahoo.com>2016-07-09 12:26:56 -0400
committerLibravatar netblue30 <netblue30@yahoo.com>2016-07-09 12:26:56 -0400
commit7c964608ba3560d8869492c674f89a07f5240850 (patch)
tree767ca55fc82c4e2c661c0fcccb16564449fe2387 /src/firejail/env.c
parentseccomp filter update (diff)
downloadfirejail-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.c55
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;
31static Env *envlist = NULL; 32static Env *envlist = NULL;
32 33
33static void env_add(Env *env) { 34static 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
129void env_store(const char *str) { 144void 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}