From: Yu Watanabe Date: Thu, 3 Aug 2023 19:03:29 +0000 (+0900) Subject: switch-root: reopen target directory after it is mounted X-Git-Tag: v255-rc1~826^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F28648%2Fhead;p=thirdparty%2Fsystemd.git switch-root: reopen target directory after it is mounted Fixes a bug introduced by f717d7a40a696b351415976f22a4f498c401de41. --- diff --git a/src/shared/switch-root.c b/src/shared/switch-root.c index 99036c13647..9fb9a3e3768 100644 --- a/src/shared/switch-root.c +++ b/src/shared/switch-root.c @@ -76,6 +76,18 @@ int switch_root(const char *new_root, r = fd_make_mount_point(new_root_fd); if (r < 0) return log_error_errno(r, "Failed to make new root directory a mount point: %m"); + if (r > 0) { + int fd; + + /* When the path was not a mount point, then we need to reopen the path, otherwise, it still + * points to the underlying directory. */ + + fd = open(new_root, O_DIRECTORY|O_CLOEXEC); + if (fd < 0) + return log_error_errno(errno, "Failed to reopen target directory '%s': %m", new_root); + + close_and_replace(new_root_fd, fd); + } if (FLAGS_SET(flags, SWITCH_ROOT_DESTROY_OLD_ROOT)) { istmp = fd_is_temporary_fs(old_root_fd);