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