From: Thomas Deutschmann Date: Mon, 8 Feb 2021 14:30:25 +0000 (+0100) Subject: switch_root: check if mount point to move even exists X-Git-Tag: v2.37-rc1~132^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=037c7816cec2c6a768edd85ec3c305ff7194e035;p=thirdparty%2Futil-linux.git switch_root: check if mount point to move even exists Signed-off-by: Thomas Deutschmann --- 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);