switch_root: zap the last directory for the mount point of new-root
Kang-Che Sung
explorer09 at gmail.com
Fri Jul 19 09:30:52 UTC 2019
On Fri, Jul 19, 2019 at 3:27 PM 阿保 純一 <abo_junghichi at yahoo.co.jp> wrote:
>
> As the author said in the comment of util-linux/switch_root.c, current implementation leaves the mount point of new root-file-system without rmdir().
> As long as I experimented on a linux kernel, current process of "/" still points old root-file-system even "/" is overmounted. So we can still access and zap ititramfs after the directory is free from mount point.
>
> The patch below should zap the last directory left in the initramfs.
> It only swaps the timings of overmount and zapping.
>
> diff -Naur busybox-1.31.0.org/util-linux/switch_root.c busybox-1.31.0/util-linux/switch_root.c
> --- busybox-1.31.0.org/util-linux/switch_root.c 2019-07-18 23:18:54.791346155 +0900
> +++ busybox-1.31.0/util-linux/switch_root.c 2019-07-18 23:21:33.867785730 +0900
> @@ -257,14 +257,14 @@
> }
>
> if (!dry_run) {
> - // Zap everything out of rootdev
> - delete_contents("/", rootdev);
> -
> // Overmount / with newdir and chroot into it
> if (mount(".", "/", NULL, MS_MOVE, NULL)) {
> // For example, fails when newroot is not a mountpoint
> bb_perror_msg_and_die("error moving root");
> }
> +
> + // Zap everything out of rootdev
> + delete_contents("/", rootdev);
> }
> xchroot(".");
> // The chdir is needed to recalculate "." and ".." links
There's side benefit for this patch: In case that overmount fails, we can have
a rootfs kept intact (instead of almost destroyed).
I think you should adjust the comment line:
// Zap everything out of (old) rootdev, where "/" still points to before chroot
More information about the busybox
mailing list