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.36.2~12 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=65d9baa10feaaa7752601c5846bdc2de70fe8a83;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 a42bceca31..0176690401 100644 --- a/sys-utils/switch_root.c +++ b/sys-utils/switch_root.c @@ -131,7 +131,12 @@ static int switchroot(const char *newroot) int i; int cfd; pid_t pid; - 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); @@ -143,6 +148,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);