Thu Feb 14 05:38:45 2019 UTC ()
Add new regression scenarios for crash signals in t_ptrace_wait*

Verify correct behavior of crash signals (SIGTRAP, SIGBUS, SIGILL, SIGFPE,
SIGSEGV) in existing test scenarios:
 - traceme_raise
 - traceme_sendsignal_handle
 - traceme_sendsignal_masked
 - traceme_sendsignal_ignored
 - traceme_sendsignal_simple
 - traceme_vfork_raise

These tests verify signals out of the context of CPU trap. These new tests
will help to retain expected behavior in future changes in semantics of
the trapsignals in the kernel.


(kamil)
diff -r1.84 -r1.85 src/tests/lib/libc/sys/t_ptrace_wait.c

cvs diff -r1.84 -r1.85 src/tests/lib/libc/sys/t_ptrace_wait.c (expand / switch to unified diff)

--- src/tests/lib/libc/sys/t_ptrace_wait.c 2019/02/12 21:35:35 1.84
+++ src/tests/lib/libc/sys/t_ptrace_wait.c 2019/02/14 05:38:45 1.85
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: t_ptrace_wait.c,v 1.84 2019/02/12 21:35:35 kamil Exp $ */ 1/* $NetBSD: t_ptrace_wait.c,v 1.85 2019/02/14 05:38:45 kamil Exp $ */
2 2
3/*- 3/*-
4 * Copyright (c) 2016, 2017, 2018, 2019 The NetBSD Foundation, Inc. 4 * Copyright (c) 2016, 2017, 2018, 2019 The NetBSD Foundation, Inc.
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * Redistribution and use in source and binary forms, with or without 7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions 8 * modification, are permitted provided that the following conditions
9 * are met: 9 * are met:
10 * 1. Redistributions of source code must retain the above copyright 10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer. 11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright 12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the 13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution. 14 * documentation and/or other materials provided with the distribution.
@@ -17,27 +17,27 @@ @@ -17,27 +17,27 @@
17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 18 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE. 26 * POSSIBILITY OF SUCH DAMAGE.
27 */ 27 */
28 28
29#include <sys/cdefs.h> 29#include <sys/cdefs.h>
30__RCSID("$NetBSD: t_ptrace_wait.c,v 1.84 2019/02/12 21:35:35 kamil Exp $"); 30__RCSID("$NetBSD: t_ptrace_wait.c,v 1.85 2019/02/14 05:38:45 kamil Exp $");
31 31
32#include <sys/param.h> 32#include <sys/param.h>
33#include <sys/types.h> 33#include <sys/types.h>
34#include <sys/mman.h> 34#include <sys/mman.h>
35#include <sys/ptrace.h> 35#include <sys/ptrace.h>
36#include <sys/resource.h> 36#include <sys/resource.h>
37#include <sys/stat.h> 37#include <sys/stat.h>
38#include <sys/syscall.h> 38#include <sys/syscall.h>
39#include <sys/sysctl.h> 39#include <sys/sysctl.h>
40#include <sys/wait.h> 40#include <sys/wait.h>
41#include <machine/reg.h> 41#include <machine/reg.h>
42#include <elf.h> 42#include <elf.h>
43#include <err.h> 43#include <err.h>
@@ -169,26 +169,31 @@ ATF_TC_HEAD(test, tc) \ @@ -169,26 +169,31 @@ ATF_TC_HEAD(test, tc) \
169} \ 169} \
170 \ 170 \
171ATF_TC_BODY(test, tc) \ 171ATF_TC_BODY(test, tc) \
172{ \ 172{ \
173 \ 173 \
174 traceme_raise(sig); \ 174 traceme_raise(sig); \
175} 175}
176 176
177TRACEME_RAISE(traceme_raise1, SIGKILL) /* non-maskable */ 177TRACEME_RAISE(traceme_raise1, SIGKILL) /* non-maskable */
178TRACEME_RAISE(traceme_raise2, SIGSTOP) /* non-maskable */ 178TRACEME_RAISE(traceme_raise2, SIGSTOP) /* non-maskable */
179TRACEME_RAISE(traceme_raise3, SIGABRT) /* regular abort trap */ 179TRACEME_RAISE(traceme_raise3, SIGABRT) /* regular abort trap */
180TRACEME_RAISE(traceme_raise4, SIGHUP) /* hangup */ 180TRACEME_RAISE(traceme_raise4, SIGHUP) /* hangup */
181TRACEME_RAISE(traceme_raise5, SIGCONT) /* continued? */ 181TRACEME_RAISE(traceme_raise5, SIGCONT) /* continued? */
 182TRACEME_RAISE(traceme_raise6, SIGTRAP) /* crash signal */
 183TRACEME_RAISE(traceme_raise7, SIGBUS) /* crash signal */
 184TRACEME_RAISE(traceme_raise8, SIGILL) /* crash signal */
 185TRACEME_RAISE(traceme_raise9, SIGFPE) /* crash signal */
 186TRACEME_RAISE(traceme_raise10, SIGSEGV) /* crash signal */
