Module Name:    src
Committed By:   kamil
Date:           Mon Aug 13 22:59:52 UTC 2018

Modified Files:
        src/tests/lib/libc/sys: t_ptrace_wait.c

Log Message:
Add a new ATF ptrace(2) test: tracer_attach_to_unrelated_stopped_process

Reuse the body of tracer_sees_terminaton_before_the_parent_raw for a test
attaching to an unrelated stopped process.

This test passes.


To generate a diff of this commit:
cvs rdiff -u -r1.66 -r1.67 src/tests/lib/libc/sys/t_ptrace_wait.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/lib/libc/sys/t_ptrace_wait.c
diff -u src/tests/lib/libc/sys/t_ptrace_wait.c:1.66 src/tests/lib/libc/sys/t_ptrace_wait.c:1.67
--- src/tests/lib/libc/sys/t_ptrace_wait.c:1.66	Mon Aug 13 22:00:45 2018
+++ src/tests/lib/libc/sys/t_ptrace_wait.c	Mon Aug 13 22:59:52 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: t_ptrace_wait.c,v 1.66 2018/08/13 22:00:45 kamil Exp $	*/
+/*	$NetBSD: t_ptrace_wait.c,v 1.67 2018/08/13 22:59:52 kamil Exp $	*/
 
 /*-
  * Copyright (c) 2016 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: t_ptrace_wait.c,v 1.66 2018/08/13 22:00:45 kamil Exp $");
+__RCSID("$NetBSD: t_ptrace_wait.c,v 1.67 2018/08/13 22:59:52 kamil Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -1182,11 +1182,13 @@ UNRELATED_TRACER_SEES_CRASH(unrelated_tr
 
 #if defined(TWAIT_HAVE_PID)
 static void
-tracer_sees_terminaton_before_the_parent_raw(bool notimeout, bool unrelated)
+tracer_sees_terminaton_before_the_parent_raw(bool notimeout, bool unrelated,
+                                             bool stopped)
 {
 	/*
 	 * notimeout - disable timeout in await zombie function
 	 * unrelated - attach from unrelated tracer reparented to initproc
+	 * stopped - attach to a stopped process
 	 */
 
 	struct msg_fds parent_tracee, parent_tracer;
@@ -1198,10 +1200,23 @@ tracer_sees_terminaton_before_the_parent
 	int status;
 #endif
 
+	/*
+	 * Only a subset of options are supported.
+	 */
+	ATF_REQUIRE((!notimeout && !unrelated && !stopped) ||
+	            (!notimeout && unrelated && !stopped) ||
+	            (notimeout && !unrelated && !stopped) ||
+	            (!notimeout && unrelated && stopped));
+
 	DPRINTF("Spawn tracee\n");
 	SYSCALL_REQUIRE(msg_open(&parent_tracee) == 0);
 	tracee = atf_utils_fork();
 	if (tracee == 0) {
+		if (stopped) {
+			DPRINTF("Stop self PID %d\n", getpid());
+			raise(SIGSTOP);
+		}
+
 		// Wait for parent to let us exit
 		CHILD_FROM_PARENT("exit tracee", parent_tracee, msg);
 		_exit(exitval_tracee);
@@ -1218,6 +1233,11 @@ tracer_sees_terminaton_before_the_parent
 				_exit(exitval_tracer);
 		}
 
+		if (stopped) {
+			DPRINTF("Await for a stopped parent PID %d\n", tracee);
+			await_stopped(tracee);
+		}
+
 		DPRINTF("Before calling PT_ATTACH from tracee %d\n", getpid());
 		FORKEE_ASSERT(ptrace(PT_ATTACH, tracee, NULL, 0) != -1);
 
@@ -1316,7 +1336,7 @@ ATF_TC_HEAD(tracer_sees_terminaton_befor
 ATF_TC_BODY(tracer_sees_terminaton_before_the_parent, tc)
 {
 
-	tracer_sees_terminaton_before_the_parent_raw(false, false);
+	tracer_sees_terminaton_before_the_parent_raw(false, false, false);
 }
 
 ATF_TC(tracer_sysctl_lookup_without_duplicates);
@@ -1342,7 +1362,8 @@ ATF_TC_BODY(tracer_sysctl_lookup_without
 	start = time(NULL);
 	while (true) {
 		DPRINTF("Step: %lu\n", N);
-		tracer_sees_terminaton_before_the_parent_raw(true, false);
+		tracer_sees_terminaton_before_the_parent_raw(true, false,
+		                                             false);
 		end = time(NULL);
 		diff = difftime(end, start);
 		if (diff >= 5.0)
@@ -1362,7 +1383,20 @@ ATF_TC_HEAD(unrelated_tracer_sees_termin
 ATF_TC_BODY(unrelated_tracer_sees_terminaton_before_the_parent, tc)
 {
 
-	tracer_sees_terminaton_before_the_parent_raw(false, true);
+	tracer_sees_terminaton_before_the_parent_raw(false, true, false);
+}
+
+ATF_TC(tracer_attach_to_unrelated_stopped_process);
+ATF_TC_HEAD(tracer_attach_to_unrelated_stopped_process, tc)
+{
+	atf_tc_set_md_var(tc, "descr",
+	    "Assert that tracer can attach to an unrelated stopped process");
+}
+
+ATF_TC_BODY(tracer_attach_to_unrelated_stopped_process, tc)
+{
+
+	tracer_sees_terminaton_before_the_parent_raw(false, true, true);
 }
 #endif
 
@@ -5698,6 +5732,7 @@ ATF_TP_ADD_TCS(tp)
 	ATF_TP_ADD_TC_HAVE_PID(tp, tracer_sysctl_lookup_without_duplicates);
 	ATF_TP_ADD_TC_HAVE_PID(tp,
 		unrelated_tracer_sees_terminaton_before_the_parent);
+	ATF_TP_ADD_TC_HAVE_PID(tp, tracer_attach_to_unrelated_stopped_process);
 
 	ATF_TP_ADD_TC(tp, parent_attach_to_its_child);
 	ATF_TP_ADD_TC(tp, parent_attach_to_its_stopped_child);

Reply via email to