diff options
author | netblue30 <netblue30@yahoo.com> | 2018-08-07 09:08:21 -0400 |
---|---|---|
committer | netblue30 <netblue30@yahoo.com> | 2018-08-07 09:08:21 -0400 |
commit | 2155203b3e01354c93d7cb68751f520704fcea1e (patch) | |
tree | 4017f17c91faf9c8dd8b2fc6a529601f4e95c4d1 /src | |
parent | xdg support: split xdg whitelist code in a different module (diff) | |
download | firejail-2155203b3e01354c93d7cb68751f520704fcea1e.tar.gz firejail-2155203b3e01354c93d7cb68751f520704fcea1e.tar.zst firejail-2155203b3e01354c93d7cb68751f520704fcea1e.zip |
xdg macro testing
Diffstat (limited to 'src')
-rw-r--r-- | src/firejail/fs_whitelist.c | 1 | ||||
-rw-r--r-- | src/firejail/macros.c | 123 |
2 files changed, 14 insertions, 110 deletions
diff --git a/src/firejail/fs_whitelist.c b/src/firejail/fs_whitelist.c index a2803ccbc..bfcf9c209 100644 --- a/src/firejail/fs_whitelist.c +++ b/src/firejail/fs_whitelist.c | |||
@@ -35,6 +35,7 @@ | |||
35 | #define EMPTY_STRING ("") | 35 | #define EMPTY_STRING ("") |
36 | #define MAXBUF 4098 | 36 | #define MAXBUF 4098 |
37 | 37 | ||
38 | // returns mallocated memory | ||
38 | char *parse_nowhitelist(int nowhitelist_flag, char *ptr1) { | 39 | char *parse_nowhitelist(int nowhitelist_flag, char *ptr1) { |
39 | char *rv; | 40 | char *rv; |
40 | if (nowhitelist_flag) { | 41 | if (nowhitelist_flag) { |
diff --git a/src/firejail/macros.c b/src/firejail/macros.c index f111802d7..ef8e0cd79 100644 --- a/src/firejail/macros.c +++ b/src/firejail/macros.c | |||
@@ -69,7 +69,7 @@ Macro macro[] = { | |||
69 | }; | 69 | }; |
70 | 70 | ||
71 | // return -1 if not found | 71 | // return -1 if not found |
72 | int macro_id(const char *name) { | 72 | static int macro_id(const char *name) { |
73 | int i = 0; | 73 | int i = 0; |
74 | while (macro[i].name != NULL) { | 74 | while (macro[i].name != NULL) { |
75 | if (strcmp(name, macro[i].name) == 0) | 75 | if (strcmp(name, macro[i].name) == 0) |
@@ -90,6 +90,7 @@ int is_macro(const char *name) { | |||
90 | return 0; | 90 | return 0; |
91 | } | 91 | } |
92 | 92 | ||
93 | // returns mallocated memory | ||
93 | static char *resolve_xdg(const char *var) { | 94 | static char *resolve_xdg(const char *var) { |
94 | char *fname; | 95 | char *fname; |
95 | struct stat s; | 96 | struct stat s; |
@@ -145,6 +146,7 @@ static char *resolve_xdg(const char *var) { | |||
145 | return NULL; | 146 | return NULL; |
146 | } | 147 | } |
147 | 148 | ||
149 | // returns mallocated memory | ||
148 | static char *resolve_hardcoded(char *entries[]) { | 150 | static char *resolve_hardcoded(char *entries[]) { |
149 | char *fname; | 151 | char *fname; |
150 | struct stat s; | 152 | struct stat s; |
@@ -156,7 +158,10 @@ static char *resolve_hardcoded(char *entries[]) { | |||
156 | 158 | ||
157 | if (stat(fname, &s) == 0) { | 159 | if (stat(fname, &s) == 0) { |
158 | free(fname); | 160 | free(fname); |
159 | return entries[i]; | 161 | char *rv = strdup(entries[i]); |
162 | if (!rv) | ||
163 | errExit("strdup"); | ||
164 | return rv; | ||
160 | } | 165 | } |
161 | free(fname); | 166 | free(fname); |
162 | i++; | 167 | i++; |
@@ -165,6 +170,7 @@ static char *resolve_hardcoded(char *entries[]) { | |||
165 | return NULL; | 170 | return NULL; |
166 | } | 171 | } |
167 | 172 | ||
173 | // returns mallocated memory | ||
168 | char *resolve_macro(const char *name) { | 174 | char *resolve_macro(const char *name) { |
169 | char *rv = NULL; | 175 | char *rv = NULL; |
170 | int id = macro_id(name); | 176 | int id = macro_id(name); |
@@ -223,121 +229,18 @@ char *expand_home(const char *path, const char *homedir) { | |||
223 | EUID_ROOT(); | 229 | EUID_ROOT(); |
224 | return new_name; | 230 | return new_name; |
225 | } | 231 | } |
226 | #if 0 | 232 | else { |
227 | else if (strncmp(path, "${DOWNLOADS}", 12) == 0) { | 233 | char *directory = resolve_macro(path); |
228 | char *tmp = resolve_xdg("XDG_DOWNLOAD_DIR=\"$HOME/", 24, "Downloads"); | 234 | if (directory) { |
229 | char *tmp2 = resolve_hardcoded(dentry, "Downloads"); | 235 | if (asprintf(&new_name, "%s/%s", cfg.homedir, directory) == -1) |
230 | if(tmp) { | ||
231 | if (asprintf(&new_name, "%s/%s%s", homedir, tmp, path + 12) == -1) | ||
232 | errExit("asprintf"); | ||
233 | if(called_as_root) | ||
234 | EUID_ROOT(); | ||
235 | return new_name; | ||
236 | } | ||
237 | else if(tmp2) { | ||
238 | if (asprintf(&new_name, "%s/%s%s", homedir, tmp2, path + 12) == -1) | ||
239 | errExit("asprintf"); | ||
240 | if(called_as_root) | ||
241 | EUID_ROOT(); | ||
242 | return new_name; | ||
243 | } | ||
244 | } | ||
245 | |||
246 | else if (strncmp(path, "${MUSIC}", 8) == 0) { | ||
247 | char *tmp = resolve_xdg("XDG_MUSIC_DIR=\"$HOME/", 21, "Music"); | ||
248 | char *tmp2 = resolve_hardcoded(mentry, "Music"); | ||
249 | if(tmp) { | ||
250 | if (asprintf(&new_name, "%s/%s%s", homedir, tmp, path + 8) == -1) | ||
251 | errExit("asprintf"); | ||
252 | if(called_as_root) | ||
253 | EUID_ROOT(); | ||
254 | return new_name; | ||
255 | } | ||
256 | else if(tmp2) { | ||
257 | if (asprintf(&new_name, "%s/%s%s", homedir, tmp2, path + 8) == -1) | ||
258 | errExit("asprintf"); | ||
259 | if(called_as_root) | ||
260 | EUID_ROOT(); | ||
261 | return new_name; | ||
262 | } | ||
263 | } | ||
264 | |||
265 | else if (strncmp(path, "${VIDEOS}", 9) == 0) { | ||
266 | char *tmp = resolve_xdg("XDG_VIDEOS_DIR=\"$HOME/", 22, "Videos"); | ||
267 | char *tmp2 = resolve_hardcoded(ventry, "Videos"); | ||
268 | if(tmp) { | ||
269 | if (asprintf(&new_name, "%s/%s%s", homedir, tmp, path + 9) == -1) | ||
270 | errExit("asprintf"); | ||
271 | if(called_as_root) | ||
272 | EUID_ROOT(); | ||
273 | return new_name; | ||
274 | } | ||
275 | else if(tmp2) { | ||
276 | if (asprintf(&new_name, "%s/%s%s", homedir, tmp2, path + 9) == -1) | ||
277 | errExit("asprintf"); | ||
278 | if(called_as_root) | ||
279 | EUID_ROOT(); | ||
280 | return new_name; | ||
281 | } | ||
282 | } | ||
283 | |||
284 | else if (strncmp(path, "${PICTURES}", 11) == 0) { | ||
285 | char *tmp = resolve_xdg("XDG_PICTURES_DIR=\"$HOME/", 24, "Pictures"); | ||
286 | char *tmp2 = resolve_hardcoded(pentry, "Pictures"); | ||
287 | if(tmp) { | ||
288 | if (asprintf(&new_name, "%s/%s%s", homedir, tmp, path + 11) == -1) | ||
289 | errExit("asprintf"); | ||
290 | if(called_as_root) | ||
291 | EUID_ROOT(); | ||
292 | return new_name; | ||
293 | } | ||
294 | else if(tmp2) { | ||
295 | if (asprintf(&new_name, "%s/%s%s", homedir, tmp2, path + 11) == -1) | ||
296 | errExit("asprintf"); | ||
297 | if(called_as_root) | ||
298 | EUID_ROOT(); | ||
299 | return new_name; | ||
300 | } | ||
301 | } | ||
302 | |||
303 | else if (strncmp(path, "${DESKTOP}", 10) == 0) { | ||
304 | char *tmp = resolve_xdg("XDG_DESKTOP_DIR=\"$HOME/", 24, "Desktop"); | ||
305 | char *tmp2 = resolve_hardcoded(deentry, "Desktop"); | ||
306 | if(tmp) { | ||
307 | if (asprintf(&new_name, "%s/%s%s", homedir, tmp, path + 10) == -1) | ||
308 | errExit("asprintf"); | ||
309 | if(called_as_root) | ||
310 | EUID_ROOT(); | ||
311 | return new_name; | ||
312 | } | ||
313 | else if(tmp2) { | ||
314 | if (asprintf(&new_name, "%s/%s%s", homedir, tmp2, path + 10) == -1) | ||
315 | errExit("asprintf"); | 236 | errExit("asprintf"); |
316 | if(called_as_root) | 237 | if(called_as_root) |
317 | EUID_ROOT(); | 238 | EUID_ROOT(); |
239 | free(directory); | ||
318 | return new_name; | 240 | return new_name; |
319 | } | 241 | } |
320 | } | 242 | } |
321 | 243 | ||
322 | else if (strncmp(path, "${DOCUMENTS}", 12) == 0) { | ||
323 | char *tmp = resolve_xdg("XDG_DOCUMENTS_DIR=\"$HOME/", 25, "Documents"); | ||
324 | char *tmp2 = resolve_hardcoded(doentry, "Documents"); | ||
325 | if(tmp) { | ||
326 | if (asprintf(&new_name, "%s/%s%s", homedir, tmp, path + 12) == -1) | ||
327 | errExit("asprintf"); | ||
328 | if(called_as_root) | ||
329 | EUID_ROOT(); | ||
330 | return new_name; | ||
331 | } | ||
332 | else if(tmp2) { | ||
333 | if (asprintf(&new_name, "%s/%s%s", homedir, tmp2, path + 12) == -1) | ||
334 | errExit("asprintf"); | ||
335 | if(called_as_root) | ||
336 | EUID_ROOT(); | ||
337 | return new_name; | ||
338 | } | ||
339 | } | ||
340 | #endif | ||
341 | char *rv = strdup(path); | 244 | char *rv = strdup(path); |
342 | if (!rv) | 245 | if (!rv) |
343 | errExit("strdup"); | 246 | errExit("strdup"); |