| @@ -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 | \ |
171 | ATF_TC_BODY(test, tc) \ | | 171 | ATF_TC_BODY(test, tc) \ |
172 | { \ | | 172 | { \ |
173 | \ | | 173 | \ |
174 | traceme_raise(sig); \ | | 174 | traceme_raise(sig); \ |
175 | } | | 175 | } |
176 | | | 176 | |
177 | TRACEME_RAISE(traceme_raise1, SIGKILL) /* non-maskable */ | | 177 | TRACEME_RAISE(traceme_raise1, SIGKILL) /* non-maskable */ |
178 | TRACEME_RAISE(traceme_raise2, SIGSTOP) /* non-maskable */ | | 178 | TRACEME_RAISE(traceme_raise2, SIGSTOP) /* non-maskable */ |
179 | TRACEME_RAISE(traceme_raise3, SIGABRT) /* regular abort trap */ | | 179 | TRACEME_RAISE(traceme_raise3, SIGABRT) /* regular abort trap */ |
180 | TRACEME_RAISE(traceme_raise4, SIGHUP) /* hangup */ | | 180 | TRACEME_RAISE(traceme_raise4, SIGHUP) /* hangup */ |
181 | TRACEME_RAISE(traceme_raise5, SIGCONT) /* continued? */ | | 181 | TRACEME_RAISE(traceme_raise5, SIGCONT) /* continued? */ |
| | | 182 | TRACEME_RAISE(traceme_raise6, SIGTRAP) /* crash signal */ |
| | | 183 | TRACEME_RAISE(traceme_raise7, SIGBUS) /* crash signal */ |
| | | 184 | TRACEME_RAISE(traceme_raise8, SIGILL) /* crash signal */ |
| | | 185 | TRACEME_RAISE(traceme_raise9, SIGFPE) /* crash signal */ |
| | | 186 | TRACEME_RAISE(traceme_raise10, SIGSEGV) /* crash signal */ |
182 | | | 187 | |
183 | /// ---------------------------------------------------------------------------- | | 188 | /// ---------------------------------------------------------------------------- |
184 | | | 189 | |
185 | static void | | 190 | static void |
186 | traceme_crash(int sig) | | 191 | traceme_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 | \ |
385 | ATF_TC_BODY(test, tc) \ | | 390 | ATF_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. |
392 | TRACEME_SENDSIGNAL_HANDLE(traceme_sendsignal_handle1, SIGABRT) /* abort trap */ | | 397 | TRACEME_SENDSIGNAL_HANDLE(traceme_sendsignal_handle1, SIGABRT) /* abort trap */ |
393 | TRACEME_SENDSIGNAL_HANDLE(traceme_sendsignal_handle2, SIGHUP) /* hangup */ | | 398 | TRACEME_SENDSIGNAL_HANDLE(traceme_sendsignal_handle2, SIGHUP) /* hangup */ |
394 | TRACEME_SENDSIGNAL_HANDLE(traceme_sendsignal_handle3, SIGCONT) /* continued? */ | | 399 | TRACEME_SENDSIGNAL_HANDLE(traceme_sendsignal_handle3, SIGCONT) /* continued? */ |
| | | 400 | TRACEME_SENDSIGNAL_HANDLE(traceme_sendsignal_handle4, SIGTRAP) /* crash sig. */ |
| | | 401 | TRACEME_SENDSIGNAL_HANDLE(traceme_sendsignal_handle5, SIGBUS) /* crash sig. */ |
| | | 402 | TRACEME_SENDSIGNAL_HANDLE(traceme_sendsignal_handle6, SIGILL) /* crash sig. */ |
| | | 403 | TRACEME_SENDSIGNAL_HANDLE(traceme_sendsignal_handle7, SIGFPE) /* crash sig. */ |
| | | 404 | TRACEME_SENDSIGNAL_HANDLE(traceme_sendsignal_handle8, SIGSEGV) /* crash sig. */ |
395 | | | 405 | |
396 | /// ---------------------------------------------------------------------------- | | 406 | /// ---------------------------------------------------------------------------- |
397 | | | 407 | |
398 | static void | | 408 | static void |
399 | traceme_sendsignal_masked(int sigsent) | | 409 | traceme_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 | \ |
468 | ATF_TC_BODY(test, tc) \ | | 478 | ATF_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. |
475 | TRACEME_SENDSIGNAL_MASKED(traceme_sendsignal_masked1, SIGABRT) /* abort trap */ | | 485 | TRACEME_SENDSIGNAL_MASKED(traceme_sendsignal_masked1, SIGABRT) /* abort trap */ |
476 | TRACEME_SENDSIGNAL_MASKED(traceme_sendsignal_masked2, SIGHUP) /* hangup */ | | 486 | TRACEME_SENDSIGNAL_MASKED(traceme_sendsignal_masked2, SIGHUP) /* hangup */ |
477 | TRACEME_SENDSIGNAL_MASKED(traceme_sendsignal_masked3, SIGCONT) /* continued? */ | | 487 | TRACEME_SENDSIGNAL_MASKED(traceme_sendsignal_masked3, SIGCONT) /* continued? */ |
| | | 488 | TRACEME_SENDSIGNAL_MASKED(traceme_sendsignal_masked4, SIGTRAP) /* crash sig. */ |
| | | 489 | TRACEME_SENDSIGNAL_MASKED(traceme_sendsignal_masked5, SIGBUS) /* crash sig. */ |
| | | 490 | TRACEME_SENDSIGNAL_MASKED(traceme_sendsignal_masked6, SIGILL) /* crash sig. */ |
| | | 491 | TRACEME_SENDSIGNAL_MASKED(traceme_sendsignal_masked7, SIGFPE) /* crash sig. */ |
| | | 492 | TRACEME_SENDSIGNAL_MASKED(traceme_sendsignal_masked8, SIGSEGV) /* crash sig. */ |
478 | | | 493 | |
479 | /// ---------------------------------------------------------------------------- | | 494 | /// ---------------------------------------------------------------------------- |
480 | | | 495 | |
481 | static void | | 496 | static void |
482 | traceme_sendsignal_ignored(int sigsent) | | 497 | traceme_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 | \ |
553 | ATF_TC_BODY(test, tc) \ | | 568 | ATF_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. |
560 | TRACEME_SENDSIGNAL_IGNORED(traceme_sendsignal_ignored1, SIGABRT) /* abort */ | | 575 | TRACEME_SENDSIGNAL_IGNORED(traceme_sendsignal_ignored1, SIGABRT) /* abort */ |
561 | TRACEME_SENDSIGNAL_IGNORED(traceme_sendsignal_ignored2, SIGHUP) /* hangup */ | | 576 | TRACEME_SENDSIGNAL_IGNORED(traceme_sendsignal_ignored2, SIGHUP) /* hangup */ |
562 | TRACEME_SENDSIGNAL_IGNORED(traceme_sendsignal_ignored3, SIGCONT) /* continued */ | | 577 | TRACEME_SENDSIGNAL_IGNORED(traceme_sendsignal_ignored3, SIGCONT) /* continued */ |
| | | 578 | TRACEME_SENDSIGNAL_IGNORED(traceme_sendsignal_ignored4, SIGTRAP) /* crash s. */ |
| | | 579 | TRACEME_SENDSIGNAL_IGNORED(traceme_sendsignal_ignored5, SIGBUS) /* crash s. */ |
| | | 580 | TRACEME_SENDSIGNAL_IGNORED(traceme_sendsignal_ignored6, SIGILL) /* crash s. */ |
| | | 581 | TRACEME_SENDSIGNAL_IGNORED(traceme_sendsignal_ignored7, SIGFPE) /* crash s. */ |
| | | 582 | TRACEME_SENDSIGNAL_IGNORED(traceme_sendsignal_ignored8, SIGSEGV) /* crash s. */ |
563 | | | 583 | |
564 | /// ---------------------------------------------------------------------------- | | 584 | /// ---------------------------------------------------------------------------- |
565 | | | 585 | |
566 | static void | | 586 | static void |
567 | traceme_sendsignal_simple(int sigsent) | | 587 | traceme_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 | \ |
670 | ATF_TC_BODY(test, tc) \ | | 704 | ATF_TC_BODY(test, tc) \ |
671 | { \ | | 705 | { \ |
672 | \ | | 706 | \ |
673 | traceme_sendsignal_simple(sig); \ | | 707 | traceme_sendsignal_simple(sig); \ |
674 | } | | 708 | } |
675 | | | 709 | |
676 | TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple1, SIGKILL) /* non-maskable*/ | | 710 | TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple1, SIGKILL) /* non-maskable*/ |
677 | TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple2, SIGSTOP) /* non-maskable*/ | | 711 | TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple2, SIGSTOP) /* non-maskable*/ |
678 | TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple3, SIGABRT) /* abort trap */ | | 712 | TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple3, SIGABRT) /* abort trap */ |
679 | TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple4, SIGHUP) /* hangup */ | | 713 | TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple4, SIGHUP) /* hangup */ |
680 | TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple5, SIGCONT) /* continued? */ | | 714 | TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple5, SIGCONT) /* continued? */ |
| | | 715 | TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple6, SIGTRAP) /* crash sig. */ |
| | | 716 | TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple7, SIGBUS) /* crash sig. */ |
| | | 717 | TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple8, SIGILL) /* crash sig. */ |
| | | 718 | TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple9, SIGFPE) /* crash sig. */ |
| | | 719 | TRACEME_SENDSIGNAL_SIMPLE(traceme_sendsignal_simple10, SIGSEGV) /* crash sig. */ |
681 | | | 720 | |
682 | /// ---------------------------------------------------------------------------- | | 721 | /// ---------------------------------------------------------------------------- |
683 | | | 722 | |
684 | ATF_TC(traceme_pid1_parent); | | 723 | ATF_TC(traceme_pid1_parent); |
685 | ATF_TC_HEAD(traceme_pid1_parent, tc) | | 724 | ATF_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 | |
691 | ATF_TC_BODY(traceme_pid1_parent, tc) | | 730 | ATF_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 | |
743 | static void | | 782 | static void |
744 | traceme_vfork_raise(int sigval) | | 783 | traceme_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 | |
861 | TRACEME_VFORK_RAISE(traceme_vfork_raise1, SIGKILL) /* non-maskable */ | | 926 | TRACEME_VFORK_RAISE(traceme_vfork_raise1, SIGKILL) /* non-maskable */ |
862 | TRACEME_VFORK_RAISE(traceme_vfork_raise2, SIGSTOP) /* non-maskable */ | | 927 | TRACEME_VFORK_RAISE(traceme_vfork_raise2, SIGSTOP) /* non-maskable */ |
863 | TRACEME_VFORK_RAISE(traceme_vfork_raise3, SIGTSTP) /* ignored in vfork(2) */ | | 928 | TRACEME_VFORK_RAISE(traceme_vfork_raise3, SIGTSTP) /* ignored in vfork(2) */ |
864 | TRACEME_VFORK_RAISE(traceme_vfork_raise4, SIGTTIN) /* ignored in vfork(2) */ | | 929 | TRACEME_VFORK_RAISE(traceme_vfork_raise4, SIGTTIN) /* ignored in vfork(2) */ |
865 | TRACEME_VFORK_RAISE(traceme_vfork_raise5, SIGTTOU) /* ignored in vfork(2) */ | | 930 | TRACEME_VFORK_RAISE(traceme_vfork_raise5, SIGTTOU) /* ignored in vfork(2) */ |
866 | TRACEME_VFORK_RAISE(traceme_vfork_raise6, SIGABRT) /* regular abort trap */ | | 931 | TRACEME_VFORK_RAISE(traceme_vfork_raise6, SIGABRT) /* regular abort trap */ |
867 | TRACEME_VFORK_RAISE(traceme_vfork_raise7, SIGHUP) /* hangup */ | | 932 | TRACEME_VFORK_RAISE(traceme_vfork_raise7, SIGHUP) /* hangup */ |
868 | TRACEME_VFORK_RAISE(traceme_vfork_raise8, SIGCONT) /* continued? */ | | 933 | TRACEME_VFORK_RAISE(traceme_vfork_raise8, SIGCONT) /* continued? */ |
| | | 934 | TRACEME_VFORK_RAISE(traceme_vfork_raise9, SIGTRAP) /* crash signal */ |
| | | 935 | TRACEME_VFORK_RAISE(traceme_vfork_raise10, SIGBUS) /* crash signal */ |
| | | 936 | TRACEME_VFORK_RAISE(traceme_vfork_raise11, SIGILL) /* crash signal */ |
| | | 937 | TRACEME_VFORK_RAISE(traceme_vfork_raise12, SIGFPE) /* crash signal */ |
| | | 938 | TRACEME_VFORK_RAISE(traceme_vfork_raise13, SIGSEGV) /* crash signal */ |
869 | | | 939 | |
870 | /// ---------------------------------------------------------------------------- | | 940 | /// ---------------------------------------------------------------------------- |
871 | | | 941 | |
872 | static void | | 942 | static void |
873 | traceme_vfork_crash(int sig) | | 943 | traceme_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 | |
5173 | ATF_TP_ADD_TCS(tp) | | 5243 | ATF_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); |