aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLibravatar sarneaud <sarneaud@users.noreply.github.com>2015-08-29 09:35:47 +1000
committerLibravatar sarneaud <sarneaud@users.noreply.github.com>2015-08-29 09:47:46 +1000
commit7415d03df0362a08b4ccf405f8f98147c76e6329 (patch)
treec8bbe199b0eaa94aa4e9c6b6c883f2a40f1e4b27 /src
parentmore fixes for blacklist on Arch systems (diff)
downloadfirejail-7415d03df0362a08b4ccf405f8f98147c76e6329.tar.gz
firejail-7415d03df0362a08b4ccf405f8f98147c76e6329.tar.zst
firejail-7415d03df0362a08b4ccf405f8f98147c76e6329.zip
Rewrite globbing code to fix various minor issues
* Plug a memory leak. * Remove the short-circuit. (This breaks when someone uses [] or ? patterns without using *. I figure it's best to use the principle of least surprise and just let the system glob() implementation do what it does.) * Stop sorting results. I've also replaced a lot of disable-history.inc with a glob pattern. Now it catches files like .sqlite_history and whatever the user runs under rlwrap.
Diffstat (limited to 'src')
-rw-r--r--src/firejail/fs.c32
1 files changed, 18 insertions, 14 deletions
diff --git a/src/firejail/fs.c b/src/firejail/fs.c
index 1e74257eb..14b7c1f01 100644
--- a/src/firejail/fs.c
+++ b/src/firejail/fs.c
@@ -197,24 +197,28 @@ static void disable_file(OPERATION op, const char *filename, const char *emptydi
197 free(fname); 197 free(fname);
198} 198}
199 199
200static void globbing(OPERATION op, const char *fname, const char *emptydir, const char *emptyfile) { 200// Treat pattern as a shell glob pattern and blacklist matching files
201 assert(fname); 201static void globbing(OPERATION op, const char *pattern, const char *emptydir, const char *emptyfile) {
202 assert(pattern);
202 assert(emptydir); 203 assert(emptydir);
203 assert(emptyfile); 204 assert(emptyfile);
204 205
205 // filename globbing: expand * macro and continue processing for every single file 206 glob_t globbuf;
206 if (strchr(fname, '*')) { 207 // Profiles contain blacklists for files that might not exist on a user's machine.
207 glob_t globbuf; 208 // GLOB_NOCHECK makes that okay.
208 globbuf.gl_offs = 0; 209 int globerr = glob(pattern, GLOB_NOCHECK | GLOB_NOSORT, NULL, &globbuf);
209 glob(fname, GLOB_DOOFFS, NULL, &globbuf); 210 if (globerr) {
210 unsigned int i; 211 fprintf(stderr, "Error: failed to glob pattern %s\n", pattern);
211 for (i = 0; i < globbuf.gl_pathc; i++) { 212 return;
212 assert(globbuf.gl_pathv[i]);
213 disable_file(op, globbuf.gl_pathv[i], emptydir, emptyfile);
214 }
215 } 213 }
216 else 214
217 disable_file(op, fname, emptydir, emptyfile); 215 size_t i;
216 for (i = 0; i < globbuf.gl_pathc; i++) {
217 char* match = globbuf.gl_pathv[i];
218 assert(match);
219 disable_file(op, match, emptydir, emptyfile);
220 }
221 globfree(&globbuf);
218} 222}
219 223
220static void expand_path(OPERATION op, const char *path, const char *fname, const char *emptydir, const char *emptyfile) { 224static void expand_path(OPERATION op, const char *path, const char *fname, const char *emptydir, const char *emptyfile) {