Module Name:    src
Committed By:   kamil
Date:           Thu Feb  7 00:24:59 UTC 2019

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

Log Message:
Enable 3 new ptrace(2) tests for SIGILL

Add missing code for SIGILL verification and enable new SIGILL tests:
 - traceme_crash_ill
 - traceme_vfork_crash_ill
 - unrelated_tracer_sees_crash_ill

SIGILL is caused by a crash signal and needs special treatement that has
to be asserted to behave correctly.

In the unrelated_tracer_sees_crash* tests add additional check to catch
scenarios when a test dies due to abnormal condition and it's not caught
as the tracer is collected by initproc.

All tests pass on NetBSD/amd64, other ports have temporarily unimplemented
PTRACE_ILLEGAL_ASM.


To generate a diff of this commit:
cvs rdiff -u -r1.70 -r1.71 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.70 src/tests/lib/libc/sys/t_ptrace_wait.c:1.71
--- src/tests/lib/libc/sys/t_ptrace_wait.c:1.70	Sun Feb  3 03:19:28 2019
+++ src/tests/lib/libc/sys/t_ptrace_wait.c	Thu Feb  7 00:24:59 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: t_ptrace_wait.c,v 1.70 2019/02/03 03:19:28 mrg Exp $	*/
+/*	$NetBSD: t_ptrace_wait.c,v 1.71 2019/02/07 00:24:59 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.70 2019/02/03 03:19:28 mrg Exp $");
+__RCSID("$NetBSD: t_ptrace_wait.c,v 1.71 2019/02/07 00:24:59 kamil Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -190,6 +190,11 @@ traceme_crash(int sig)
 #endif
 	struct ptrace_siginfo info;
 
+#ifndef PTRACE_ILLEGAL_ASM
+	if (sig == SIGILL)
+		atf_tc_skip("PTRACE_ILLEGAL_ASM not defined");
+#endif
+
 	memset(&info, 0, sizeof(info));
 
 	DPRINTF("Before forking process PID=%d\n", getpid());
@@ -247,9 +252,9 @@ traceme_crash(int sig)
 	case SIGSEGV:
 		ATF_REQUIRE_EQ(info.psi_siginfo.si_code, SEGV_MAPERR);
 		break;
-//	case SIGILL:
-//		ATF_REQUIRE_EQ(info.psi_siginfo.si_code, ILL_ILLOP);
-//		break;
+	case SIGILL:
+		ATF_REQUIRE_EQ(info.psi_siginfo.si_code, ILL_PRVOPC);
+		break;
 	case SIGFPE:
 		ATF_REQUIRE_EQ(info.psi_siginfo.si_code, FPE_INTDIV);
 		break;
@@ -285,7 +290,7 @@ ATF_TC_BODY(test, tc)							\
 
 TRACEME_CRASH(traceme_crash_trap, SIGTRAP)
 TRACEME_CRASH(traceme_crash_segv, SIGSEGV)
-//TRACEME_CRASH(traceme_crash_ill, SIGILL)
+TRACEME_CRASH(traceme_crash_ill, SIGILL)
 TRACEME_CRASH(traceme_crash_fpe, SIGFPE)
 TRACEME_CRASH(traceme_crash_bus, SIGBUS)
 
@@ -871,6 +876,11 @@ traceme_vfork_crash(int sig)
 	int status;
 #endif
 
+#ifndef PTRACE_ILLEGAL_ASM
+	if (sig == SIGILL)
+		atf_tc_skip("PTRACE_ILLEGAL_ASM not defined");
+#endif
+
 	DPRINTF("Before forking process PID=%d\n", getpid());
 	SYSCALL_REQUIRE((child = vfork()) != -1);
 	if (child == 0) {
@@ -930,7 +940,7 @@ ATF_TC_BODY(test, tc)							\
 
 TRACEME_VFORK_CRASH(traceme_vfork_crash_trap, SIGTRAP)
 TRACEME_VFORK_CRASH(traceme_vfork_crash_segv, SIGSEGV)
-//TRACEME_VFORK_CRASH(traceme_vfork_crash_ill, SIGILL)
+TRACEME_VFORK_CRASH(traceme_vfork_crash_ill, SIGILL)
 TRACEME_VFORK_CRASH(traceme_vfork_crash_fpe, SIGFPE)
 TRACEME_VFORK_CRASH(traceme_vfork_crash_bus, SIGBUS)
 
@@ -1011,6 +1021,11 @@ unrelated_tracer_sees_crash(int sig)
 #endif
 	struct ptrace_siginfo info;
 
+#ifndef PTRACE_ILLEGAL_ASM
+	if (sig == SIGILL)
+		atf_tc_skip("PTRACE_ILLEGAL_ASM not defined");
+#endif
+
 	memset(&info, 0, sizeof(info));
 
 	DPRINTF("Spawn tracee\n");
@@ -1097,9 +1112,9 @@ unrelated_tracer_sees_crash(int sig)
 		case SIGSEGV:
 			ATF_REQUIRE_EQ(info.psi_siginfo.si_code, SEGV_MAPERR);
 			break;
-//		case SIGILL:
-//			ATF_REQUIRE_EQ(info.psi_siginfo.si_code, ILL_ILLOP);
-//			break;
+		case SIGILL:
+			ATF_REQUIRE_EQ(info.psi_siginfo.si_code, ILL_PRVOPC);
+			break;
 		case SIGFPE:
 			ATF_REQUIRE_EQ(info.psi_siginfo.si_code, FPE_INTDIV);
 			break;
@@ -1119,6 +1134,9 @@ unrelated_tracer_sees_crash(int sig)
 		TWAIT_REQUIRE_FAILURE(ECHILD,
 		    wpid = TWAIT_GENERIC(tracee, &status, 0));
 
+		/* Inform parent that tracer is exiting normally */
+		CHILD_TO_PARENT("tracer done", parent_tracer, msg);
+
 		DPRINTF("Before exiting of the tracer process\n");
 		_exit(0 /* collect by initproc */);
 	}
