From 037c7816cec2c6a768edd85ec3c305ff7194e035 Mon Sep 17 00:00:00 2001 From: Thomas Deutschmann Date: Mon, 8 Feb 2021 15:30:25 +0100 Subject: [PATCH] switch_root: check if mount point to move even exists Signed-off-by: Thomas Deutschmann --- sys-utils/switch_root.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/sys-utils/switch_root.c b/sys-utils/switch_root.c index 3195c78989..174eec64c9 100644 --- a/sys-utils/switch_root.c +++ b/sys-utils/switch_root.c @@ -128,7 +128,12 @@ static int switchroot(const char *newroot) const char *umounts[] = { "/dev", "/proc", "/sys", "/run", NULL }; int i; int cfd = -1; - struct stat newroot_stat, sb; + struct stat newroot_stat, oldroot_stat, sb; + + if (stat("/", &oldroot_stat) != 0) { + warn(_("stat of %s failed"), "/"); + return -1; + } if (stat(newroot, &newroot_stat) != 0) { warn(_("stat of %s failed"), newroot); @@ -140,6 +145,11 @@ static int switchroot(const char *newroot) snprintf(newmount, sizeof(newmount), "%s%s", newroot, umounts[i]); + if ((stat(umounts[i], &sb) == 0) && sb.st_dev == oldroot_stat.st_dev) { + /* mount point to move seems to be a normal directory or stat failed */ + continue; + } + if ((stat(newmount, &sb) != 0) || (sb.st_dev != newroot_stat.st_dev)) { /* mount point seems to be mounted already or stat failed */ umount2(umounts[i], MNT_DETACH); -- 2.47.3