diff options
author | 2015-08-29 09:35:47 +1000 | |
---|---|---|
committer | 2015-08-29 09:47:46 +1000 | |
commit | 7415d03df0362a08b4ccf405f8f98147c76e6329 (patch) | |
tree | c8bbe199b0eaa94aa4e9c6b6c883f2a40f1e4b27 | |
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.
-rw-r--r-- | etc/disable-history.inc | 9 | ||||
-rw-r--r-- | src/firejail/fs.c | 32 |
2 files changed, 19 insertions, 22 deletions
diff --git a/etc/disable-history.inc b/etc/disable-history.inc index 66261c1cf..7a91df828 100644 --- a/etc/disable-history.inc +++ b/etc/disable-history.inc | |||
@@ -1,10 +1,3 @@ | |||
1 | # History files in $HOME | 1 | # History files in $HOME |
2 | blacklist ${HOME}/.history | 2 | blacklist ${HOME}/.history |
3 | blacklist ${HOME}/.bash_history | 3 | blacklist ${HOME}/.*_history |
4 | blacklist ${HOME}/.zsh_history | ||
5 | blacklist ${HOME}/.ksh_history | ||
6 | blacklist ${HOME}/.sh_history | ||
7 | blacklist ${HOME}/.nano_history | ||
8 | blacklist ${HOME}/.python_history | ||
9 | blacklist ${HOME}/.mysql_history | ||
10 | blacklist ${HOME}/.pgsql_history \ No newline at end of file | ||
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) { |