From: Yu Watanabe Date: Wed, 7 Dec 2022 00:51:30 +0000 (+0900) Subject: fs-util: make chmod_and_chown_at() work with empty path and AT_FDCWD X-Git-Tag: v253-rc1~333 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=340bc268c8a4e184424d0714002728dee4bab008;p=thirdparty%2Fsystemd.git fs-util: make chmod_and_chown_at() work with empty path and AT_FDCWD Follow-up for 7d000133c2fbf4b5986185ccfc0273a2428972a9. Fixes CID#1500608. --- diff --git a/src/basic/fs-util.c b/src/basic/fs-util.c index 33b4d1f07bf..fbc7492b152 100644 --- a/src/basic/fs-util.c +++ b/src/basic/fs-util.c @@ -204,9 +204,17 @@ int chmod_and_chown_at(int dir_fd, const char *path, mode_t mode, uid_t uid, gid fd = openat(dir_fd, path, O_PATH|O_CLOEXEC|O_NOFOLLOW); if (fd < 0) return -errno; + dir_fd = fd; + + } else if (dir_fd == AT_FDCWD) { + /* Let's acquire an O_PATH fd of the current directory */ + fd = openat(dir_fd, ".", O_PATH|O_CLOEXEC|O_NOFOLLOW|O_DIRECTORY); + if (fd < 0) + return -errno; + dir_fd = fd; } - return fchmod_and_chown(path ? fd : dir_fd, mode, uid, gid); + return fchmod_and_chown(dir_fd, mode, uid, gid); } int fchmod_and_chown_with_fallback(int fd, const char *path, mode_t mode, uid_t uid, gid_t gid) {