diff options
author | sarneaud <sarneaud@users.noreply.github.com> | 2015-08-29 09:35:47 +1000 |
---|---|---|
committer | sarneaud <sarneaud@users.noreply.github.com> | 2015-08-29 09:47:46 +1000 |
commit | 7415d03df0362a08b4ccf405f8f98147c76e6329 (patch) | |
tree | c8bbe199b0eaa94aa4e9c6b6c883f2a40f1e4b27 /src | |
parent | more fixes for blacklist on Arch systems (diff) | |
download | firejail-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.c | 32 |
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 | ||
200 | static 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); | 201 | static 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 | ||
220 | static void expand_path(OPERATION op, const char *path, const char *fname, const char *emptydir, const char *emptyfile) { | 224 | static void expand_path(OPERATION op, const char *path, const char *fname, const char *emptydir, const char *emptyfile) { |