From e115daa6a8f0cc80591228e4c6f651b9afc66b30 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 30 Mar 2023 13:15:59 +0900 Subject: [PATCH 1/2] chase: drop CHASE_AT_RESOLVE_IN_ROOT when AT_FDCWD or root dir fd is specified If we get AT_FDCWD or root dir fd, we always resolve symlinks relative to the host's root. Hence, the flag is meaningless. --- src/basic/chase.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/basic/chase.c b/src/basic/chase.c index 6c02aeab8b..7b7664096f 100644 --- a/src/basic/chase.c +++ b/src/basic/chase.c @@ -164,6 +164,20 @@ int chaseat( * the mount point is emitted. CHASE_WARN cannot be used in PID 1. */ + if (FLAGS_SET(flags, CHASE_AT_RESOLVE_IN_ROOT)) { + /* If we get AT_FDCWD or dir_fd points to "/", then we always resolve symlinks relative to + * the host's root. Hence, CHASE_AT_RESOLVE_IN_ROOT is meaningless. */ + + if (dir_fd >= 0) + r = dir_fd_is_root(dir_fd); + else + r = true; + if (r < 0) + return r; + if (r > 0) + flags &= ~CHASE_AT_RESOLVE_IN_ROOT; + } + if (!(flags & (CHASE_AT_RESOLVE_IN_ROOT|CHASE_NONEXISTENT|CHASE_NO_AUTOFS|CHASE_SAFE|CHASE_STEP| CHASE_PROHIBIT_SYMLINKS|CHASE_MKDIR_0755)) && From 8bf26bfe26c0563ae66efd8bdfaecfe4f54d6ef0 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 30 Mar 2023 16:15:19 +0900 Subject: [PATCH 2/2] chase: add CHASE_AT_RESOLVE_IN_ROOT only when it is necessary --- src/basic/chase.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/basic/chase.c b/src/basic/chase.c index 7b7664096f..00c2f74e92 100644 --- a/src/basic/chase.c +++ b/src/basic/chase.c @@ -539,10 +539,10 @@ int chase( if (fd < 0) return -errno; - flags |= CHASE_AT_RESOLVE_IN_ROOT; - flags &= ~CHASE_PREFIX_ROOT; + if (!empty_or_root(root)) + flags |= CHASE_AT_RESOLVE_IN_ROOT; - r = chaseat(fd, path, flags, ret_path ? &p : NULL, ret_fd ? &pfd : NULL); + r = chaseat(fd, path, flags & ~CHASE_PREFIX_ROOT, ret_path ? &p : NULL, ret_fd ? &pfd : NULL); if (r < 0) return r;