[CRIU] [PATCH] zdtm: check a test result for static/different_creds

Andrey Vagin avagin at openvz.org
Thu Oct 1 04:50:52 PDT 2015


From: Andrew Vagin <avagin at openvz.org>

CRIU should not affect process states when it can't dump them.

Cc: Tycho Andersen <tycho.andersen at canonical.com>
Signed-off-by: Andrew Vagin <avagin at openvz.org>
---
 test/zdtm.sh                            | 14 +++++----
 test/zdtm/live/static/different_creds.c | 55 +++++++++++++++++++++------------
 2 files changed, 43 insertions(+), 26 deletions(-)

diff --git a/test/zdtm.sh b/test/zdtm.sh
index a0c3520..6e265a8 100755
--- a/test/zdtm.sh
+++ b/test/zdtm.sh
@@ -801,12 +801,15 @@ EOF
 		# Here we may have two cases: either checkpoint is failed
 		# with some error code, or checkpoint is complete but return
 		# code is non-zero because of post dump action.
-		if [ "$retcode" -ne 0 ] && [[ "$retcode" -ne 32 || -z "$dump_only" ]]; then
-			if echo $TEST_EXPECTED_FAILURE | grep -q $tname; then
-				echo "Got expected dump failure"
-				return 0
+		if echo $TEST_EXPECTED_FAILURE | grep -q $tname; then
+			echo "Expect dump falure: $retcode"
+			if [ "$retcode" -eq 0 ]; then
+				return 1
 			fi
-
+			dump_only=1
+			retcode=32
+		fi
+		if [ "$retcode" -ne 0 ] && [[ "$retcode" -ne 32 || -z "$dump_only" ]]; then
 			if [ $BATCH_TEST -eq 0 ]; then
 				echo WARNING: $tname returned $retcode and left running for debug needs
 			else
@@ -814,7 +817,6 @@ EOF
 			fi
 			return 1
 		fi
-		cat $ddump/dump.log* | grep Error
 
 		if [ -n "$SNAPSHOT" ]; then
 			snappdir=../`basename $ddump`
diff --git a/test/zdtm/live/static/different_creds.c b/test/zdtm/live/static/different_creds.c
index e2ffe23..c18216a 100644
--- a/test/zdtm/live/static/different_creds.c
+++ b/test/zdtm/live/static/different_creds.c
@@ -8,19 +8,19 @@
 #include <linux/limits.h>
 #include <pthread.h>
 #include <syscall.h>
+#include <sys/socket.h>
 
 #include "zdtmtst.h"
 
 const char *test_doc	= "Check that threads with different creds aren't checkpointed";
 const char *test_author	= "Tycho Andersen <tycho.andersen at canonical.com>";
 
-#define exit_group(code)	\
-	syscall(__NR_exit_group, code)
-
 void *drop_caps_and_wait(void *arg)
 {
+	int fd = *((int *) arg);
+	void *retcode = (void *)0xdeadbeaf;
 	cap_t caps;
-	int *pipe = arg;
+	char c;
 
         caps = cap_get_proc();
         if (!caps) {
@@ -38,41 +38,45 @@ void *drop_caps_and_wait(void *arg)
                 goto die;
         }
 
-	close(*pipe);
+	if (write(fd, "a", 1) != 1) {
+		err("Unable to send a status");
+		goto die;
+	}
+
+	if (read(fd, &c, 1) != 1) {
+		err("Unable to read a status");
+		goto die;
+	}
 
-	while(1)
-		sleep(1000);
+	retcode = NULL;
 die:
         cap_free(caps);
-        return NULL;
+	return retcode;
 }
 
 int main(int argc, char ** argv)
 {
-	int ret, pipefd[2];
+	int pipefd[2];
 	pthread_t thr;
-
-	char buf;
+	char c;
+	void *retcode;
 
 	test_init(argc, argv);
 
-	if (pipe(pipefd) < 0) {
+	if (socketpair(AF_FILE, SOCK_SEQPACKET, 0, pipefd)) {
 		err("pipe");
 		return -1;
 	}
 
-	if (pthread_create(&thr, NULL, drop_caps_and_wait, pipefd)) {
+	if (pthread_create(&thr, NULL, drop_caps_and_wait, &pipefd[0])) {
 		err("Unable to create thread");
 		return -1;
 	}
-	close(pipefd[1]);
 
 	/*
 	 * Wait for child to signal us that it has droped caps.
 	 */
-	ret = read(pipefd[0], &buf, 1);
-	close(pipefd[0]);
-	if (ret < 0) {
+	if (read(pipefd[1], &c, 1) != 1) {
 		err("read");
 		return 1;
 	}
@@ -80,8 +84,19 @@ int main(int argc, char ** argv)
 	test_daemon();
 	test_waitsig();
 
-	fail("shouldn't dump successfully");
+	if (write(pipefd[1], &c, 1) != 1) {
+		err("write");
+		return 1;
+	}
+
+	if (pthread_join(thr, &retcode)) {
+		err("Unable to jount a thread");
+		return 1;
+	}
+	if (retcode != NULL)
+		return 1;
+
+	pass();
 
-	exit_group(ret);
-	return 1;
+	return 0;
 }
-- 
2.4.3



More information about the CRIU mailing list