From aadd5c92cd8c8dc6370b1e321ce6a7b77bb4b032 Mon Sep 17 00:00:00 2001 From: smitsohu Date: Mon, 18 Oct 2021 17:36:49 +0200 Subject: readability --- src/firejail/firejail.h | 1 + src/firejail/util.c | 72 ++++++++++++++++++++++++++++--------------------- 2 files changed, 42 insertions(+), 31 deletions(-) diff --git a/src/firejail/firejail.h b/src/firejail/firejail.h index 5bebec185..13b7b9523 100644 --- a/src/firejail/firejail.h +++ b/src/firejail/firejail.h @@ -519,6 +519,7 @@ void touch_file_as_user(const char *fname, mode_t mode); int is_dir(const char *fname); int is_link(const char *fname); char *realpath_as_user(const char *fname); +ssize_t readlink_as_user(const char *fname, char *buf, size_t sz); int stat_as_user(const char *fname, struct stat *s); int lstat_as_user(const char *fname, struct stat *s); void trim_trailing_slash_or_dot(char *path); diff --git a/src/firejail/util.c b/src/firejail/util.c index 53c76db6d..55dcdc246 100644 --- a/src/firejail/util.c +++ b/src/firejail/util.c @@ -484,13 +484,6 @@ int is_link(const char *fname) { if (*fname == '\0') return 0; - int called_as_root = 0; - if (geteuid() == 0) - called_as_root = 1; - - if (called_as_root) - EUID_USER(); - // remove trailing '/' if any char *tmp = strdup(fname); if (!tmp) @@ -498,12 +491,9 @@ int is_link(const char *fname) { trim_trailing_slash_or_dot(tmp); char c; - ssize_t rv = readlink(tmp, &c, 1); + ssize_t rv = readlink_as_user(tmp, &c, 1); free(tmp); - if (called_as_root) - EUID_ROOT(); - return (rv != -1); } @@ -525,6 +515,24 @@ char *realpath_as_user(const char *fname) { return rv; } +ssize_t readlink_as_user(const char *fname, char *buf, size_t sz) { + assert(fname && buf && sz); + + int called_as_root = 0; + if (geteuid() == 0) + called_as_root = 1; + + if (called_as_root) + EUID_USER(); + + ssize_t rv = readlink(fname, buf, sz); + + if (called_as_root) + EUID_ROOT(); + + return rv; +} + int stat_as_user(const char *fname, struct stat *s) { assert(fname); @@ -997,31 +1005,33 @@ int create_empty_dir_as_user(const char *dir, mode_t mode) { assert(dir); mode &= 07777; - if (access(dir, F_OK) != 0) { + if (access(dir, F_OK) == 0) + return 0; + + pid_t child = fork(); + if (child < 0) + errExit("fork"); + if (child == 0) { + // drop privileges + drop_privs(0); + if (arg_debug) printf("Creating empty %s directory\n", dir); - pid_t child = fork(); - if (child < 0) - errExit("fork"); - if (child == 0) { - // drop privileges - drop_privs(0); - - if (mkdir(dir, mode) == 0) { - int err = chmod(dir, mode); - (void) err; - } - else if (arg_debug) - printf("Directory %s not created: %s\n", dir, strerror(errno)); + if (mkdir(dir, mode) == 0) { + int err = chmod(dir, mode); + (void) err; + } + else if (arg_debug) + printf("Directory %s not created: %s\n", dir, strerror(errno)); - __gcov_flush(); + __gcov_flush(); - _exit(0); - } - waitpid(child, NULL, 0); - if (access(dir, F_OK) == 0) - return 1; + _exit(0); } + waitpid(child, NULL, 0); + + if (access(dir, F_OK) == 0) + return 1; return 0; } -- cgit v1.2.3-70-g09d2