]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
switch_root: check if mount point to move even exists
authorThomas Deutschmann <whissi@gentoo.org>
Mon, 8 Feb 2021 14:30:25 +0000 (15:30 +0100)
committerThomas Deutschmann <whissi@gentoo.org>
Mon, 8 Feb 2021 14:35:07 +0000 (15:35 +0100)
Signed-off-by: Thomas Deutschmann <whissi@gentoo.org>
sys-utils/switch_root.c

index 3195c789892423fddd4b861b319ce8395e2c6c3c..174eec64c9f5c858ef033dda24dbb37c7ed67103 100644 (file)
@@ -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);