Merge "Add missing options to minijail(1) manpage"
diff --git a/libminijail.c b/libminijail.c
index be6da23..2927b62 100644
--- a/libminijail.c
+++ b/libminijail.c
@@ -1092,7 +1092,7 @@
 
 	/*
 	 * Keep the fd for both old and new root.
-	 * It will be used in fchdir later.
+	 * It will be used in fchdir(2) later.
 	 */
 	oldroot = open("/", O_DIRECTORY | O_RDONLY | O_CLOEXEC);
 	if (oldroot < 0)
@@ -1102,7 +1102,7 @@
 		pdie("failed to open %s for fchdir", j->chrootdir);
 
 	/*
-	 * To ensure chrootdir is the root of a file system,
+	 * To ensure j->chrootdir is the root of a filesystem,
 	 * do a self bind mount.
 	 */
 	if (mount(j->chrootdir, j->chrootdir, "bind", MS_BIND | MS_REC, ""))
@@ -1113,11 +1113,23 @@
 		pdie("pivot_root");
 
 	/*
-	 * Now the old root is mounted on top of the new root. Use fchdir to
+	 * Now the old root is mounted on top of the new root. Use fchdir(2) to
 	 * change to the old root and unmount it.
 	 */
 	if (fchdir(oldroot))
 		pdie("failed to fchdir to old /");
+
+	/*
+	 * If j->flags.skip_remount_private was enabled for minijail_enter(), there
+	 * could be a shared mount point under |oldroot|. In that case, mounts
+	 * under this shared mount point will be unmounted below, and this
+	 * unmounting will propagate to the original mount namespace (because the
+	 * mount point is shared). To prevent this unexpected unmounting, remove
+	 * these mounts from their peer groups by recursively remounting them as
+	 * MS_PRIVATE.
+	 */
+	if (mount(NULL, ".", NULL, MS_REC | MS_PRIVATE, NULL))
+		pdie("failed to mount(/, private) before umount(/)");
 	/* The old root might be busy, so use lazy unmount. */
 	if (umount2(".", MNT_DETACH))
 		pdie("umount(/)");