From: Lennart Poettering Date: Thu, 21 Oct 2021 08:21:03 +0000 (+0200) Subject: fd-util: when re-opening a directory with fd_reopen() go via openat(…, ".", …) X-Git-Tag: v250-rc1~449^2~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b4f73d1e1774b4512d0e396b7060f2a2ff5f0fe3;p=thirdparty%2Fsystemd.git fd-util: when re-opening a directory with fd_reopen() go via openat(…, ".", …) This adds a tiny shortcut to fd_reopen(): if we are about to reopen the fd via O_DIRECTORY then we know it#s a directory and we might as well reopen it via opening "." using the fd as "at fd" in openat(). This has the benefit that we don't need /proc/self/fd/ around for this special case: fewer sources of errors. --- diff --git a/src/basic/fd-util.c b/src/basic/fd-util.c index d7cf85e0ee8..cf6742c2b31 100644 --- a/src/basic/fd-util.c +++ b/src/basic/fd-util.c @@ -654,6 +654,16 @@ int fd_reopen(int fd, int flags) { * * This implicitly resets the file read index to 0. */ + if (FLAGS_SET(flags, O_DIRECTORY)) { + /* If we shall reopen the fd as directory we can just go via "." and thus bypass the whole + * magic /proc/ directory, and make ourselves independent of that being mounted. */ + new_fd = openat(fd, ".", flags); + if (new_fd < 0) + return -errno; + + return new_fd; + } + new_fd = open(FORMAT_PROC_FD_PATH(fd), flags); if (new_fd < 0) { if (errno != ENOENT)