From df7591d850176fc4d6e0def4e00a32f4cdb658f4 Mon Sep 17 00:00:00 2001 From: startx2017 Date: Wed, 17 Oct 2018 19:07:46 -0400 Subject: mainline merge: clean homedir pathname --- src/firejail/firejail.h | 1 + src/firejail/main.c | 5 ++--- src/firejail/util.c | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/firejail/firejail.h b/src/firejail/firejail.h index 91636b755..3e55139b3 100644 --- a/src/firejail/firejail.h +++ b/src/firejail/firejail.h @@ -479,6 +479,7 @@ int is_link(const char *fname); void trim_trailing_slash_or_dot(char *path); char *line_remove_spaces(const char *buf); char *split_comma(char *str); +char *clean_pathname(const char *path); void check_unsigned(const char *str, const char *msg); int find_child(pid_t parent, pid_t *child); void check_private_dir(void); diff --git a/src/firejail/main.c b/src/firejail/main.c index ba6b98191..bc5360ba7 100644 --- a/src/firejail/main.c +++ b/src/firejail/main.c @@ -212,9 +212,8 @@ static void init_cfg(int argc, char **argv) { // build home directory name cfg.homedir = NULL; if (pw->pw_dir != NULL) { - cfg.homedir = strdup(pw->pw_dir); - if (!cfg.homedir) - errExit("strdup"); + cfg.homedir = clean_pathname(pw->pw_dir); + assert(cfg.homedir); } else { fprintf(stderr, "Error: user %s doesn't have a user directory assigned\n", cfg.username); diff --git a/src/firejail/util.c b/src/firejail/util.c index 4a164901d..c1a680dd4 100644 --- a/src/firejail/util.c +++ b/src/firejail/util.c @@ -532,6 +532,39 @@ char *split_comma(char *str) { return ptr; } +// remove consecutive and trailing slashes +// and return allocated memory +// e.g. /home//user/ -> /home/user +char *clean_pathname(const char *path) { + assert(path); + size_t len = strlen(path); + char *rv = calloc(len + 1, 1); + if (!rv) + errExit("calloc"); + if (len > 0) { + int i, j, cnt; + for (i = 0, j = 0, cnt = 0; i < len; i++) { + if (path[i] == '/') + cnt++; + else + cnt = 0; + if (cnt < 2) { + rv[j] = path[i]; + j++; + } + } + // remove a trailing slash + if (j > 1 && rv[j - 1] == '/') + rv[j - 1] = '\0'; + size_t new_len = strlen(rv); + if (new_len < len) { + rv = realloc(rv, new_len + 1); + if (!rv) + errExit("realloc"); + } + } + return rv; +} void check_unsigned(const char *str, const char *msg) { EUID_ASSERT(); -- cgit v1.2.3-70-g09d2