[CRIU] [PATCH] Migration with vfork
Pavel Ganyushin
pganyushin at odin.com
Wed Nov 25 06:07:20 PST 2015
This is old missed test. Fail expected.
Signed-off-by: Pavel Ganyushin <pganyushin at odin.com>
---
test/zdtm/live/static/Makefile | 1 +
test/zdtm/live/static/vfork00.c | 80 ++++++++++++++++++++++++++++++++++++++
test/zdtm/live/static/vfork00.desc | 1 +
3 files changed, 82 insertions(+)
create mode 100644 test/zdtm/live/static/vfork00.c
create mode 100644 test/zdtm/live/static/vfork00.desc
diff --git a/test/zdtm/live/static/Makefile b/test/zdtm/live/static/Makefile
index 66920ca..1b4347a 100644
--- a/test/zdtm/live/static/Makefile
+++ b/test/zdtm/live/static/Makefile
@@ -139,6 +139,7 @@ TST_NOFILE = \
different_creds \
vsx \
bridge \
+ vfork00 \
# jobctl00 \
TST_FILE = \
diff --git a/test/zdtm/live/static/vfork00.c b/test/zdtm/live/static/vfork00.c
new file mode 100644
index 0000000..8a54def
--- /dev/null
+++ b/test/zdtm/live/static/vfork00.c
@@ -0,0 +1,80 @@
+#include <errno.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <signal.h>
+#include <string.h>
+
+#include "zdtmtst.h"
+
+const char *test_doc = "Block migration by a pending (non-exec()-ed) vfork()";
+const char *test_author = "Pavel Emelianov <xemul at sw.ru>";
+
+int main(int argc, char ** argv)
+{
+ int ret = 0;
+ pid_t pid;
+
+ test_init(argc, argv);
+
+ /* vfork() won't let us control the test, so fork() first, and vfork()
+ * in the child */
+ pid = fork();
+ if (pid < 0) {
+ err("fork failed: %m");
+ exit(1);
+ }
+
+ if (pid == 0) {
+ int ret2;
+
+ pid = vfork();
+ if (pid < 0)
+ ret = errno;
+
+ /* wait for signal in _both_ branches */
+ test_waitsig();
+
+ /* vforked guy shouldn't return, hence we exec() */
+ if (pid == 0)
+ execlp("/bin/true", "true", NULL);
+
+ if (wait(&ret2) != pid)
+ ret = errno;
+
+ _exit(ret);
+ }
+
+ test_daemon();
+ test_waitsig();
+
+ /* signal the whole process group, because our child is suspended until
+ * the grand-child has exec()-ed, but we don't know the pid of the
+ * latter */
+ if (kill(0, SIGTERM)) {
+ fail("terminating the children failed: %m");
+ exit(1);
+ }
+
+ if (wait(&ret) != pid) {
+ fail("wait() returned wrong pid: %m");
+ exit(1);
+ }
+
+ if (WIFEXITED(ret)) {
+ ret = WEXITSTATUS(ret);
+ if (ret) {
+ fail("child exited with nonzero code %d (%s)", ret, strerror(ret));
+ exit(1);
+ }
+ }
+ if (WIFSIGNALED(ret)) {
+ fail("child exited on unexpected signal %d", WTERMSIG(ret));
+ exit(1);
+ }
+
+ pass();
+ return 0;
+}
diff --git a/test/zdtm/live/static/vfork00.desc b/test/zdtm/live/static/vfork00.desc
new file mode 100644
index 0000000..95c58b4
--- /dev/null
+++ b/test/zdtm/live/static/vfork00.desc
@@ -0,0 +1 @@
+{'flags': 'noauto'}
--
1.9.3
More information about the CRIU
mailing list