From 8b9c56ba3e0ddfdb4bd51e3f536d2199a80d4fa3 Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Fri, 11 Nov 2022 09:50:19 +0100 Subject: [PATCH 1/6] tmpfile-util: Add missing assert --- src/basic/tmpfile-util.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/basic/tmpfile-util.c b/src/basic/tmpfile-util.c index e0e58472d3..909057429d 100644 --- a/src/basic/tmpfile-util.c +++ b/src/basic/tmpfile-util.c @@ -25,6 +25,8 @@ int fopen_temporary_at(int dir_fd, const char *path, FILE **ret_file, char **ret _cleanup_close_ int fd = -1; int r; + assert(dir_fd >= 0 || dir_fd == AT_FDCWD); + if (path) { r = tempfn_random(path, NULL, &t); if (r < 0) From 8c39e281914e19563229cd57549fa0202f883945 Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Fri, 11 Nov 2022 09:50:50 +0100 Subject: [PATCH 2/6] path-util: Drop path_make_relative_cwd() Function is unused --- src/basic/path-util.c | 27 --------------------------- src/basic/path-util.h | 1 - 2 files changed, 28 deletions(-) diff --git a/src/basic/path-util.c b/src/basic/path-util.c index f6c2d662b2..bf93990fde 100644 --- a/src/basic/path-util.c +++ b/src/basic/path-util.c @@ -221,33 +221,6 @@ int path_make_relative_parent(const char *from_child, const char *to, char **ret return path_make_relative(from, to, ret); } -int path_make_relative_cwd(const char *p, char **ret) { - char *c; - int r; - - assert(p); - assert(ret); - - if (path_is_absolute(p)) { - _cleanup_free_ char *cwd = NULL; - - r = safe_getcwd(&cwd); - if (r < 0) - return r; - - r = path_make_relative(cwd, p, &c); - if (r < 0) - return r; - } else { - c = strdup(p); - if (!c) - return -ENOMEM; - } - - *ret = TAKE_PTR(c); - return 0; -} - char* path_startswith_strv(const char *p, char **set) { STRV_FOREACH(s, set) { char *t; diff --git a/src/basic/path-util.h b/src/basic/path-util.h index f93455df3b..22d3632e6e 100644 --- a/src/basic/path-util.h +++ b/src/basic/path-util.h @@ -62,7 +62,6 @@ int safe_getcwd(char **ret); int path_make_absolute_cwd(const char *p, char **ret); int path_make_relative(const char *from, const char *to, char **ret); int path_make_relative_parent(const char *from_child, const char *to, char **ret); -int path_make_relative_cwd(const char *from, char **ret); char *path_startswith_full(const char *path, const char *prefix, bool accept_dot_dot) _pure_; static inline char* path_startswith(const char *path, const char *prefix) { return path_startswith_full(path, prefix, true); From c2fc5890e39e67681e42814267231c6e0091cc3b Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Fri, 11 Nov 2022 09:52:12 +0100 Subject: [PATCH 3/6] chase-symlinks: Drop unnecessary if --- src/basic/chase-symlinks.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/basic/chase-symlinks.c b/src/basic/chase-symlinks.c index a0d29427d3..82568197c0 100644 --- a/src/basic/chase-symlinks.c +++ b/src/basic/chase-symlinks.c @@ -442,9 +442,7 @@ int chase_symlinks( SYNTHETIC_ERRNO(ECHRNG), "Specified path '%s' is outside of specified root directory '%s', refusing to resolve.", absolute, root); - } - if (root) { fd = open(root, O_CLOEXEC|O_DIRECTORY|O_PATH); if (fd < 0) return -errno; From 7d000133c2fbf4b5986185ccfc0273a2428972a9 Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Fri, 11 Nov 2022 09:59:25 +0100 Subject: [PATCH 4/6] fs-util: Add missing assert to chmod_and_chown_at() --- src/basic/fs-util.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/basic/fs-util.c b/src/basic/fs-util.c index c70926c12c..4d24cd59de 100644 --- a/src/basic/fs-util.c +++ b/src/basic/fs-util.c @@ -197,6 +197,8 @@ int readlink_and_make_absolute(const char *p, char **r) { int chmod_and_chown_at(int dir_fd, const char *path, mode_t mode, uid_t uid, gid_t gid) { _cleanup_close_ int fd = -1; + assert(dir_fd >= 0 || dir_fd == AT_FDCWD); + if (path) { /* Let's acquire an O_PATH fd, as precaution to change mode/owner on the same file */ fd = openat(dir_fd, path, O_PATH|O_CLOEXEC|O_NOFOLLOW); From c9a1202ecbcf76fb71b140e23e3c08038b38e846 Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Fri, 11 Nov 2022 10:04:37 +0100 Subject: [PATCH 5/6] test-copy: Stop using rm_rf_physical_and_close This cleanup function depends on resolving fd's to paths via /proc which is unreliable so we shouldn't depend on it for destructive operations. Use regular path based cleanup instead. --- src/test/test-copy.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/test/test-copy.c b/src/test/test-copy.c index 00a38b18f6..6ad157ef1c 100644 --- a/src/test/test-copy.c +++ b/src/test/test-copy.c @@ -77,11 +77,12 @@ TEST(copy_tree_replace_file) { } TEST(copy_tree_replace_dirs) { - _cleanup_(rm_rf_physical_and_closep) int src = -1, dst = -1; + _cleanup_(rm_rf_physical_and_freep) char *srcp = NULL, *dstp = NULL; + _cleanup_close_ int src = -1, dst = -1; /* Create the random source/destination directories */ - assert_se((src = mkdtemp_open(NULL, 0, NULL)) >= 0); - assert_se((dst = mkdtemp_open(NULL, 0, NULL)) >= 0); + assert_se((src = mkdtemp_open(NULL, 0, &srcp)) >= 0); + assert_se((dst = mkdtemp_open(NULL, 0, &dstp)) >= 0); /* Populate some data to differentiate the files. */ assert_se(write_string_file_at(src, "foo", "src file 1", WRITE_STRING_FILE_CREATE) >= 0); From cc085ec65f01084664df4aab7a6b9c582511df97 Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Fri, 11 Nov 2022 10:05:32 +0100 Subject: [PATCH 6/6] Revert "rm-rf: Add rm_rf_physical_and_close()" This reverts commit 56e2bceddc7383c4abe1ef0110192e491c729de4. Doing destructive cleanup operations via unreliable /proc path lookups is unsafe and should be avoided so let's remove this function. --- src/shared/rm-rf.h | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/shared/rm-rf.h b/src/shared/rm-rf.h index 86d3e57b0e..24fd9a2aa2 100644 --- a/src/shared/rm-rf.h +++ b/src/shared/rm-rf.h @@ -5,7 +5,6 @@ #include "alloc-util.h" #include "errno-util.h" -#include "fd-util.h" typedef enum RemoveFlags { REMOVE_ONLY_DIRECTORIES = 1 << 0, /* Only remove empty directories, no files */ @@ -52,19 +51,3 @@ static inline char *rm_rf_subvolume_and_free(char *p) { return mfree(p); } DEFINE_TRIVIAL_CLEANUP_FUNC(char*, rm_rf_subvolume_and_free); - -static inline int rm_rf_physical_and_close(int fd) { - _cleanup_free_ char *p = NULL; - - if (fd < 0) - return -1; - - if (fd_get_path(fd, &p) < 0) - return safe_close(fd); - - safe_close(fd); - (void) rm_rf(p, REMOVE_ROOT|REMOVE_PHYSICAL|REMOVE_MISSING_OK|REMOVE_CHMOD); - - return -1; -} -DEFINE_TRIVIAL_CLEANUP_FUNC(int, rm_rf_physical_and_close);