@@ -1150,6 +1168,9 @@ unrelated_tracer_sees_crash(int sig)
 
 	validate_status_signaled(status, SIGKILL, 0);
 
+	DPRINTF("Await normal exit of tracer\n");
+	PARENT_FROM_CHILD("tracer done", parent_tracer, msg);
+
 	msg_close(&parent_tracer);
 	msg_close(&parent_tracee);
 }
@@ -1171,7 +1192,7 @@ ATF_TC_BODY(test, tc)							\
 
 UNRELATED_TRACER_SEES_CRASH(unrelated_tracer_sees_crash_trap, SIGTRAP)
 UNRELATED_TRACER_SEES_CRASH(unrelated_tracer_sees_crash_segv, SIGSEGV)
-//UNRELATED_TRACER_SEES_CRASH(unrelated_tracer_sees_crash_ill, SIGILL)
+UNRELATED_TRACER_SEES_CRASH(unrelated_tracer_sees_crash_ill, SIGILL)
 UNRELATED_TRACER_SEES_CRASH(unrelated_tracer_sees_crash_fpe, SIGFPE)
 UNRELATED_TRACER_SEES_CRASH(unrelated_tracer_sees_crash_bus, SIGBUS)
 #endif
@@ -5679,7 +5700,7 @@ ATF_TP_ADD_TCS(tp)
 
 	ATF_TP_ADD_TC(tp, traceme_crash_trap);
 	ATF_TP_ADD_TC(tp, traceme_crash_segv);
-//	ATF_TP_ADD_TC(tp, traceme_crash_ill);
+	ATF_TP_ADD_TC(tp, traceme_crash_ill);
 	ATF_TP_ADD_TC(tp, traceme_crash_fpe);
 	ATF_TP_ADD_TC(tp, traceme_crash_bus);
 
@@ -5714,7 +5735,7 @@ ATF_TP_ADD_TCS(tp)
 
 	ATF_TP_ADD_TC(tp, traceme_vfork_crash_trap);
 	ATF_TP_ADD_TC(tp, traceme_vfork_crash_segv);
-//	ATF_TP_ADD_TC(tp, traceme_vfork_crash_ill);
+	ATF_TP_ADD_TC(tp, traceme_vfork_crash_ill);
 	ATF_TP_ADD_TC(tp, traceme_vfork_crash_fpe);
 	ATF_TP_ADD_TC(tp, traceme_vfork_crash_bus);
 
@@ -5722,7 +5743,7 @@ ATF_TP_ADD_TCS(tp)
 
 	ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_sees_crash_trap);
 	ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_sees_crash_segv);
-//	ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_sees_crash_ill);
+	ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_sees_crash_ill);
 	ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_sees_crash_fpe);
 	ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_sees_crash_bus);
 

Reply via email to