aboutsummaryrefslogtreecommitdiffstats
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
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.
-rw-r--r--etc/disable-history.inc9
-rw-r--r--src/firejail/fs.c32
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
2blacklist ${HOME}/.history 2blacklist ${HOME}/.history
3blacklist ${HOME}/.bash_history 3blacklist ${HOME}/.*_history
4blacklist ${HOME}/.zsh_history
5blacklist ${HOME}/.ksh_history
6blacklist ${HOME}/.sh_history
7blacklist ${HOME}/.nano_history
8blacklist ${HOME}/.python_history
9blacklist ${HOME}/.mysql_history
10blacklist ${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
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) {