182 187
183/// ---------------------------------------------------------------------------- 188/// ----------------------------------------------------------------------------
184 189
185static void 190static void
186traceme_crash(int sig) 191traceme_crash(int sig)
187{ 192{
188 pid_t child, wpid; 193 pid_t child, wpid;
189#if defined(TWAIT_HAVE_STATUS) 194#if defined(TWAIT_HAVE_STATUS)
190 int status; 195 int status;
191#endif 196#endif
192 struct ptrace_siginfo info; 197 struct ptrace_siginfo info;
193 198
194#ifndef PTRACE_ILLEGAL_ASM 199#ifndef PTRACE_ILLEGAL_ASM
@@ -382,26 +387,31 @@ test##_sighandler(int arg) \ @@ -382,26 +387,31 @@ test##_sighandler(int arg) \
382 ++ test##_caught; \ 387 ++ test##_caught; \
383} \ 388} \
384 \ 389 \
385ATF_TC_BODY(test, tc) \ 390ATF_TC_BODY(test, tc) \
386{ \ 391{ \
387 \ 392 \
388 traceme_sendsignal_handle(sig, test##_sighandler, & test##_caught); \ 393 traceme_sendsignal_handle(sig, test##_sighandler, & test##_caught); \
389} 394}
390 395
391// A signal handler for SIGKILL and SIGSTOP cannot be registered. 396// A signal handler for SIGKILL and SIGSTOP cannot be registered.
392TRACEME_SENDSIGNAL_HANDLE(traceme_sendsignal_handle1, SIGABRT) /* abort trap */ 397TRACEME_SENDSIGNAL_HANDLE(traceme_sendsignal_handle1, SIGABRT) /* abort trap */
393TRACEME_SENDSIGNAL_HANDLE(traceme_sendsignal_handle2, SIGHUP) /* hangup */ 398TRACEME_SENDSIGNAL_HANDLE(traceme_sendsignal_handle2, SIGHUP) /* hangup */
394TRACEME_SENDSIGNAL_HANDLE(traceme_sendsignal_handle3, SIGCONT) /* continued? */ 399TRACEME_SENDSIGNAL_HANDLE(traceme_sendsignal_handle3, SIGCONT) /* continued? */
 400TRACEME_SENDSIGNAL_HANDLE(traceme_sendsignal_handle4, SIGTRAP) /* crash sig. */
 401TRACEME_SENDSIGNAL_HANDLE(traceme_sendsignal_handle5, SIGBUS) /* crash sig. */
 402TRACEME_SENDSIGNAL_HANDLE(traceme_sendsignal_handle6, SIGILL) /* crash sig. */
 403TRACEME_SENDSIGNAL_HANDLE(traceme_sendsignal_handle7, SIGFPE) /* crash sig. */
 404TRACEME_SENDSIGNAL_HANDLE(traceme_sendsignal_handle8, SIGSEGV) /* crash sig. */
395 405
396/// ---------------------------------------------------------------------------- 406/// ----------------------------------------------------------------------------
397 407
398static void 408static void
399traceme_sendsignal_masked(int sigsent) 409traceme_sendsignal_masked(int sigsent)
400{ 410{
401 const int exitval = 5; 411 const int exitval = 5;
402 const int sigval = SIGSTOP; 412 const int sigval = SIGSTOP;
403 pid_t child, wpid; 413 pid_t child, wpid;
404 sigset_t set; 414 sigset_t set;
405#if defined(TWAIT_HAVE_STATUS) 415#if defined(TWAIT_HAVE_STATUS)
406 int status; 416 int status;
407#endif 417#endif
@@ -465,26 +475,31 @@ ATF_TC_HEAD(test, tc) \ @@ -465,26 +475,31 @@ ATF_TC_HEAD(test, tc) \
465 "handled correctly and the signal is masked by SIG_BLOCK"); \ 475 "handled correctly and the signal is masked by SIG_BLOCK"); \
466} \ 476} \
467 \ 477 \
468ATF_TC_BODY(test, tc) \ 478ATF_TC_BODY(test, tc) \
469{ \ 479{ \
470 \ 480 \
471 traceme_sendsignal_masked(sig); \ 481 traceme_sendsignal_masked(sig); \
472} 482}
473 483
474// A signal handler for SIGKILL and SIGSTOP cannot be masked. 484// A signal handler for SIGKILL and SIGSTOP cannot be masked.
475TRACEME_SENDSIGNAL_MASKED(traceme_sendsignal_masked1, SIGABRT) /* abort trap */ 485TRACEME_SENDSIGNAL_MASKED(traceme_sendsignal_masked1, SIGABRT) /* abort trap */
476TRACEME_SENDSIGNAL_MASKED(traceme_sendsignal_masked2, SIGHUP) /* hangup */ 486TRACEME_SENDSIGNAL_MASKED(traceme_sendsignal_masked2, SIGHUP) /* hangup */
477TRACEME_SENDSIGNAL_MASKED(traceme_sendsignal_masked3, SIGCONT) /* continued? */ 487TRACEME_SENDSIGNAL_MASKED(traceme_sendsignal_masked3, SIGCONT) /* continued? */
 488TRACEME_SENDSIGNAL_MASKED(traceme_sendsignal_masked4, SIGTRAP) /* crash sig. */
 489TRACEME_SENDSIGNAL_MASKED(traceme_sendsignal_masked5, SIGBUS) /* crash sig. */
 490TRACEME_SENDSIGNAL_MASKED(traceme_sendsignal_masked6, SIGILL) /* crash sig. */
 491TRACEME_SENDSIGNAL_MASKED(traceme_sendsignal_masked7, SIGFPE) /* crash sig. */
 492TRACEME_SENDSIGNAL_MASKED(traceme_sendsignal_masked8, SIGSEGV) /* crash sig. */
