From: Mike Yuan Date: Thu, 29 Jan 2026 10:27:40 +0000 (+0100) Subject: fd-util: add generic resolve_xat_fdroot() X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=539e2b75aabe8daf0baea65a346ee44584954914;p=thirdparty%2Fsystemd.git fd-util: add generic resolve_xat_fdroot() As suggested in https://github.com/systemd/systemd/pull/40500#discussion_r2740921215 --- diff --git a/src/basic/fd-util.c b/src/basic/fd-util.c index f80ce0ae470..197d015f37e 100644 --- a/src/basic/fd-util.c +++ b/src/basic/fd-util.c @@ -1105,6 +1105,32 @@ int fds_are_same_mount(int fd1, int fd2) { return statx_inode_same(&sx1, &sx2) && statx_mount_same(&sx1, &sx2); } +int resolve_xat_fdroot(int *fd, const char **path, char **ret_buffer) { + assert(fd); + assert(path); + assert(ret_buffer); + + if (*fd != XAT_FDROOT) { + *ret_buffer = NULL; + return 0; + } + + if (isempty(*path)) { + *path = "/"; + *ret_buffer = NULL; + } else if (!path_is_absolute(*path)) { + char *p = strjoin("/", *path); + if (!p) + return -ENOMEM; + + *path = *ret_buffer = p; + } + + *fd = AT_FDCWD; + + return 1; +} + char* format_proc_fd_path(char buf[static PROC_FD_PATH_MAX], int fd) { assert(buf); assert(fd >= 0); diff --git a/src/basic/fd-util.h b/src/basic/fd-util.h index 707445d73d8..ee1dc870df8 100644 --- a/src/basic/fd-util.h +++ b/src/basic/fd-util.h @@ -181,6 +181,8 @@ static inline int dir_fd_is_root_or_cwd(int dir_fd) { int fds_are_same_mount(int fd1, int fd2); +int resolve_xat_fdroot(int *fd, const char **path, char **ret_buffer); + /* The maximum length a buffer for a /proc/self/fd/ path needs */ #define PROC_FD_PATH_MAX \ (STRLEN("/proc/self/fd/") + DECIMAL_STR_MAX(int)) diff --git a/src/basic/stat-util.c b/src/basic/stat-util.c index 6d1796c315b..2e2f929fc08 100644 --- a/src/basic/stat-util.c +++ b/src/basic/stat-util.c @@ -36,19 +36,9 @@ static int verify_stat_at( assert(verify_func); _cleanup_free_ char *p = NULL; - if (fd == XAT_FDROOT) { - fd = AT_FDCWD; - - if (isempty(path)) - path = "/"; - else if (!path_is_absolute(path)) { - p = strjoin("/", path); - if (!p) - return -ENOMEM; - - path = p; - } - } + r = resolve_xat_fdroot(&fd, &path, &p); + if (r < 0) + return r; if (fstatat(fd, strempty(path), &st, (isempty(path) ? AT_EMPTY_PATH : 0) | (follow ? 0 : AT_SYMLINK_NOFOLLOW)) < 0)