From a6ef5ef70726c77e621341b4de12413e1864e934 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 10 Apr 2023 09:55:22 +0900 Subject: [PATCH] chase: use dir_fd_is_root() to check if fd points to the root directory As commented in dir_fd_is_root(), comparing inode is not enough to determine if we are at the root directory. --- src/basic/chase.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/basic/chase.c b/src/basic/chase.c index b8441aa28b..f62c317026 100644 --- a/src/basic/chase.c +++ b/src/basic/chase.c @@ -262,10 +262,16 @@ int chaseat(int dir_fd, const char *path, ChaseFlags flags, char **ret_path, int if (fstat(fd_parent, &st_parent) < 0) return -errno; - /* If we opened the same directory, that means we're at the host root directory, so + /* If we opened the same directory, that _may_ indicate that we're at the host root + * directory. Let's confirm that in more detail with dir_fd_is_root(). And if so, * going up won't change anything. */ - if (stat_inode_same(&st_parent, &st)) - continue; + if (stat_inode_same(&st_parent, &st)) { + r = dir_fd_is_root(fd); + if (r < 0) + return r; + if (r > 0) + continue; + } r = path_extract_directory(done, &parent); if (r >= 0 || r == -EDESTADDRREQ)