aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLibravatar netblue30 <netblue30@yahoo.com>2018-08-07 09:08:21 -0400
committerLibravatar netblue30 <netblue30@yahoo.com>2018-08-07 09:08:21 -0400
commit2155203b3e01354c93d7cb68751f520704fcea1e (patch)
tree4017f17c91faf9c8dd8b2fc6a529601f4e95c4d1 /src
parentxdg support: split xdg whitelist code in a different module (diff)
downloadfirejail-2155203b3e01354c93d7cb68751f520704fcea1e.tar.gz
firejail-2155203b3e01354c93d7cb68751f520704fcea1e.tar.zst
firejail-2155203b3e01354c93d7cb68751f520704fcea1e.zip
xdg macro testing
Diffstat (limited to 'src')
-rw-r--r--src/firejail/fs_whitelist.c1
-rw-r--r--src/firejail/macros.c123
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
38char *parse_nowhitelist(int nowhitelist_flag, char *ptr1) { 39char *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
72int macro_id(const char *name) { 72static 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
93static char *resolve_xdg(const char *var) { 94static 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
148static char *resolve_hardcoded(char *entries[]) { 150static 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
168char *resolve_macro(const char *name) { 174char *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");