From 07862c9fc2becdc4bbe112b023591d2ab2dd032b Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Mon, 26 Aug 2024 14:14:07 +0200 Subject: [PATCH] chattr-util: Optimize read_attr_at() Let's make sure we only reopen O_PATH file descriptors. --- src/basic/chattr-util.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/basic/chattr-util.c b/src/basic/chattr-util.c index 49831a26ce..13d46f26aa 100644 --- a/src/basic/chattr-util.c +++ b/src/basic/chattr-util.c @@ -149,14 +149,23 @@ int read_attr_fd(int fd, unsigned *ret) { } int read_attr_at(int dir_fd, const char *path, unsigned *ret) { - _cleanup_close_ int fd = -EBADF; + _cleanup_close_ int fd_close = -EBADF; + int fd; assert(dir_fd >= 0 || dir_fd == AT_FDCWD); assert(ret); - fd = xopenat(dir_fd, path, O_RDONLY|O_CLOEXEC|O_NOCTTY|O_NOFOLLOW); - if (fd < 0) - return fd; + if (isempty(path)) { + fd = fd_reopen_condition(dir_fd, O_RDONLY|O_CLOEXEC, O_PATH, &fd_close); /* drop O_PATH if it is set */ + if (fd < 0) + return fd; + } else { + fd_close = xopenat(dir_fd, path, O_RDONLY|O_CLOEXEC|O_NOCTTY|O_NOFOLLOW); + if (fd_close < 0) + return fd_close; + + fd = fd_close; + } return read_attr_fd(fd, ret); } -- 2.25.1