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);