From e837c257d07b014d1b9e516bd80352c5a1f31eaf Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 9 Dec 2024 13:50:48 +0100 Subject: [PATCH] chattr-util: move O_PATH conversion from read_attr_at() to read_attr_fd() --- src/basic/chattr-util.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/basic/chattr-util.c b/src/basic/chattr-util.c index 9677e9a35a..4aabcc6818 100644 --- a/src/basic/chattr-util.c +++ b/src/basic/chattr-util.c @@ -145,6 +145,11 @@ int read_attr_fd(int fd, unsigned *ret) { if (!S_ISDIR(st.st_mode) && !S_ISREG(st.st_mode)) return -ENOTTY; + _cleanup_close_ int fd_close = -EBADF; + fd = fd_reopen_condition(fd, O_RDONLY|O_CLOEXEC|O_NOCTTY, O_PATH, &fd_close); /* drop O_PATH if it is set */ + if (fd < 0) + return fd; + return RET_NERRNO(ioctl(fd, FS_IOC_GETFLAGS, ret)); } @@ -155,11 +160,9 @@ int read_attr_at(int dir_fd, const char *path, unsigned *ret) { assert(dir_fd >= 0 || dir_fd == AT_FDCWD); assert(ret); - if (isempty(path)) { - fd = fd_reopen_condition(dir_fd, O_RDONLY|O_CLOEXEC|O_NOCTTY, O_PATH, &fd_close); /* drop O_PATH if it is set */ - if (fd < 0) - return fd; - } else { + if (isempty(path) && dir_fd != AT_FDCWD) + fd = dir_fd; + else { fd_close = xopenat(dir_fd, path, O_RDONLY|O_CLOEXEC|O_NOCTTY|O_NOFOLLOW); if (fd_close < 0) return fd_close;