478 493
479/// ---------------------------------------------------------------------------- 494/// ----------------------------------------------------------------------------
480 495
481static void 496static void
482traceme_sendsignal_ignored(int sigsent) 497traceme_sendsignal_ignored(int sigsent)
483{ 498{
484 const int exitval = 5; 499 const int exitval = 5;
485 const int sigval = SIGSTOP; 500 const int sigval = SIGSTOP;
486 pid_t child, wpid; 501 pid_t child, wpid;
487 struct sigaction sa; 502 struct sigaction sa;
488#if defined(TWAIT_HAVE_STATUS) 503#if defined(TWAIT_HAVE_STATUS)
489 int status; 504 int status;
490#endif 505#endif
@@ -550,38 +565,57 @@ ATF_TC_HEAD(test, tc) \ @@ -550,38 +565,57 @@ ATF_TC_HEAD(test, tc) \
550 "handled correctly and the signal is masked by SIG_IGN"); \ 565 "handled correctly and the signal is masked by SIG_IGN"); \
551} \ 566} \
552 \ 567 \
553ATF_TC_BODY(test, tc) \ 568ATF_TC_BODY(test, tc) \
554{ \ 569{ \
555 \ 570 \
556 traceme_sendsignal_ignored(sig); \ 571 traceme_sendsignal_ignored(sig); \
557} 572}
558 573
559// A signal handler for SIGKILL and SIGSTOP cannot be ignored. 574// A signal handler for SIGKILL and SIGSTOP cannot be ignored.
560TRACEME_SENDSIGNAL_IGNORED(traceme_sendsignal_ignored1, SIGABRT) /* abort */ 575TRACEME_SENDSIGNAL_IGNORED(traceme_sendsignal_ignored1, SIGABRT) /* abort */
561TRACEME_SENDSIGNAL_IGNORED(traceme_sendsignal_ignored2, SIGHUP) /* hangup */ 576TRACEME_SENDSIGNAL_IGNORED(traceme_sendsignal_ignored2, SIGHUP) /* hangup */
562TRACEME_SENDSIGNAL_IGNORED(traceme_sendsignal_ignored3, SIGCONT) /* continued */ 577TRACEME_SENDSIGNAL_IGNORED(traceme_sendsignal_ignored3, SIGCONT) /* continued */
 578TRACEME_SENDSIGNAL_IGNORED(traceme_sendsignal_ignored4, SIGTRAP) /* crash s. */
 579TRACEME_SENDSIGNAL_IGNORED(traceme_sendsignal_ignored5, SIGBUS) /* crash s. */
 580TRACEME_SENDSIGNAL_IGNORED(traceme_sendsignal_ignored6, SIGILL) /* crash s. */
 581TRACEME_SENDSIGNAL_IGNORED(traceme_sendsignal_ignored7, SIGFPE) /* crash s. */
 582TRACEME_SENDSIGNAL_IGNORED(traceme_sendsignal_ignored8, SIGSEGV) /* crash s. */
