From 11659e4830d745c901a4657e8ac883eabd0d4a88 Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Fri, 24 Mar 2023 20:17:03 +0100 Subject: [PATCH 1/4] chase: Fix formatting --- src/basic/chase.c | 103 ++++++---------------------------------------- 1 file changed, 13 insertions(+), 90 deletions(-) diff --git a/src/basic/chase.c b/src/basic/chase.c index 4b8edefcab..68b36c26ad 100644 --- a/src/basic/chase.c +++ b/src/basic/chase.c @@ -72,13 +72,7 @@ static int log_prohibited_symlink(int fd, ChaseFlags flags) { strna(n1)); } -int chaseat( - int dir_fd, - const char *path, - ChaseFlags flags, - char **ret_path, - int *ret_fd) { - +int chaseat(int dir_fd, const char *path, ChaseFlags flags, char **ret_path, int *ret_fd) { _cleanup_free_ char *buffer = NULL, *done = NULL; _cleanup_close_ int fd = -EBADF, root_fd = -EBADF; unsigned max_follow = CHASE_MAX; /* how many symlinks to follow before giving up and returning ELOOP */ @@ -468,13 +462,7 @@ chased_one: return 0; } -int chase( - const char *path, - const char *original_root, - ChaseFlags flags, - char **ret_path, - int *ret_fd) { - +int chase(const char *path, const char *original_root, ChaseFlags flags, char **ret_path, int *ret_fd) { _cleanup_free_ char *root = NULL, *absolute = NULL, *p = NULL; _cleanup_close_ int fd = -EBADF, pfd = -EBADF; int r; @@ -558,13 +546,7 @@ int chase( return r; } -int chase_and_open( - const char *path, - const char *root, - ChaseFlags chase_flags, - int open_flags, - char **ret_path) { - +int chase_and_open(const char *path, const char *root, ChaseFlags chase_flags, int open_flags, char **ret_path) { _cleanup_close_ int path_fd = -EBADF; _cleanup_free_ char *p = NULL, *fname = NULL; mode_t mode = open_flags & O_DIRECTORY ? 0755 : 0644; @@ -606,13 +588,7 @@ int chase_and_open( return r; } -int chase_and_opendir( - const char *path, - const char *root, - ChaseFlags chase_flags, - char **ret_path, - DIR **ret_dir) { - +int chase_and_opendir(const char *path, const char *root, ChaseFlags chase_flags, char **ret_path, DIR **ret_dir) { _cleanup_close_ int path_fd = -EBADF; _cleanup_free_ char *p = NULL; DIR *d; @@ -648,13 +624,7 @@ int chase_and_opendir( return 0; } -int chase_and_stat( - const char *path, - const char *root, - ChaseFlags chase_flags, - char **ret_path, - struct stat *ret_stat) { - +int chase_and_stat(const char *path, const char *root, ChaseFlags chase_flags, char **ret_path, struct stat *ret_stat) { _cleanup_close_ int path_fd = -EBADF; _cleanup_free_ char *p = NULL; int r; @@ -683,13 +653,7 @@ int chase_and_stat( return 0; } -int chase_and_access( - const char *path, - const char *root, - ChaseFlags chase_flags, - int access_mode, - char **ret_path) { - +int chase_and_access(const char *path, const char *root, ChaseFlags chase_flags, int access_mode, char **ret_path) { _cleanup_close_ int path_fd = -EBADF; _cleanup_free_ char *p = NULL; int r; @@ -753,13 +717,7 @@ int chase_and_fopen_unlocked( return 0; } -int chase_and_unlink( - const char *path, - const char *root, - ChaseFlags chase_flags, - int unlink_flags, - char **ret_path) { - +int chase_and_unlink(const char *path, const char *root, ChaseFlags chase_flags, int unlink_flags, char **ret_path) { _cleanup_free_ char *p = NULL, *fname = NULL; _cleanup_close_ int fd = -EBADF; int r; @@ -796,13 +754,7 @@ int chase_and_open_parent(const char *path, const char *root, ChaseFlags chase_f return pfd; } -int chase_and_openat( - int dir_fd, - const char *path, - ChaseFlags chase_flags, - int open_flags, - char **ret_path) { - +int chase_and_openat(int dir_fd, const char *path, ChaseFlags chase_flags, int open_flags, char **ret_path) { _cleanup_close_ int path_fd = -EBADF; _cleanup_free_ char *p = NULL, *fname = NULL; mode_t mode = open_flags & O_DIRECTORY ? 0755 : 0644; @@ -838,13 +790,7 @@ int chase_and_openat( return r; } -int chase_and_opendirat( - int dir_fd, - const char *path, - ChaseFlags chase_flags, - char **ret_path, - DIR **ret_dir) { - +int chase_and_opendirat(int dir_fd, const char *path, ChaseFlags chase_flags, char **ret_path, DIR **ret_dir) { _cleanup_close_ int path_fd = -EBADF; _cleanup_free_ char *p = NULL; DIR *d; @@ -880,13 +826,7 @@ int chase_and_opendirat( return 0; } -int chase_and_statat( - int dir_fd, - const char *path, - ChaseFlags chase_flags, - char **ret_path, - struct stat *ret_stat) { - +int chase_and_statat(int dir_fd, const char *path, ChaseFlags chase_flags, char **ret_path, struct stat *ret_stat) { _cleanup_close_ int path_fd = -EBADF; _cleanup_free_ char *p = NULL; int r; @@ -915,13 +855,7 @@ int chase_and_statat( return 0; } -int chase_and_accessat( - int dir_fd, - const char *path, - ChaseFlags chase_flags, - int access_mode, - char **ret_path) { - +int chase_and_accessat(int dir_fd, const char *path, ChaseFlags chase_flags, int access_mode, char **ret_path) { _cleanup_close_ int path_fd = -EBADF; _cleanup_free_ char *p = NULL; int r; @@ -985,13 +919,7 @@ int chase_and_fopenat_unlocked( return 0; } -int chase_and_unlinkat( - int dir_fd, - const char *path, - ChaseFlags chase_flags, - int unlink_flags, - char **ret_path) { - +int chase_and_unlinkat(int dir_fd, const char *path, ChaseFlags chase_flags, int unlink_flags, char **ret_path) { _cleanup_free_ char *p = NULL, *fname = NULL; _cleanup_close_ int fd = -EBADF; int r; @@ -1016,12 +944,7 @@ int chase_and_unlinkat( return 0; } -int chase_and_open_parent_at( - int dir_fd, - const char *path, - ChaseFlags chase_flags, - char **ret_filename) { - +int chase_and_open_parent_at(int dir_fd, const char *path, ChaseFlags chase_flags, char **ret_filename) { int pfd, r; assert(!(chase_flags & (CHASE_NONEXISTENT|CHASE_STEP))); From 16859751ca0d93073cd7c167d08374703e54f427 Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Fri, 24 Mar 2023 20:47:41 +0100 Subject: [PATCH 2/4] chase: Fix error code check --- src/basic/chase.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/basic/chase.c b/src/basic/chase.c index 68b36c26ad..17e5dd72b4 100644 --- a/src/basic/chase.c +++ b/src/basic/chase.c @@ -774,10 +774,10 @@ int chase_and_openat(int dir_fd, const char *path, ChaseFlags chase_flags, int o return r; r = path_extract_filename(p, &fname); - if (r < 0 && r != -EDESTADDRREQ) + if (r < 0 && r != -EADDRNOTAVAIL) return r; - if (FLAGS_SET(chase_flags, CHASE_PARENT) || r == -EDESTADDRREQ) + if (FLAGS_SET(chase_flags, CHASE_PARENT) || r == -EADDRNOTAVAIL) r = fd_reopen(path_fd, open_flags); else r = xopenat(path_fd, fname, open_flags|O_NOFOLLOW, mode); From fedceeba2eb936286b79ba6f6c1a6067c82b3ec5 Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Fri, 24 Mar 2023 20:48:23 +0100 Subject: [PATCH 3/4] fs-util: Strip O_NOFOLLOW in xopenat() when calling fd_reopen() We definitely want to follow symlinks when calling fd_reopen() so let's strip O_NOFOLLOW when we call it from xopenat(). --- src/basic/fs-util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/basic/fs-util.c b/src/basic/fs-util.c index 257c11ad71..cb323a6403 100644 --- a/src/basic/fs-util.c +++ b/src/basic/fs-util.c @@ -1106,7 +1106,7 @@ int xopenat(int dir_fd, const char *path, int flags, mode_t mode) { if (isempty(path)) { assert(!FLAGS_SET(flags, O_CREAT|O_EXCL)); - return fd_reopen(dir_fd, flags); + return fd_reopen(dir_fd, flags & ~O_NOFOLLOW); } if (FLAGS_SET(flags, O_DIRECTORY|O_CREAT)) { From 708e88704b970814092c216fe14c5f0e1bf09fdf Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Fri, 24 Mar 2023 20:50:48 +0100 Subject: [PATCH 4/4] chase: Simplify chase_and_open() and chase_and_openat() xopenat() now calls fd_reopen() if an empty path is specified, so let's make use of that to simplify the chase open helpers. --- src/basic/chase.c | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/basic/chase.c b/src/basic/chase.c index 17e5dd72b4..c2a914521a 100644 --- a/src/basic/chase.c +++ b/src/basic/chase.c @@ -571,14 +571,13 @@ int chase_and_open(const char *path, const char *root, ChaseFlags chase_flags, i if (isempty(q)) q = "."; - r = path_extract_filename(q, &fname); - if (r < 0 && r != -EADDRNOTAVAIL) - return r; + if (!FLAGS_SET(chase_flags, CHASE_PARENT)) { + r = path_extract_filename(q, &fname); + if (r < 0 && r != -EADDRNOTAVAIL) + return r; + } - if (FLAGS_SET(chase_flags, CHASE_PARENT) || r == -EADDRNOTAVAIL) - r = fd_reopen(path_fd, open_flags); - else - r = xopenat(path_fd, fname, open_flags|O_NOFOLLOW, mode); + r = xopenat(path_fd, strempty(fname), open_flags|O_NOFOLLOW, mode); if (r < 0) return r; @@ -773,14 +772,13 @@ int chase_and_openat(int dir_fd, const char *path, ChaseFlags chase_flags, int o if (r < 0) return r; - r = path_extract_filename(p, &fname); - if (r < 0 && r != -EADDRNOTAVAIL) - return r; + if (!FLAGS_SET(chase_flags, CHASE_PARENT)) { + r = path_extract_filename(p, &fname); + if (r < 0 && r != -EADDRNOTAVAIL) + return r; + } - if (FLAGS_SET(chase_flags, CHASE_PARENT) || r == -EADDRNOTAVAIL) - r = fd_reopen(path_fd, open_flags); - else - r = xopenat(path_fd, fname, open_flags|O_NOFOLLOW, mode); + r = xopenat(path_fd, strempty(fname), open_flags|O_NOFOLLOW, mode); if (r < 0) return r;