This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[patch]test-container: move postclean outside of namespace changes
- From: DJ Delorie <dj at redhat dot com>
- To: libc-alpha at sourceware dot org
- Date: Wed, 05 Dec 2018 12:44:51 -0500
- Subject: [patch]test-container: move postclean outside of namespace changes
Move the postclean step to a separate process that forks just before
we change anything in the namespace, so that when the test exits
we can do the cleanup in the original namespace.
[BZ #23948]
* support/test-container.c: Move postclean step to before we
change namespaces.
diff --git a/ChangeLog b/ChangeLog
index 4138a08b4e..14c3bb6967 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2018-12-05 DJ Delorie <dj@redhat.com>
+
+ [BZ #23948]
+ * support/test-container.c: Move postclean step to before we
+ change namespaces.
+
2018-12-04 Joseph Myers <joseph@codesourcery.com>
* Makefile ($(objpfx)testroot.pristine/install.stamp): Do not run
diff --git a/support/test-container.c b/support/test-container.c
index df450adfdb..1d1aebeaf3 100644
--- a/support/test-container.c
+++ b/support/test-container.c
@@ -921,6 +921,43 @@ main (int argc, char **argv)
}
}
+ if (do_postclean)
+ {
+ pid_t pc_pid = fork ();
+
+ if (pc_pid < 0)
+ {
+ FAIL_EXIT1 ("Can't fork for post-clean");
+ }
+ else if (pc_pid > 0)
+ {
+ /* Parent. */
+ int status;
+ waitpid (pc_pid, &status, 0);
+
+ /* Child has exited, we can post-clean the test root. */
+ printf("running post-clean rsync\n");
+ rsync (pristine_root_path, new_root_path, 1);
+
+ if (WIFEXITED (status))
+ exit (WEXITSTATUS (status));
+
+ if (WIFSIGNALED (status))
+ {
+ printf ("%%SIGNALLED%%\n");
+ exit (77);
+ }
+
+ printf ("%%EXITERROR%%\n");
+ exit (78);
+ }
+
+ /* Child continues. */
+ }
+
+ /* This is the last point in the program where we're still in the
+ "normal" namespace. */
+
#ifdef CLONE_NEWNS
/* The unshare here gives us our own spaces and capabilities. */
if (unshare (CLONE_NEWUSER | CLONE_NEWPID | CLONE_NEWNS) < 0)
@@ -974,14 +1011,6 @@ main (int argc, char **argv)
int status;
waitpid (child, &status, 0);
- /* There's a bit of magic here, since the buildroot is mounted
- in our space, the paths are still valid, and since the mounts
- aren't recursive, it sees *only* the built root, not anything
- we would normally se if we rsync'd to "/" like mounted /dev
- files. */
- if (do_postclean)
- rsync (pristine_root_path, new_root_path, 1);
-
if (WIFEXITED (status))
exit (WEXITSTATUS (status));