563 583
564/// ---------------------------------------------------------------------------- 584/// ----------------------------------------------------------------------------
565 585
566static void 586static void
567traceme_sendsignal_simple(int sigsent) 587traceme_sendsignal_simple(int sigsent)
568{ 588{
569 const int sigval = SIGSTOP; 589 const int sigval = SIGSTOP;
570 int exitval = 0; 590 int exitval = 0;
571 pid_t child, wpid; 591 pid_t child, wpid;
572#if defined(TWAIT_HAVE_STATUS) 592#if defined(TWAIT_HAVE_STATUS)
573 int status; 593 int status;
574 int expect_core = (sigsent == SIGABRT) ? 1 : 0; 594 int expect_core;
 595
 596 switch (sigsent) {
 597 case SIGABRT:
 598 case SIGTRAP:
 599 case SIGBUS:
 600 case SIGILL:
 601 case SIGFPE:
 602 case SIGSEGV:
 603 expect_core = 1;
 604 break;
 605 default:
 606 expect_core = 0;
 607 break;
 608 }
575#endif 609#endif
576 struct ptrace_siginfo info; 610 struct ptrace_siginfo info;
577 611
578 memset(&info, 0, sizeof(info)); 612 memset(&info, 0, sizeof(info));
579 613
580 DPRINTF("Before forking process PID=%d\n", getpid()); 614 DPRINTF("Before forking process PID=%d\n", getpid());
581 SYSCALL_REQUIRE((child = fork()) != -1); 615 SYSCALL_REQUIRE((child = fork()) != -1);
582 if (child == 0) { 616 if (child == 0) {
583 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 617 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
584 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 618 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
585 619
586 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 620 DPRINTF("Before raising %s from child\n", strsignal(sigval));
587 FORKEE_ASSERT(raise(sigval) == 0); 621 FORKEE_ASSERT(raise(sigval) == 0);
@@ -668,26 +702,31 @@ ATF_TC_HEAD(test, tc) \ @@ -668,26 +702,31 @@ ATF_TC_HEAD(test, tc) \
668} \ 702} \
669 \ 703 \
670ATF_TC_BODY(test, tc) \ 704ATF_TC_BODY(test, tc) \
671{ \ 705{ \
672 \ 706 \
673 traceme_sendsignal_simple(sig); \ 707 traceme_sendsignal_simple(sig); \
674} 708}
675 709
676TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple1, SIGKILL) /* non-maskable*/ 710TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple1, SIGKILL) /* non-maskable*/
677TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple2, SIGSTOP) /* non-maskable*/ 711TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple2, SIGSTOP) /* non-maskable*/
678TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple3, SIGABRT) /* abort trap */ 712TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple3, SIGABRT) /* abort trap */
679TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple4, SIGHUP) /* hangup */ 713TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple4, SIGHUP) /* hangup */
680TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple5, SIGCONT) /* continued? */ 714TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple5, SIGCONT) /* continued? */
 715TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple6, SIGTRAP) /* crash sig. */
 716TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple7, SIGBUS) /* crash sig. */
 717TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple8, SIGILL) /* crash sig. */
 718TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple9, SIGFPE) /* crash sig. */
 719TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple10, SIGSEGV) /* crash sig. */
