From 65d9baa10feaaa7752601c5846bdc2de70fe8a83 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 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); -- 2.47.3