From 6ff94a82dfb8d040320e613af09393755e7de4fd Mon Sep 17 00:00:00 2001 From: Otavio Pontes Date: Wed, 14 Nov 2018 22:50:10 +0000 Subject: [PATCH] helpers: Don't enforce umask on mkdir_p, just force that when needed Swupd state dir should be masked as 700, but we can't mask all parent directories as 700. This is particularly a problem because /var and /var/lib/ shoudn't be 700, but /var/lib/swupd should. So creating all folders with current umask and using chmod syscall to set only the swupd statedir diretory to root only Also, stop using mkdir_p where are no longer needed Fixes #655 Signed-off-by: Otavio Pontes --- src/bundle.c | 2 +- src/helpers.c | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/bundle.c b/src/bundle.c index 5540f9ad..b3cb3156 100644 --- a/src/bundle.c +++ b/src/bundle.c @@ -428,7 +428,7 @@ static void track_installed(const char *bundle_name) * user installed themselves just copy the entire system tracking directory * into the state tracking directory. */ if (!is_populated_dir(dst)) { - ret = mkdir_p(dst); + ret = mkdir(dst, S_IRWXU); if (ret) { goto out; } diff --git a/src/helpers.c b/src/helpers.c index be339e66..5ecc6a4d 100644 --- a/src/helpers.c +++ b/src/helpers.c @@ -189,7 +189,7 @@ int copy_all(const char *src, const char *dst) int mkdir_p(const char *dir) { char *cmd; - string_or_die(&cmd, "umask 077 ; mkdir -p %s", dir); + string_or_die(&cmd, "mkdir -p %s", dir); int ret = system(cmd); free_string(&cmd); return ret; @@ -204,13 +204,19 @@ static int create_required_dirs(void) const char *state_dirs[] = { "delta", "staged", "download", "telemetry" }; // check for existence - ensure_root_owned_dir(state_dir); + if (ensure_root_owned_dir(state_dir)) { + //state dir doesn't exist + if (mkdir_p(state_dir) != 0 || chmod(state_dir, S_IRWXU) != 0) { + fprintf(stderr, "Error: failed to create %s\n", state_dir); + return -1; + } + } for (i = 0; i < STATE_DIR_COUNT; i++) { string_or_die(&dir, "%s/%s", state_dir, state_dirs[i]); ret = ensure_root_owned_dir(dir); if (ret) { - ret = mkdir_p(dir); + ret = mkdir(dir, S_IRWXU); if (ret) { fprintf(stderr, "Error: failed to create %s\n", dir); return -1;