From b2671e94086fb123698a556e96c2a7ec1ceb6f36 Mon Sep 17 00:00:00 2001 From: netblue30 Date: Mon, 9 Nov 2015 06:49:12 -0500 Subject: fix for broken --tmpfs=/tmp --- src/firejail/fs.c | 99 ++++++++++++++++++++++++++----------------------------- 1 file changed, 47 insertions(+), 52 deletions(-) (limited to 'src') diff --git a/src/firejail/fs.c b/src/firejail/fs.c index ca44a2d5d..56aab8871 100644 --- a/src/firejail/fs.c +++ b/src/firejail/fs.c @@ -27,6 +27,35 @@ #include #include +static void create_empty_dir(void) { + struct stat s; + + if (stat(RO_DIR, &s)) { + /* coverity[toctou] */ + int rv = mkdir(RO_DIR, S_IRUSR | S_IXUSR); + if (rv == -1) + errExit("mkdir"); + if (chown(RO_DIR, 0, 0) < 0) + errExit("chown"); + } +} + +static void create_empty_file(void) { + struct stat s; + + if (stat(RO_FILE, &s)) { + /* coverity[toctou] */ + FILE *fp = fopen(RO_FILE, "w"); + if (!fp) + errExit("fopen"); + fclose(fp); + if (chown(RO_FILE, 0, 0) < 0) + errExit("chown"); + if (chmod(RO_FILE, S_IRUSR) < 0) + errExit("chown"); + } +} + // build /tmp/firejail directory void fs_build_firejail_dir(void) { struct stat s; @@ -49,6 +78,9 @@ void fs_build_firejail_dir(void) { exit(1); } } + + create_empty_dir(); + create_empty_file(); } @@ -126,47 +158,16 @@ typedef enum { } OPERATION; -static char *create_empty_dir(void) { - struct stat s; - fs_build_firejail_dir(); - - if (stat(RO_DIR, &s)) { - /* coverity[toctou] */ - int rv = mkdir(RO_DIR, S_IRUSR | S_IXUSR); - if (rv == -1) - errExit("mkdir"); - if (chown(RO_DIR, 0, 0) < 0) - errExit("chown"); - } - - return RO_DIR; -} -static char *create_empty_file(void) { - struct stat s; - fs_build_firejail_dir(); - - if (stat(RO_FILE, &s)) { - /* coverity[toctou] */ - FILE *fp = fopen(RO_FILE, "w"); - if (!fp) - errExit("fopen"); - fclose(fp); - if (chown(RO_FILE, 0, 0) < 0) - errExit("chown"); - if (chmod(RO_FILE, S_IRUSR) < 0) - errExit("chown"); - } - - return RO_FILE; -} -static void disable_file(OPERATION op, const char *filename, const char *emptydir, const char *emptyfile) { +static void disable_file(OPERATION op, const char *filename) { assert(filename); - assert(emptydir); - assert(emptyfile); assert(op d_name, "." ) == 0 || strcmp(dir->d_name, ".." ) == 0) continue; @@ -570,7 +565,7 @@ static void sanitize_home(void) { // name); // disable directory - disable_file(BLACKLIST_FILE, name, emptydir, "not used"); + disable_file(BLACKLIST_FILE, name); free(name); } } -- cgit v1.2.3-54-g00ecf