681 720
682/// ---------------------------------------------------------------------------- 721/// ----------------------------------------------------------------------------
683 722
684ATF_TC(traceme_pid1_parent); 723ATF_TC(traceme_pid1_parent);
685ATF_TC_HEAD(traceme_pid1_parent, tc) 724ATF_TC_HEAD(traceme_pid1_parent, tc)
686{ 725{
687 atf_tc_set_md_var(tc, "descr", 726 atf_tc_set_md_var(tc, "descr",
688 "Verify that PT_TRACE_ME is not allowed when our parent is PID1"); 727 "Verify that PT_TRACE_ME is not allowed when our parent is PID1");
689} 728}
690 729
691ATF_TC_BODY(traceme_pid1_parent, tc) 730ATF_TC_BODY(traceme_pid1_parent, tc)
692{ 731{
693 struct msg_fds parent_child; 732 struct msg_fds parent_child;
@@ -738,27 +777,43 @@ ATF_TC_BODY(traceme_pid1_parent, tc) @@ -738,27 +777,43 @@ ATF_TC_BODY(traceme_pid1_parent, tc)
738 PARENT_FROM_CHILD("child2 exiting", parent_child, msg); 777 PARENT_FROM_CHILD("child2 exiting", parent_child, msg);
739} 778}
740 779
741/// ---------------------------------------------------------------------------- 780/// ----------------------------------------------------------------------------
742 781
743static void 782static void
744traceme_vfork_raise(int sigval) 783traceme_vfork_raise(int sigval)
745{ 784{
746 const int exitval = 5, exitval_watcher = 10; 785 const int exitval = 5, exitval_watcher = 10;
747 pid_t child, parent, watcher, wpid; 786 pid_t child, parent, watcher, wpid;
748 int rv; 787 int rv;
749#if defined(TWAIT_HAVE_STATUS) 788#if defined(TWAIT_HAVE_STATUS)
750 int status; 789 int status;
751 int expect_core = (sigval == SIGABRT) ? 1 : 0; 790
 791 /* volatile workarounds GCC -Werror=clobbered */
 792 volatile int expect_core;
 793
 794 switch (sigval) {
 795 case SIGABRT:
 796 case SIGTRAP:
 797 case SIGBUS:
 798 case SIGILL:
 799 case SIGFPE:
 800 case SIGSEGV:
 801 expect_core = 1;
 802 break;
 803 default:
 804 expect_core = 0;
 805 break;
 806 }
752#endif 807#endif
753 808
754 /* 809 /*
755 * Spawn a dedicated thread to watch for a stopped child and emit 810 * Spawn a dedicated thread to watch for a stopped child and emit
756 * the SIGKILL signal to it. 811 * the SIGKILL signal to it.
757 * 812 *
758 * vfork(2) might clobber watcher, this means that it's safer and 813 * vfork(2) might clobber watcher, this means that it's safer and
759 * simpler to reparent this process to initproc and forget about it. 814 * simpler to reparent this process to initproc and forget about it.
760 */ 815 */
761 if (sigval == SIGSTOP) { 816 if (sigval == SIGSTOP) {
762 parent = getpid(); 817 parent = getpid();
763 818
764 watcher = fork(); 819 watcher = fork();
@@ -795,43 +850,53 @@ traceme_vfork_raise(int sigval) @@ -795,43 +850,53 @@ traceme_vfork_raise(int sigval)
795 SYSCALL_REQUIRE((child = vfork()) != -1); 850 SYSCALL_REQUIRE((child = vfork()) != -1);
796 if (child == 0) { 851 if (child == 0) {
797 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 852 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
798 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 853 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
799 854
800 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 855 DPRINTF("Before raising %s from child\n", strsignal(sigval));
801 FORKEE_ASSERT(raise(sigval) == 0); 856 FORKEE_ASSERT(raise(sigval) == 0);
802 857
803 switch (sigval) { 858 switch (sigval) {
804 case SIGSTOP: 859 case SIGSTOP:
805 case SIGKILL: 860 case SIGKILL:
806 case SIGABRT: 861 case SIGABRT:
807 case SIGHUP: 862 case SIGHUP:
 863 case SIGTRAP:
 864 case SIGBUS:
 865 case SIGILL:
 866 case SIGFPE:
 867 case SIGSEGV:
808 /* NOTREACHED */ 868 /* NOTREACHED */
809 FORKEE_ASSERTX(0 && "This shall not be reached"); 869 FORKEE_ASSERTX(0 && "This shall not be reached");
810 __unreachable(); 870 __unreachable();
811 default: 871 default:
812 DPRINTF("Before exiting of the child process\n"); 872 DPRINTF("Before exiting of the child process\n");
813 _exit(exitval); 873 _exit(exitval);
814 } 874 }
815 } 875 }
816 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 876 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
817 877
818 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 878 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
819 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 879 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
820 880
821 switch (sigval) { 881 switch (sigval) {
822 case SIGKILL: 882 case SIGKILL:
823 case SIGABRT: 883 case SIGABRT:
824 case SIGHUP: 884 case SIGHUP:
 885 case SIGTRAP:
 886 case SIGBUS:
 887 case SIGILL:
 888 case SIGFPE:
 889 case SIGSEGV:
825 validate_status_signaled(status, sigval, expect_core); 890 validate_status_signaled(status, sigval, expect_core);
826 break; 891 break;
827 case SIGSTOP: 892 case SIGSTOP:
828 validate_status_signaled(status, SIGKILL, 0); 893 validate_status_signaled(status, SIGKILL, 0);
829 break; 894 break;
830 case SIGCONT: 895 case SIGCONT:
831 case SIGTSTP: 896 case SIGTSTP:
832 case SIGTTIN: 897 case SIGTTIN:
833 case SIGTTOU: 898 case SIGTTOU:
834 validate_status_exited(status, exitval); 899 validate_status_exited(status, exitval);
835 break; 900 break;
836 default: 901 default:
837 /* NOTREACHED */ 902 /* NOTREACHED */
@@ -856,26 +921,31 @@ ATF_TC_BODY(test, tc) \ @@ -856,26 +921,31 @@ ATF_TC_BODY(test, tc) \
856{ \ 921{ \
857 \ 922 \
858 traceme_vfork_raise(sig); \ 923 traceme_vfork_raise(sig); \
859} 924}
860 925
861TRACEME_VFORK_RAISE(traceme_vfork_raise1, SIGKILL) /* non-maskable */ 926TRACEME_VFORK_RAISE(traceme_vfork_raise1, SIGKILL) /* non-maskable */
862TRACEME_VFORK_RAISE(traceme_vfork_raise2, SIGSTOP) /* non-maskable */ 927TRACEME_VFORK_RAISE(traceme_vfork_raise2, SIGSTOP) /* non-maskable */
863TRACEME_VFORK_RAISE(traceme_vfork_raise3, SIGTSTP) /* ignored in vfork(2) */ 928TRACEME_VFORK_RAISE(traceme_vfork_raise3, SIGTSTP) /* ignored in vfork(2) */
864TRACEME_VFORK_RAISE(traceme_vfork_raise4, SIGTTIN) /* ignored in vfork(2) */ 929TRACEME_VFORK_RAISE(traceme_vfork_raise4, SIGTTIN) /* ignored in vfork(2) */
865TRACEME_VFORK_RAISE(traceme_vfork_raise5, SIGTTOU) /* ignored in vfork(2) */ 930TRACEME_VFORK_RAISE(traceme_vfork_raise5, SIGTTOU) /* ignored in vfork(2) */
866TRACEME_VFORK_RAISE(traceme_vfork_raise6, SIGABRT) /* regular abort trap */ 931TRACEME_VFORK_RAISE(traceme_vfork_raise6, SIGABRT) /* regular abort trap */
867TRACEME_VFORK_RAISE(traceme_vfork_raise7, SIGHUP) /* hangup */ 932TRACEME_VFORK_RAISE(traceme_vfork_raise7, SIGHUP) /* hangup */
868TRACEME_VFORK_RAISE(traceme_vfork_raise8, SIGCONT) /* continued? */ 933TRACEME_VFORK_RAISE(traceme_vfork_raise8, SIGCONT) /* continued? */
 934TRACEME_VFORK_RAISE(traceme_vfork_raise9, SIGTRAP) /* crash signal */
 935TRACEME_VFORK_RAISE(traceme_vfork_raise10, SIGBUS) /* crash signal */
 936TRACEME_VFORK_RAISE(traceme_vfork_raise11, SIGILL) /* crash signal */
 937TRACEME_VFORK_RAISE(traceme_vfork_raise12, SIGFPE) /* crash signal */
 938TRACEME_VFORK_RAISE(traceme_vfork_raise13, SIGSEGV) /* crash signal */
869 939
870/// ---------------------------------------------------------------------------- 940/// ----------------------------------------------------------------------------
871 941
872static void 942static void
873traceme_vfork_crash(int sig) 943traceme_vfork_crash(int sig)
874{ 944{
875 pid_t child, wpid; 945 pid_t child, wpid;
876#if defined(TWAIT_HAVE_STATUS) 946#if defined(TWAIT_HAVE_STATUS)
877 int status; 947 int status;
878#endif 948#endif
879 949
880#ifndef PTRACE_ILLEGAL_ASM 950#ifndef PTRACE_ILLEGAL_ASM
881 if (sig == SIGILL) 951 if (sig == SIGILL)
@@ -5170,61 +5240,91 @@ ATF_TC_BODY(syscallemu1, tc) @@ -5170,61 +5240,91 @@ ATF_TC_BODY(syscallemu1, tc)
5170#include "t_ptrace_i386_wait.h" 5240#include "t_ptrace_i386_wait.h"
5171#include "t_ptrace_x86_wait.h" 5241#include "t_ptrace_x86_wait.h"
5172 5242
5173ATF_TP_ADD_TCS(tp) 5243ATF_TP_ADD_TCS(tp)
5174{ 5244{
5175 setvbuf(stdout, NULL, _IONBF, 0); 5245 setvbuf(stdout, NULL, _IONBF, 0);
5176 setvbuf(stderr, NULL, _IONBF, 0); 5246 setvbuf(stderr, NULL, _IONBF, 0);
5177 5247
5178 ATF_TP_ADD_TC(tp, traceme_raise1); 5248 ATF_TP_ADD_TC(tp, traceme_raise1);
5179 ATF_TP_ADD_TC(tp, traceme_raise2); 5249 ATF_TP_ADD_TC(tp, traceme_raise2);
5180 ATF_TP_ADD_TC(tp, traceme_raise3); 5250 ATF_TP_ADD_TC(tp, traceme_raise3);
5181 ATF_TP_ADD_TC(tp, traceme_raise4); 5251 ATF_TP_ADD_TC(tp, traceme_raise4);
5182 ATF_TP_ADD_TC(tp, traceme_raise5); 5252 ATF_TP_ADD_TC(tp, traceme_raise5);
 5253 ATF_TP_ADD_TC(tp, traceme_raise6);
 5254 ATF_TP_ADD_TC(tp, traceme_raise7);
 5255 ATF_TP_ADD_TC(tp, traceme_raise8);
 5256 ATF_TP_ADD_TC(tp, traceme_raise9);
 5257 ATF_TP_ADD_TC(tp, traceme_raise10);
5183 5258
5184 ATF_TP_ADD_TC(tp, traceme_crash_trap); 5259 ATF_TP_ADD_TC(tp, traceme_crash_trap);
5185 ATF_TP_ADD_TC(tp, traceme_crash_segv); 5260 ATF_TP_ADD_TC(tp, traceme_crash_segv);
5186 ATF_TP_ADD_TC(tp, traceme_crash_ill); 5261 ATF_TP_ADD_TC(tp, traceme_crash_ill);
5187 ATF_TP_ADD_TC(tp, traceme_crash_fpe); 5262 ATF_TP_ADD_TC(tp, traceme_crash_fpe);
5188 ATF_TP_ADD_TC(tp, traceme_crash_bus); 5263 ATF_TP_ADD_TC(tp, traceme_crash_bus);
5189 5264
5190 ATF_TP_ADD_TC(tp, traceme_sendsignal_handle1); 5265 ATF_TP_ADD_TC(tp, traceme_sendsignal_handle1);
5191 ATF_TP_ADD_TC(tp, traceme_sendsignal_handle2); 5266 ATF_TP_ADD_TC(tp, traceme_sendsignal_handle2);
5192 ATF_TP_ADD_TC(tp, traceme_sendsignal_handle3); 5267 ATF_TP_ADD_TC(tp, traceme_sendsignal_handle3);
 5268 ATF_TP_ADD_TC(tp, traceme_sendsignal_handle4);
 5269 ATF_TP_ADD_TC(tp, traceme_sendsignal_handle5);
 5270 ATF_TP_ADD_TC(tp, traceme_sendsignal_handle6);
 5271 ATF_TP_ADD_TC(tp, traceme_sendsignal_handle7);
 5272 ATF_TP_ADD_TC(tp, traceme_sendsignal_handle8);
5193 5273
5194 ATF_TP_ADD_TC(tp, traceme_sendsignal_masked1); 5274 ATF_TP_ADD_TC(tp, traceme_sendsignal_masked1);
5195 ATF_TP_ADD_TC(tp, traceme_sendsignal_masked2); 5275 ATF_TP_ADD_TC(tp, traceme_sendsignal_masked2);
5196 ATF_TP_ADD_TC(tp, traceme_sendsignal_masked3); 5276 ATF_TP_ADD_TC(tp, traceme_sendsignal_masked3);
 5277 ATF_TP_ADD_TC(tp, traceme_sendsignal_masked4);
 5278 ATF_TP_ADD_TC(tp, traceme_sendsignal_masked5);
 5279 ATF_TP_ADD_TC(tp, traceme_sendsignal_masked6);
 5280 ATF_TP_ADD_TC(tp, traceme_sendsignal_masked7);
 5281 ATF_TP_ADD_TC(tp, traceme_sendsignal_masked8);
5197 5282
5198 ATF_TP_ADD_TC(tp, traceme_sendsignal_ignored1); 5283 ATF_TP_ADD_TC(tp, traceme_sendsignal_ignored1);
5199 ATF_TP_ADD_TC(tp, traceme_sendsignal_ignored2); 5284 ATF_TP_ADD_TC(tp, traceme_sendsignal_ignored2);
5200 ATF_TP_ADD_TC(tp, traceme_sendsignal_ignored3); 5285 ATF_TP_ADD_TC(tp, traceme_sendsignal_ignored3);
 5286 ATF_TP_ADD_TC(tp, traceme_sendsignal_ignored4);
 5287 ATF_TP_ADD_TC(tp, traceme_sendsignal_ignored5);
 5288 ATF_TP_ADD_TC(tp, traceme_sendsignal_ignored6);
 5289 ATF_TP_ADD_TC(tp, traceme_sendsignal_ignored7);
 5290 ATF_TP_ADD_TC(tp, traceme_sendsignal_ignored8);
5201 5291
5202 ATF_TP_ADD_TC(tp, traceme_sendsignal_simple1); 5292 ATF_TP_ADD_TC(tp, traceme_sendsignal_simple1);
5203 ATF_TP_ADD_TC(tp, traceme_sendsignal_simple2); 5293 ATF_TP_ADD_TC(tp, traceme_sendsignal_simple2);
5204 ATF_TP_ADD_TC(tp, traceme_sendsignal_simple3); 5294 ATF_TP_ADD_TC(tp, traceme_sendsignal_simple3);
5205 ATF_TP_ADD_TC(tp, traceme_sendsignal_simple4); 5295 ATF_TP_ADD_TC(tp, traceme_sendsignal_simple4);
5206 ATF_TP_ADD_TC(tp, traceme_sendsignal_simple5); 5296 ATF_TP_ADD_TC(tp, traceme_sendsignal_simple5);
 5297 ATF_TP_ADD_TC(tp, traceme_sendsignal_simple6);
 5298 ATF_TP_ADD_TC(tp, traceme_sendsignal_simple7);
 5299 ATF_TP_ADD_TC(tp, traceme_sendsignal_simple8);
 5300 ATF_TP_ADD_TC(tp, traceme_sendsignal_simple9);
 5301 ATF_TP_ADD_TC(tp, traceme_sendsignal_simple10);
5207 5302
5208 ATF_TP_ADD_TC(tp, traceme_pid1_parent); 5303 ATF_TP_ADD_TC(tp, traceme_pid1_parent);
5209 5304
5210 ATF_TP_ADD_TC(tp, traceme_vfork_raise1); 5305 ATF_TP_ADD_TC(tp, traceme_vfork_raise1);
5211 ATF_TP_ADD_TC(tp, traceme_vfork_raise2); 5306 ATF_TP_ADD_TC(tp, traceme_vfork_raise2);
5212 ATF_TP_ADD_TC(tp, traceme_vfork_raise3); 5307 ATF_TP_ADD_TC(tp, traceme_vfork_raise3);
5213 ATF_TP_ADD_TC(tp, traceme_vfork_raise4); 5308 ATF_TP_ADD_TC(tp, traceme_vfork_raise4);
5214 ATF_TP_ADD_TC(tp, traceme_vfork_raise5); 5309 ATF_TP_ADD_TC(tp, traceme_vfork_raise5);
5215 ATF_TP_ADD_TC(tp, traceme_vfork_raise6); 5310 ATF_TP_ADD_TC(tp, traceme_vfork_raise6);
5216 ATF_TP_ADD_TC(tp, traceme_vfork_raise7); 5311 ATF_TP_ADD_TC(tp, traceme_vfork_raise7);
5217 ATF_TP_ADD_TC(tp, traceme_vfork_raise8); 5312 ATF_TP_ADD_TC(tp, traceme_vfork_raise8);
 5313 ATF_TP_ADD_TC(tp, traceme_vfork_raise9);
 5314 ATF_TP_ADD_TC(tp, traceme_vfork_raise10);
 5315 ATF_TP_ADD_TC(tp, traceme_vfork_raise11);
 5316 ATF_TP_ADD_TC(tp, traceme_vfork_raise12);
 5317 ATF_TP_ADD_TC(tp, traceme_vfork_raise13);
5218 5318
5219 ATF_TP_ADD_TC(tp, traceme_vfork_crash_trap); 5319 ATF_TP_ADD_TC(tp, traceme_vfork_crash_trap);
5220 ATF_TP_ADD_TC(tp, traceme_vfork_crash_segv); 5320 ATF_TP_ADD_TC(tp, traceme_vfork_crash_segv);
5221 ATF_TP_ADD_TC(tp, traceme_vfork_crash_ill); 5321 ATF_TP_ADD_TC(tp, traceme_vfork_crash_ill);
5222 ATF_TP_ADD_TC(tp, traceme_vfork_crash_fpe); 5322 ATF_TP_ADD_TC(tp, traceme_vfork_crash_fpe);
5223 ATF_TP_ADD_TC(tp, traceme_vfork_crash_bus); 5323 ATF_TP_ADD_TC(tp, traceme_vfork_crash_bus);
5224 5324
5225 ATF_TP_ADD_TC(tp, traceme_vfork_exec); 5325 ATF_TP_ADD_TC(tp, traceme_vfork_exec);
5226 5326
5227 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_sees_crash_trap); 5327 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_sees_crash_trap);
5228 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_sees_crash_segv); 5328 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_sees_crash_segv);
5229 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_sees_crash_ill); 5329 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_sees_crash_ill);
5230 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_sees_crash_fpe); 5330 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_sees_crash_fpe);