1 /*- 2 * Copyright (c) 2015 John Baldwin <jhb@FreeBSD.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 */ 26 27 #include <sys/cdefs.h> 28 __FBSDID("$FreeBSD$"); 29 30 #include <sys/types.h> 31 #include <sys/cpuset.h> 32 #include <sys/event.h> 33 #include <sys/file.h> 34 #include <sys/time.h> 35 #include <sys/procctl.h> 36 #include <sys/ptrace.h> 37 #include <sys/queue.h> 38 #include <sys/runq.h> 39 #include <sys/syscall.h> 40 #include <sys/sysctl.h> 41 #include <sys/user.h> 42 #include <sys/wait.h> 43 #include <errno.h> 44 #include <machine/cpufunc.h> 45 #include <pthread.h> 46 #include <sched.h> 47 #include <semaphore.h> 48 #include <signal.h> 49 #include <stdio.h> 50 #include <stdlib.h> 51 #include <unistd.h> 52 #include <atf-c.h> 53 54 /* 55 * A variant of ATF_REQUIRE that is suitable for use in child 56 * processes. This only works if the parent process is tripped up by 57 * the early exit and fails some requirement itself. 58 */ 59 #define CHILD_REQUIRE(exp) do { \ 60 if (!(exp)) \ 61 child_fail_require(__FILE__, __LINE__, \ 62 #exp " not met"); \ 63 } while (0) 64 65 static __dead2 void 66 child_fail_require(const char *file, int line, const char *str) 67 { 68 char buf[128]; 69 70 snprintf(buf, sizeof(buf), "%s:%d: %s\n", file, line, str); 71 write(2, buf, strlen(buf)); 72 _exit(32); 73 } 74 75 static void 76 trace_me(void) 77 { 78 79 /* Attach the parent process as a tracer of this process. */ 80 CHILD_REQUIRE(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 81 82 /* Trigger a stop. */ 83 raise(SIGSTOP); 84 } 85 86 static void 87 attach_child(pid_t pid) 88 { 89 pid_t wpid; 90 int status; 91 92 ATF_REQUIRE(ptrace(PT_ATTACH, pid, NULL, 0) == 0); 93 94 wpid = waitpid(pid, &status, 0); 95 ATF_REQUIRE(wpid == pid); 96 ATF_REQUIRE(WIFSTOPPED(status)); 97 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 98 } 99 100 static void 101 wait_for_zombie(pid_t pid) 102 { 103 104 /* 105 * Wait for a process to exit. This is kind of gross, but 106 * there is not a better way. 107 * 108 * Prior to r325719, the kern.proc.pid.<pid> sysctl failed 109 * with ESRCH. After that change, a valid struct kinfo_proc 110 * is returned for zombies with ki_stat set to SZOMB. 111 */ 112 for (;;) { 113 struct kinfo_proc kp; 114 size_t len; 115 int mib[4]; 116 117 mib[0] = CTL_KERN; 118 mib[1] = KERN_PROC; 119 mib[2] = KERN_PROC_PID; 120 mib[3] = pid; 121 len = sizeof(kp); 122 if (sysctl(mib, nitems(mib), &kp, &len, NULL, 0) == -1) { 123 ATF_REQUIRE(errno == ESRCH); 124 break; 125 } 126 if (kp.ki_stat == SZOMB) 127 break; 128 usleep(5000); 129 } 130 } 131 132 /* 133 * Verify that a parent debugger process "sees" the exit of a debugged 134 * process exactly once when attached via PT_TRACE_ME. 135 */ 136 ATF_TC_WITHOUT_HEAD(ptrace__parent_wait_after_trace_me); 137 ATF_TC_BODY(ptrace__parent_wait_after_trace_me, tc) 138 { 139 pid_t child, wpid; 140 int status; 141 142 ATF_REQUIRE((child = fork()) != -1); 143 if (child == 0) { 144 /* Child process. */ 145 trace_me(); 146 147 _exit(1); 148 } 149 150 /* Parent process. */ 151 152 /* The first wait() should report the stop from SIGSTOP. */ 153 wpid = waitpid(child, &status, 0); 154 ATF_REQUIRE(wpid == child); 155 ATF_REQUIRE(WIFSTOPPED(status)); 156 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 157 158 /* Continue the child ignoring the SIGSTOP. */ 159 ATF_REQUIRE(ptrace(PT_CONTINUE, child, (caddr_t)1, 0) != -1); 160 161 /* The second wait() should report the exit status. */ 162 wpid = waitpid(child, &status, 0); 163 ATF_REQUIRE(wpid == child); 164 ATF_REQUIRE(WIFEXITED(status)); 165 ATF_REQUIRE(WEXITSTATUS(status) == 1); 166 167 /* The child should no longer exist. */ 168 wpid = waitpid(child, &status, 0); 169 ATF_REQUIRE(wpid == -1); 170 ATF_REQUIRE(errno == ECHILD); 171 } 172 173 /* 174 * Verify that a parent debugger process "sees" the exit of a debugged 175 * process exactly once when attached via PT_ATTACH. 176 */ 177 ATF_TC_WITHOUT_HEAD(ptrace__parent_wait_after_attach); 178 ATF_TC_BODY(ptrace__parent_wait_after_attach, tc) 179 { 180 pid_t child, wpid; 181 int cpipe[2], status; 182 char c; 183 184 ATF_REQUIRE(pipe(cpipe) == 0); 185 ATF_REQUIRE((child = fork()) != -1); 186 if (child == 0) { 187 /* Child process. */ 188 close(cpipe[0]); 189 190 /* Wait for the parent to attach. */ 191 CHILD_REQUIRE(read(cpipe[1], &c, sizeof(c)) == 0); 192 193 _exit(1); 194 } 195 close(cpipe[1]); 196 197 /* Parent process. */ 198 199 /* Attach to the child process. */ 200 attach_child(child); 201 202 /* Continue the child ignoring the SIGSTOP. */ 203 ATF_REQUIRE(ptrace(PT_CONTINUE, child, (caddr_t)1, 0) != -1); 204 205 /* Signal the child to exit. */ 206 close(cpipe[0]); 207 208 /* The second wait() should report the exit status. */ 209 wpid = waitpid(child, &status, 0); 210 ATF_REQUIRE(wpid == child); 211 ATF_REQUIRE(WIFEXITED(status)); 212 ATF_REQUIRE(WEXITSTATUS(status) == 1); 213 214 /* The child should no longer exist. */ 215 wpid = waitpid(child, &status, 0); 216 ATF_REQUIRE(wpid == -1); 217 ATF_REQUIRE(errno == ECHILD); 218 } 219 220 /* 221 * Verify that a parent process "sees" the exit of a debugged process only 222 * after the debugger has seen it. 223 */ 224 ATF_TC_WITHOUT_HEAD(ptrace__parent_sees_exit_after_child_debugger); 225 ATF_TC_BODY(ptrace__parent_sees_exit_after_child_debugger, tc) 226 { 227 pid_t child, debugger, wpid; 228 int cpipe[2], dpipe[2], status; 229 char c; 230 231 ATF_REQUIRE(pipe(cpipe) == 0); 232 ATF_REQUIRE((child = fork()) != -1); 233 234 if (child == 0) { 235 /* Child process. */ 236 close(cpipe[0]); 237 238 /* Wait for parent to be ready. */ 239 CHILD_REQUIRE(read(cpipe[1], &c, sizeof(c)) == sizeof(c)); 240 241 _exit(1); 242 } 243 close(cpipe[1]); 244 245 ATF_REQUIRE(pipe(dpipe) == 0); 246 ATF_REQUIRE((debugger = fork()) != -1); 247 248 if (debugger == 0) { 249 /* Debugger process. */ 250 close(dpipe[0]); 251 252 CHILD_REQUIRE(ptrace(PT_ATTACH, child, NULL, 0) != -1); 253 254 wpid = waitpid(child, &status, 0); 255 CHILD_REQUIRE(wpid == child); 256 CHILD_REQUIRE(WIFSTOPPED(status)); 257 CHILD_REQUIRE(WSTOPSIG(status) == SIGSTOP); 258 259 CHILD_REQUIRE(ptrace(PT_CONTINUE, child, (caddr_t)1, 0) != -1); 260 261 /* Signal parent that debugger is attached. */ 262 CHILD_REQUIRE(write(dpipe[1], &c, sizeof(c)) == sizeof(c)); 263 264 /* Wait for parent's failed wait. */ 265 CHILD_REQUIRE(read(dpipe[1], &c, sizeof(c)) == 0); 266 267 wpid = waitpid(child, &status, 0); 268 CHILD_REQUIRE(wpid == child); 269 CHILD_REQUIRE(WIFEXITED(status)); 270 CHILD_REQUIRE(WEXITSTATUS(status) == 1); 271 272 _exit(0); 273 } 274 close(dpipe[1]); 275 276 /* Parent process. */ 277 278 /* Wait for the debugger to attach to the child. */ 279 ATF_REQUIRE(read(dpipe[0], &c, sizeof(c)) == sizeof(c)); 280 281 /* Release the child. */ 282 ATF_REQUIRE(write(cpipe[0], &c, sizeof(c)) == sizeof(c)); 283 ATF_REQUIRE(read(cpipe[0], &c, sizeof(c)) == 0); 284 close(cpipe[0]); 285 286 wait_for_zombie(child); 287 288 /* 289 * This wait should return a pid of 0 to indicate no status to 290 * report. The parent should see the child as non-exited 291 * until the debugger sees the exit. 292 */ 293 wpid = waitpid(child, &status, WNOHANG); 294 ATF_REQUIRE(wpid == 0); 295 296 /* Signal the debugger to wait for the child. */ 297 close(dpipe[0]); 298 299 /* Wait for the debugger. */ 300 wpid = waitpid(debugger, &status, 0); 301 ATF_REQUIRE(wpid == debugger); 302 ATF_REQUIRE(WIFEXITED(status)); 303 ATF_REQUIRE(WEXITSTATUS(status) == 0); 304 305 /* The child process should now be ready. */ 306 wpid = waitpid(child, &status, WNOHANG); 307 ATF_REQUIRE(wpid == child); 308 ATF_REQUIRE(WIFEXITED(status)); 309 ATF_REQUIRE(WEXITSTATUS(status) == 1); 310 } 311 312 /* 313 * Verify that a parent process "sees" the exit of a debugged process 314 * only after a non-direct-child debugger has seen it. In particular, 315 * various wait() calls in the parent must avoid failing with ESRCH by 316 * checking the parent's orphan list for the debugee. 317 */ 318 ATF_TC_WITHOUT_HEAD(ptrace__parent_sees_exit_after_unrelated_debugger); 319 ATF_TC_BODY(ptrace__parent_sees_exit_after_unrelated_debugger, tc) 320 { 321 pid_t child, debugger, fpid, wpid; 322 int cpipe[2], dpipe[2], status; 323 char c; 324 325 ATF_REQUIRE(pipe(cpipe) == 0); 326 ATF_REQUIRE((child = fork()) != -1); 327 328 if (child == 0) { 329 /* Child process. */ 330 close(cpipe[0]); 331 332 /* Wait for parent to be ready. */ 333 CHILD_REQUIRE(read(cpipe[1], &c, sizeof(c)) == sizeof(c)); 334 335 _exit(1); 336 } 337 close(cpipe[1]); 338 339 ATF_REQUIRE(pipe(dpipe) == 0); 340 ATF_REQUIRE((debugger = fork()) != -1); 341 342 if (debugger == 0) { 343 /* Debugger parent. */ 344 345 /* 346 * Fork again and drop the debugger parent so that the 347 * debugger is not a child of the main parent. 348 */ 349 CHILD_REQUIRE((fpid = fork()) != -1); 350 if (fpid != 0) 351 _exit(2); 352 353 /* Debugger process. */ 354 close(dpipe[0]); 355 356 CHILD_REQUIRE(ptrace(PT_ATTACH, child, NULL, 0) != -1); 357 358 wpid = waitpid(child, &status, 0); 359 CHILD_REQUIRE(wpid == child); 360 CHILD_REQUIRE(WIFSTOPPED(status)); 361 CHILD_REQUIRE(WSTOPSIG(status) == SIGSTOP); 362 363 CHILD_REQUIRE(ptrace(PT_CONTINUE, child, (caddr_t)1, 0) != -1); 364 365 /* Signal parent that debugger is attached. */ 366 CHILD_REQUIRE(write(dpipe[1], &c, sizeof(c)) == sizeof(c)); 367 368 /* Wait for parent's failed wait. */ 369 CHILD_REQUIRE(read(dpipe[1], &c, sizeof(c)) == sizeof(c)); 370 371 wpid = waitpid(child, &status, 0); 372 CHILD_REQUIRE(wpid == child); 373 CHILD_REQUIRE(WIFEXITED(status)); 374 CHILD_REQUIRE(WEXITSTATUS(status) == 1); 375 376 _exit(0); 377 } 378 close(dpipe[1]); 379 380 /* Parent process. */ 381 382 /* Wait for the debugger parent process to exit. */ 383 wpid = waitpid(debugger, &status, 0); 384 ATF_REQUIRE(wpid == debugger); 385 ATF_REQUIRE(WIFEXITED(status)); 386 ATF_REQUIRE(WEXITSTATUS(status) == 2); 387 388 /* A WNOHANG wait here should see the non-exited child. */ 389 wpid = waitpid(child, &status, WNOHANG); 390 ATF_REQUIRE(wpid == 0); 391 392 /* Wait for the debugger to attach to the child. */ 393 ATF_REQUIRE(read(dpipe[0], &c, sizeof(c)) == sizeof(c)); 394 395 /* Release the child. */ 396 ATF_REQUIRE(write(cpipe[0], &c, sizeof(c)) == sizeof(c)); 397 ATF_REQUIRE(read(cpipe[0], &c, sizeof(c)) == 0); 398 close(cpipe[0]); 399 400 wait_for_zombie(child); 401 402 /* 403 * This wait should return a pid of 0 to indicate no status to 404 * report. The parent should see the child as non-exited 405 * until the debugger sees the exit. 406 */ 407 wpid = waitpid(child, &status, WNOHANG); 408 ATF_REQUIRE(wpid == 0); 409 410 /* Signal the debugger to wait for the child. */ 411 ATF_REQUIRE(write(dpipe[0], &c, sizeof(c)) == sizeof(c)); 412 413 /* Wait for the debugger. */ 414 ATF_REQUIRE(read(dpipe[0], &c, sizeof(c)) == 0); 415 close(dpipe[0]); 416 417 /* The child process should now be ready. */ 418 wpid = waitpid(child, &status, WNOHANG); 419 ATF_REQUIRE(wpid == child); 420 ATF_REQUIRE(WIFEXITED(status)); 421 ATF_REQUIRE(WEXITSTATUS(status) == 1); 422 } 423 424 /* 425 * The parent process should always act the same regardless of how the 426 * debugger is attached to it. 427 */ 428 static __dead2 void 429 follow_fork_parent(bool use_vfork) 430 { 431 pid_t fpid, wpid; 432 int status; 433 434 if (use_vfork) 435 CHILD_REQUIRE((fpid = vfork()) != -1); 436 else 437 CHILD_REQUIRE((fpid = fork()) != -1); 438 439 if (fpid == 0) 440 /* Child */ 441 _exit(2); 442 443 wpid = waitpid(fpid, &status, 0); 444 CHILD_REQUIRE(wpid == fpid); 445 CHILD_REQUIRE(WIFEXITED(status)); 446 CHILD_REQUIRE(WEXITSTATUS(status) == 2); 447 448 _exit(1); 449 } 450 451 /* 452 * Helper routine for follow fork tests. This waits for two stops 453 * that report both "sides" of a fork. It returns the pid of the new 454 * child process. 455 */ 456 static pid_t 457 handle_fork_events(pid_t parent, struct ptrace_lwpinfo *ppl) 458 { 459 struct ptrace_lwpinfo pl; 460 bool fork_reported[2]; 461 pid_t child, wpid; 462 int i, status; 463 464 fork_reported[0] = false; 465 fork_reported[1] = false; 466 child = -1; 467 468 /* 469 * Each process should report a fork event. The parent should 470 * report a PL_FLAG_FORKED event, and the child should report 471 * a PL_FLAG_CHILD event. 472 */ 473 for (i = 0; i < 2; i++) { 474 wpid = wait(&status); 475 ATF_REQUIRE(wpid > 0); 476 ATF_REQUIRE(WIFSTOPPED(status)); 477 478 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, 479 sizeof(pl)) != -1); 480 ATF_REQUIRE((pl.pl_flags & (PL_FLAG_FORKED | PL_FLAG_CHILD)) != 481 0); 482 ATF_REQUIRE((pl.pl_flags & (PL_FLAG_FORKED | PL_FLAG_CHILD)) != 483 (PL_FLAG_FORKED | PL_FLAG_CHILD)); 484 if (pl.pl_flags & PL_FLAG_CHILD) { 485 ATF_REQUIRE(wpid != parent); 486 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 487 ATF_REQUIRE(!fork_reported[1]); 488 if (child == -1) 489 child = wpid; 490 else 491 ATF_REQUIRE(child == wpid); 492 if (ppl != NULL) 493 ppl[1] = pl; 494 fork_reported[1] = true; 495 } else { 496 ATF_REQUIRE(wpid == parent); 497 ATF_REQUIRE(WSTOPSIG(status) == SIGTRAP); 498 ATF_REQUIRE(!fork_reported[0]); 499 if (child == -1) 500 child = pl.pl_child_pid; 501 else 502 ATF_REQUIRE(child == pl.pl_child_pid); 503 if (ppl != NULL) 504 ppl[0] = pl; 505 fork_reported[0] = true; 506 } 507 } 508 509 return (child); 510 } 511 512 /* 513 * Verify that a new child process is stopped after a followed fork and 514 * that the traced parent sees the exit of the child after the debugger 515 * when both processes remain attached to the debugger. 516 */ 517 ATF_TC_WITHOUT_HEAD(ptrace__follow_fork_both_attached); 518 ATF_TC_BODY(ptrace__follow_fork_both_attached, tc) 519 { 520 pid_t children[2], fpid, wpid; 521 int status; 522 523 ATF_REQUIRE((fpid = fork()) != -1); 524 if (fpid == 0) { 525 trace_me(); 526 follow_fork_parent(false); 527 } 528 529 /* Parent process. */ 530 children[0] = fpid; 531 532 /* The first wait() should report the stop from SIGSTOP. */ 533 wpid = waitpid(children[0], &status, 0); 534 ATF_REQUIRE(wpid == children[0]); 535 ATF_REQUIRE(WIFSTOPPED(status)); 536 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 537 538 ATF_REQUIRE(ptrace(PT_FOLLOW_FORK, children[0], NULL, 1) != -1); 539 540 /* Continue the child ignoring the SIGSTOP. */ 541 ATF_REQUIRE(ptrace(PT_CONTINUE, children[0], (caddr_t)1, 0) != -1); 542 543 children[1] = handle_fork_events(children[0], NULL); 544 ATF_REQUIRE(children[1] > 0); 545 546 ATF_REQUIRE(ptrace(PT_CONTINUE, children[0], (caddr_t)1, 0) != -1); 547 ATF_REQUIRE(ptrace(PT_CONTINUE, children[1], (caddr_t)1, 0) != -1); 548 549 /* 550 * The child can't exit until the grandchild reports status, so the 551 * grandchild should report its exit first to the debugger. 552 */ 553 wpid = wait(&status); 554 ATF_REQUIRE(wpid == children[1]); 555 ATF_REQUIRE(WIFEXITED(status)); 556 ATF_REQUIRE(WEXITSTATUS(status) == 2); 557 558 wpid = wait(&status); 559 ATF_REQUIRE(wpid == children[0]); 560 ATF_REQUIRE(WIFEXITED(status)); 561 ATF_REQUIRE(WEXITSTATUS(status) == 1); 562 563 wpid = wait(&status); 564 ATF_REQUIRE(wpid == -1); 565 ATF_REQUIRE(errno == ECHILD); 566 } 567 568 /* 569 * Verify that a new child process is stopped after a followed fork 570 * and that the traced parent sees the exit of the child when the new 571 * child process is detached after it reports its fork. 572 */ 573 ATF_TC_WITHOUT_HEAD(ptrace__follow_fork_child_detached); 574 ATF_TC_BODY(ptrace__follow_fork_child_detached, tc) 575 { 576 pid_t children[2], fpid, wpid; 577 int status; 578 579 ATF_REQUIRE((fpid = fork()) != -1); 580 if (fpid == 0) { 581 trace_me(); 582 follow_fork_parent(false); 583 } 584 585 /* Parent process. */ 586 children[0] = fpid; 587 588 /* The first wait() should report the stop from SIGSTOP. */ 589 wpid = waitpid(children[0], &status, 0); 590 ATF_REQUIRE(wpid == children[0]); 591 ATF_REQUIRE(WIFSTOPPED(status)); 592 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 593 594 ATF_REQUIRE(ptrace(PT_FOLLOW_FORK, children[0], NULL, 1) != -1); 595 596 /* Continue the child ignoring the SIGSTOP. */ 597 ATF_REQUIRE(ptrace(PT_CONTINUE, children[0], (caddr_t)1, 0) != -1); 598 599 children[1] = handle_fork_events(children[0], NULL); 600 ATF_REQUIRE(children[1] > 0); 601 602 ATF_REQUIRE(ptrace(PT_CONTINUE, children[0], (caddr_t)1, 0) != -1); 603 ATF_REQUIRE(ptrace(PT_DETACH, children[1], (caddr_t)1, 0) != -1); 604 605 /* 606 * Should not see any status from the grandchild now, only the 607 * child. 608 */ 609 wpid = wait(&status); 610 ATF_REQUIRE(wpid == children[0]); 611 ATF_REQUIRE(WIFEXITED(status)); 612 ATF_REQUIRE(WEXITSTATUS(status) == 1); 613 614 wpid = wait(&status); 615 ATF_REQUIRE(wpid == -1); 616 ATF_REQUIRE(errno == ECHILD); 617 } 618 619 /* 620 * Verify that a new child process is stopped after a followed fork 621 * and that the traced parent sees the exit of the child when the 622 * traced parent is detached after the fork. 623 */ 624 ATF_TC_WITHOUT_HEAD(ptrace__follow_fork_parent_detached); 625 ATF_TC_BODY(ptrace__follow_fork_parent_detached, tc) 626 { 627 pid_t children[2], fpid, wpid; 628 int status; 629 630 ATF_REQUIRE((fpid = fork()) != -1); 631 if (fpid == 0) { 632 trace_me(); 633 follow_fork_parent(false); 634 } 635 636 /* Parent process. */ 637 children[0] = fpid; 638 639 /* The first wait() should report the stop from SIGSTOP. */ 640 wpid = waitpid(children[0], &status, 0); 641 ATF_REQUIRE(wpid == children[0]); 642 ATF_REQUIRE(WIFSTOPPED(status)); 643 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 644 645 ATF_REQUIRE(ptrace(PT_FOLLOW_FORK, children[0], NULL, 1) != -1); 646 647 /* Continue the child ignoring the SIGSTOP. */ 648 ATF_REQUIRE(ptrace(PT_CONTINUE, children[0], (caddr_t)1, 0) != -1); 649 650 children[1] = handle_fork_events(children[0], NULL); 651 ATF_REQUIRE(children[1] > 0); 652 653 ATF_REQUIRE(ptrace(PT_DETACH, children[0], (caddr_t)1, 0) != -1); 654 ATF_REQUIRE(ptrace(PT_CONTINUE, children[1], (caddr_t)1, 0) != -1); 655 656 /* 657 * The child can't exit until the grandchild reports status, so the 658 * grandchild should report its exit first to the debugger. 659 * 660 * Even though the child process is detached, it is still a 661 * child of the debugger, so it will still report it's exit 662 * after the grandchild. 663 */ 664 wpid = wait(&status); 665 ATF_REQUIRE(wpid == children[1]); 666 ATF_REQUIRE(WIFEXITED(status)); 667 ATF_REQUIRE(WEXITSTATUS(status) == 2); 668 669 wpid = wait(&status); 670 ATF_REQUIRE(wpid == children[0]); 671 ATF_REQUIRE(WIFEXITED(status)); 672 ATF_REQUIRE(WEXITSTATUS(status) == 1); 673 674 wpid = wait(&status); 675 ATF_REQUIRE(wpid == -1); 676 ATF_REQUIRE(errno == ECHILD); 677 } 678 679 static void 680 attach_fork_parent(int cpipe[2]) 681 { 682 pid_t fpid; 683 684 close(cpipe[0]); 685 686 /* Double-fork to disassociate from the debugger. */ 687 CHILD_REQUIRE((fpid = fork()) != -1); 688 if (fpid != 0) 689 _exit(3); 690 691 /* Send the pid of the disassociated child to the debugger. */ 692 fpid = getpid(); 693 CHILD_REQUIRE(write(cpipe[1], &fpid, sizeof(fpid)) == sizeof(fpid)); 694 695 /* Wait for the debugger to attach. */ 696 CHILD_REQUIRE(read(cpipe[1], &fpid, sizeof(fpid)) == 0); 697 } 698 699 /* 700 * Verify that a new child process is stopped after a followed fork and 701 * that the traced parent sees the exit of the child after the debugger 702 * when both processes remain attached to the debugger. In this test 703 * the parent that forks is not a direct child of the debugger. 704 */ 705 ATF_TC_WITHOUT_HEAD(ptrace__follow_fork_both_attached_unrelated_debugger); 706 ATF_TC_BODY(ptrace__follow_fork_both_attached_unrelated_debugger, tc) 707 { 708 pid_t children[2], fpid, wpid; 709 int cpipe[2], status; 710 711 ATF_REQUIRE(pipe(cpipe) == 0); 712 ATF_REQUIRE((fpid = fork()) != -1); 713 if (fpid == 0) { 714 attach_fork_parent(cpipe); 715 follow_fork_parent(false); 716 } 717 718 /* Parent process. */ 719 close(cpipe[1]); 720 721 /* Wait for the direct child to exit. */ 722 wpid = waitpid(fpid, &status, 0); 723 ATF_REQUIRE(wpid == fpid); 724 ATF_REQUIRE(WIFEXITED(status)); 725 ATF_REQUIRE(WEXITSTATUS(status) == 3); 726 727 /* Read the pid of the fork parent. */ 728 ATF_REQUIRE(read(cpipe[0], &children[0], sizeof(children[0])) == 729 sizeof(children[0])); 730 731 /* Attach to the fork parent. */ 732 attach_child(children[0]); 733 734 ATF_REQUIRE(ptrace(PT_FOLLOW_FORK, children[0], NULL, 1) != -1); 735 736 /* Continue the fork parent ignoring the SIGSTOP. */ 737 ATF_REQUIRE(ptrace(PT_CONTINUE, children[0], (caddr_t)1, 0) != -1); 738 739 /* Signal the fork parent to continue. */ 740 close(cpipe[0]); 741 742 children[1] = handle_fork_events(children[0], NULL); 743 ATF_REQUIRE(children[1] > 0); 744 745 ATF_REQUIRE(ptrace(PT_CONTINUE, children[0], (caddr_t)1, 0) != -1); 746 ATF_REQUIRE(ptrace(PT_CONTINUE, children[1], (caddr_t)1, 0) != -1); 747 748 /* 749 * The fork parent can't exit until the child reports status, 750 * so the child should report its exit first to the debugger. 751 */ 752 wpid = wait(&status); 753 ATF_REQUIRE(wpid == children[1]); 754 ATF_REQUIRE(WIFEXITED(status)); 755 ATF_REQUIRE(WEXITSTATUS(status) == 2); 756 757 wpid = wait(&status); 758 ATF_REQUIRE(wpid == children[0]); 759 ATF_REQUIRE(WIFEXITED(status)); 760 ATF_REQUIRE(WEXITSTATUS(status) == 1); 761 762 wpid = wait(&status); 763 ATF_REQUIRE(wpid == -1); 764 ATF_REQUIRE(errno == ECHILD); 765 } 766 767 /* 768 * Verify that a new child process is stopped after a followed fork 769 * and that the traced parent sees the exit of the child when the new 770 * child process is detached after it reports its fork. In this test 771 * the parent that forks is not a direct child of the debugger. 772 */ 773 ATF_TC_WITHOUT_HEAD(ptrace__follow_fork_child_detached_unrelated_debugger); 774 ATF_TC_BODY(ptrace__follow_fork_child_detached_unrelated_debugger, tc) 775 { 776 pid_t children[2], fpid, wpid; 777 int cpipe[2], status; 778 779 ATF_REQUIRE(pipe(cpipe) == 0); 780 ATF_REQUIRE((fpid = fork()) != -1); 781 if (fpid == 0) { 782 attach_fork_parent(cpipe); 783 follow_fork_parent(false); 784 } 785 786 /* Parent process. */ 787 close(cpipe[1]); 788 789 /* Wait for the direct child to exit. */ 790 wpid = waitpid(fpid, &status, 0); 791 ATF_REQUIRE(wpid == fpid); 792 ATF_REQUIRE(WIFEXITED(status)); 793 ATF_REQUIRE(WEXITSTATUS(status) == 3); 794 795 /* Read the pid of the fork parent. */ 796 ATF_REQUIRE(read(cpipe[0], &children[0], sizeof(children[0])) == 797 sizeof(children[0])); 798 799 /* Attach to the fork parent. */ 800 attach_child(children[0]); 801 802 ATF_REQUIRE(ptrace(PT_FOLLOW_FORK, children[0], NULL, 1) != -1); 803 804 /* Continue the fork parent ignoring the SIGSTOP. */ 805 ATF_REQUIRE(ptrace(PT_CONTINUE, children[0], (caddr_t)1, 0) != -1); 806 807 /* Signal the fork parent to continue. */ 808 close(cpipe[0]); 809 810 children[1] = handle_fork_events(children[0], NULL); 811 ATF_REQUIRE(children[1] > 0); 812 813 ATF_REQUIRE(ptrace(PT_CONTINUE, children[0], (caddr_t)1, 0) != -1); 814 ATF_REQUIRE(ptrace(PT_DETACH, children[1], (caddr_t)1, 0) != -1); 815 816 /* 817 * Should not see any status from the child now, only the fork 818 * parent. 819 */ 820 wpid = wait(&status); 821 ATF_REQUIRE(wpid == children[0]); 822 ATF_REQUIRE(WIFEXITED(status)); 823 ATF_REQUIRE(WEXITSTATUS(status) == 1); 824 825 wpid = wait(&status); 826 ATF_REQUIRE(wpid == -1); 827 ATF_REQUIRE(errno == ECHILD); 828 } 829 830 /* 831 * Verify that a new child process is stopped after a followed fork 832 * and that the traced parent sees the exit of the child when the 833 * traced parent is detached after the fork. In this test the parent 834 * that forks is not a direct child of the debugger. 835 */ 836 ATF_TC_WITHOUT_HEAD(ptrace__follow_fork_parent_detached_unrelated_debugger); 837 ATF_TC_BODY(ptrace__follow_fork_parent_detached_unrelated_debugger, tc) 838 { 839 pid_t children[2], fpid, wpid; 840 int cpipe[2], status; 841 842 ATF_REQUIRE(pipe(cpipe) == 0); 843 ATF_REQUIRE((fpid = fork()) != -1); 844 if (fpid == 0) { 845 attach_fork_parent(cpipe); 846 follow_fork_parent(false); 847 } 848 849 /* Parent process. */ 850 close(cpipe[1]); 851 852 /* Wait for the direct child to exit. */ 853 wpid = waitpid(fpid, &status, 0); 854 ATF_REQUIRE(wpid == fpid); 855 ATF_REQUIRE(WIFEXITED(status)); 856 ATF_REQUIRE(WEXITSTATUS(status) == 3); 857 858 /* Read the pid of the fork parent. */ 859 ATF_REQUIRE(read(cpipe[0], &children[0], sizeof(children[0])) == 860 sizeof(children[0])); 861 862 /* Attach to the fork parent. */ 863 attach_child(children[0]); 864 865 ATF_REQUIRE(ptrace(PT_FOLLOW_FORK, children[0], NULL, 1) != -1); 866 867 /* Continue the fork parent ignoring the SIGSTOP. */ 868 ATF_REQUIRE(ptrace(PT_CONTINUE, children[0], (caddr_t)1, 0) != -1); 869 870 /* Signal the fork parent to continue. */ 871 close(cpipe[0]); 872 873 children[1] = handle_fork_events(children[0], NULL); 874 ATF_REQUIRE(children[1] > 0); 875 876 ATF_REQUIRE(ptrace(PT_DETACH, children[0], (caddr_t)1, 0) != -1); 877 ATF_REQUIRE(ptrace(PT_CONTINUE, children[1], (caddr_t)1, 0) != -1); 878 879 /* 880 * Should not see any status from the fork parent now, only 881 * the child. 882 */ 883 wpid = wait(&status); 884 ATF_REQUIRE(wpid == children[1]); 885 ATF_REQUIRE(WIFEXITED(status)); 886 ATF_REQUIRE(WEXITSTATUS(status) == 2); 887 888 wpid = wait(&status); 889 ATF_REQUIRE(wpid == -1); 890 ATF_REQUIRE(errno == ECHILD); 891 } 892 893 /* 894 * Verify that a child process does not see an unrelated debugger as its 895 * parent but sees its original parent process. 896 */ 897 ATF_TC_WITHOUT_HEAD(ptrace__getppid); 898 ATF_TC_BODY(ptrace__getppid, tc) 899 { 900 pid_t child, debugger, ppid, wpid; 901 int cpipe[2], dpipe[2], status; 902 char c; 903 904 ATF_REQUIRE(pipe(cpipe) == 0); 905 ATF_REQUIRE((child = fork()) != -1); 906 907 if (child == 0) { 908 /* Child process. */ 909 close(cpipe[0]); 910 911 /* Wait for parent to be ready. */ 912 CHILD_REQUIRE(read(cpipe[1], &c, sizeof(c)) == sizeof(c)); 913 914 /* Report the parent PID to the parent. */ 915 ppid = getppid(); 916 CHILD_REQUIRE(write(cpipe[1], &ppid, sizeof(ppid)) == 917 sizeof(ppid)); 918 919 _exit(1); 920 } 921 close(cpipe[1]); 922 923 ATF_REQUIRE(pipe(dpipe) == 0); 924 ATF_REQUIRE((debugger = fork()) != -1); 925 926 if (debugger == 0) { 927 /* Debugger process. */ 928 close(dpipe[0]); 929 930 CHILD_REQUIRE(ptrace(PT_ATTACH, child, NULL, 0) != -1); 931 932 wpid = waitpid(child, &status, 0); 933 CHILD_REQUIRE(wpid == child); 934 CHILD_REQUIRE(WIFSTOPPED(status)); 935 CHILD_REQUIRE(WSTOPSIG(status) == SIGSTOP); 936 937 CHILD_REQUIRE(ptrace(PT_CONTINUE, child, (caddr_t)1, 0) != -1); 938 939 /* Signal parent that debugger is attached. */ 940 CHILD_REQUIRE(write(dpipe[1], &c, sizeof(c)) == sizeof(c)); 941 942 /* Wait for traced child to exit. */ 943 wpid = waitpid(child, &status, 0); 944 CHILD_REQUIRE(wpid == child); 945 CHILD_REQUIRE(WIFEXITED(status)); 946 CHILD_REQUIRE(WEXITSTATUS(status) == 1); 947 948 _exit(0); 949 } 950 close(dpipe[1]); 951 952 /* Parent process. */ 953 954 /* Wait for the debugger to attach to the child. */ 955 ATF_REQUIRE(read(dpipe[0], &c, sizeof(c)) == sizeof(c)); 956 957 /* Release the child. */ 958 ATF_REQUIRE(write(cpipe[0], &c, sizeof(c)) == sizeof(c)); 959 960 /* Read the parent PID from the child. */ 961 ATF_REQUIRE(read(cpipe[0], &ppid, sizeof(ppid)) == sizeof(ppid)); 962 close(cpipe[0]); 963 964 ATF_REQUIRE(ppid == getpid()); 965 966 /* Wait for the debugger. */ 967 wpid = waitpid(debugger, &status, 0); 968 ATF_REQUIRE(wpid == debugger); 969 ATF_REQUIRE(WIFEXITED(status)); 970 ATF_REQUIRE(WEXITSTATUS(status) == 0); 971 972 /* The child process should now be ready. */ 973 wpid = waitpid(child, &status, WNOHANG); 974 ATF_REQUIRE(wpid == child); 975 ATF_REQUIRE(WIFEXITED(status)); 976 ATF_REQUIRE(WEXITSTATUS(status) == 1); 977 } 978 979 /* 980 * Verify that pl_syscall_code in struct ptrace_lwpinfo for a new 981 * child process created via fork() reports the correct value. 982 */ 983 ATF_TC_WITHOUT_HEAD(ptrace__new_child_pl_syscall_code_fork); 984 ATF_TC_BODY(ptrace__new_child_pl_syscall_code_fork, tc) 985 { 986 struct ptrace_lwpinfo pl[2]; 987 pid_t children[2], fpid, wpid; 988 int status; 989 990 ATF_REQUIRE((fpid = fork()) != -1); 991 if (fpid == 0) { 992 trace_me(); 993 follow_fork_parent(false); 994 } 995 996 /* Parent process. */ 997 children[0] = fpid; 998 999 /* The first wait() should report the stop from SIGSTOP. */ 1000 wpid = waitpid(children[0], &status, 0); 1001 ATF_REQUIRE(wpid == children[0]); 1002 ATF_REQUIRE(WIFSTOPPED(status)); 1003 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 1004 1005 ATF_REQUIRE(ptrace(PT_FOLLOW_FORK, children[0], NULL, 1) != -1); 1006 1007 /* Continue the child ignoring the SIGSTOP. */ 1008 ATF_REQUIRE(ptrace(PT_CONTINUE, children[0], (caddr_t)1, 0) != -1); 1009 1010 /* Wait for both halves of the fork event to get reported. */ 1011 children[1] = handle_fork_events(children[0], pl); 1012 ATF_REQUIRE(children[1] > 0); 1013 1014 ATF_REQUIRE((pl[0].pl_flags & PL_FLAG_SCX) != 0); 1015 ATF_REQUIRE((pl[1].pl_flags & PL_FLAG_SCX) != 0); 1016 ATF_REQUIRE(pl[0].pl_syscall_code == SYS_fork); 1017 ATF_REQUIRE(pl[0].pl_syscall_code == pl[1].pl_syscall_code); 1018 ATF_REQUIRE(pl[0].pl_syscall_narg == pl[1].pl_syscall_narg); 1019 1020 ATF_REQUIRE(ptrace(PT_CONTINUE, children[0], (caddr_t)1, 0) != -1); 1021 ATF_REQUIRE(ptrace(PT_CONTINUE, children[1], (caddr_t)1, 0) != -1); 1022 1023 /* 1024 * The child can't exit until the grandchild reports status, so the 1025 * grandchild should report its exit first to the debugger. 1026 */ 1027 wpid = wait(&status); 1028 ATF_REQUIRE(wpid == children[1]); 1029 ATF_REQUIRE(WIFEXITED(status)); 1030 ATF_REQUIRE(WEXITSTATUS(status) == 2); 1031 1032 wpid = wait(&status); 1033 ATF_REQUIRE(wpid == children[0]); 1034 ATF_REQUIRE(WIFEXITED(status)); 1035 ATF_REQUIRE(WEXITSTATUS(status) == 1); 1036 1037 wpid = wait(&status); 1038 ATF_REQUIRE(wpid == -1); 1039 ATF_REQUIRE(errno == ECHILD); 1040 } 1041 1042 /* 1043 * Verify that pl_syscall_code in struct ptrace_lwpinfo for a new 1044 * child process created via vfork() reports the correct value. 1045 */ 1046 ATF_TC_WITHOUT_HEAD(ptrace__new_child_pl_syscall_code_vfork); 1047 ATF_TC_BODY(ptrace__new_child_pl_syscall_code_vfork, tc) 1048 { 1049 struct ptrace_lwpinfo pl[2]; 1050 pid_t children[2], fpid, wpid; 1051 int status; 1052 1053 ATF_REQUIRE((fpid = fork()) != -1); 1054 if (fpid == 0) { 1055 trace_me(); 1056 follow_fork_parent(true); 1057 } 1058 1059 /* Parent process. */ 1060 children[0] = fpid; 1061 1062 /* The first wait() should report the stop from SIGSTOP. */ 1063 wpid = waitpid(children[0], &status, 0); 1064 ATF_REQUIRE(wpid == children[0]); 1065 ATF_REQUIRE(WIFSTOPPED(status)); 1066 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 1067 1068 ATF_REQUIRE(ptrace(PT_FOLLOW_FORK, children[0], NULL, 1) != -1); 1069 1070 /* Continue the child ignoring the SIGSTOP. */ 1071 ATF_REQUIRE(ptrace(PT_CONTINUE, children[0], (caddr_t)1, 0) != -1); 1072 1073 /* Wait for both halves of the fork event to get reported. */ 1074 children[1] = handle_fork_events(children[0], pl); 1075 ATF_REQUIRE(children[1] > 0); 1076 1077 ATF_REQUIRE((pl[0].pl_flags & PL_FLAG_SCX) != 0); 1078 ATF_REQUIRE((pl[1].pl_flags & PL_FLAG_SCX) != 0); 1079 ATF_REQUIRE(pl[0].pl_syscall_code == SYS_vfork); 1080 ATF_REQUIRE(pl[0].pl_syscall_code == pl[1].pl_syscall_code); 1081 ATF_REQUIRE(pl[0].pl_syscall_narg == pl[1].pl_syscall_narg); 1082 1083 ATF_REQUIRE(ptrace(PT_CONTINUE, children[0], (caddr_t)1, 0) != -1); 1084 ATF_REQUIRE(ptrace(PT_CONTINUE, children[1], (caddr_t)1, 0) != -1); 1085 1086 /* 1087 * The child can't exit until the grandchild reports status, so the 1088 * grandchild should report its exit first to the debugger. 1089 */ 1090 wpid = wait(&status); 1091 ATF_REQUIRE(wpid == children[1]); 1092 ATF_REQUIRE(WIFEXITED(status)); 1093 ATF_REQUIRE(WEXITSTATUS(status) == 2); 1094 1095 wpid = wait(&status); 1096 ATF_REQUIRE(wpid == children[0]); 1097 ATF_REQUIRE(WIFEXITED(status)); 1098 ATF_REQUIRE(WEXITSTATUS(status) == 1); 1099 1100 wpid = wait(&status); 1101 ATF_REQUIRE(wpid == -1); 1102 ATF_REQUIRE(errno == ECHILD); 1103 } 1104 1105 static void * 1106 simple_thread(void *arg __unused) 1107 { 1108 1109 pthread_exit(NULL); 1110 } 1111 1112 static __dead2 void 1113 simple_thread_main(void) 1114 { 1115 pthread_t thread; 1116 1117 CHILD_REQUIRE(pthread_create(&thread, NULL, simple_thread, NULL) == 0); 1118 CHILD_REQUIRE(pthread_join(thread, NULL) == 0); 1119 exit(1); 1120 } 1121 1122 /* 1123 * Verify that pl_syscall_code in struct ptrace_lwpinfo for a new 1124 * thread reports the correct value. 1125 */ 1126 ATF_TC_WITHOUT_HEAD(ptrace__new_child_pl_syscall_code_thread); 1127 ATF_TC_BODY(ptrace__new_child_pl_syscall_code_thread, tc) 1128 { 1129 struct ptrace_lwpinfo pl; 1130 pid_t fpid, wpid; 1131 lwpid_t mainlwp; 1132 int status; 1133 1134 ATF_REQUIRE((fpid = fork()) != -1); 1135 if (fpid == 0) { 1136 trace_me(); 1137 simple_thread_main(); 1138 } 1139 1140 /* The first wait() should report the stop from SIGSTOP. */ 1141 wpid = waitpid(fpid, &status, 0); 1142 ATF_REQUIRE(wpid == fpid); 1143 ATF_REQUIRE(WIFSTOPPED(status)); 1144 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 1145 1146 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, 1147 sizeof(pl)) != -1); 1148 mainlwp = pl.pl_lwpid; 1149 1150 /* 1151 * Continue the child ignoring the SIGSTOP and tracing all 1152 * system call exits. 1153 */ 1154 ATF_REQUIRE(ptrace(PT_TO_SCX, fpid, (caddr_t)1, 0) != -1); 1155 1156 /* 1157 * Wait for the new thread to arrive. pthread_create() might 1158 * invoke any number of system calls. For now we just wait 1159 * for the new thread to arrive and make sure it reports a 1160 * valid system call code. If ptrace grows thread event 1161 * reporting then this test can be made more precise. 1162 */ 1163 for (;;) { 1164 wpid = waitpid(fpid, &status, 0); 1165 ATF_REQUIRE(wpid == fpid); 1166 ATF_REQUIRE(WIFSTOPPED(status)); 1167 ATF_REQUIRE(WSTOPSIG(status) == SIGTRAP); 1168 1169 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, 1170 sizeof(pl)) != -1); 1171 ATF_REQUIRE((pl.pl_flags & PL_FLAG_SCX) != 0); 1172 ATF_REQUIRE(pl.pl_syscall_code != 0); 1173 if (pl.pl_lwpid != mainlwp) 1174 /* New thread seen. */ 1175 break; 1176 1177 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 1178 } 1179 1180 /* Wait for the child to exit. */ 1181 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 1182 for (;;) { 1183 wpid = waitpid(fpid, &status, 0); 1184 ATF_REQUIRE(wpid == fpid); 1185 if (WIFEXITED(status)) 1186 break; 1187 1188 ATF_REQUIRE(WIFSTOPPED(status)); 1189 ATF_REQUIRE(WSTOPSIG(status) == SIGTRAP); 1190 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 1191 } 1192 1193 ATF_REQUIRE(WEXITSTATUS(status) == 1); 1194 1195 wpid = wait(&status); 1196 ATF_REQUIRE(wpid == -1); 1197 ATF_REQUIRE(errno == ECHILD); 1198 } 1199 1200 /* 1201 * Verify that the expected LWP events are reported for a child thread. 1202 */ 1203 ATF_TC_WITHOUT_HEAD(ptrace__lwp_events); 1204 ATF_TC_BODY(ptrace__lwp_events, tc) 1205 { 1206 struct ptrace_lwpinfo pl; 1207 pid_t fpid, wpid; 1208 lwpid_t lwps[2]; 1209 int status; 1210 1211 ATF_REQUIRE((fpid = fork()) != -1); 1212 if (fpid == 0) { 1213 trace_me(); 1214 simple_thread_main(); 1215 } 1216 1217 /* The first wait() should report the stop from SIGSTOP. */ 1218 wpid = waitpid(fpid, &status, 0); 1219 ATF_REQUIRE(wpid == fpid); 1220 ATF_REQUIRE(WIFSTOPPED(status)); 1221 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 1222 1223 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, 1224 sizeof(pl)) != -1); 1225 lwps[0] = pl.pl_lwpid; 1226 1227 ATF_REQUIRE(ptrace(PT_LWP_EVENTS, wpid, NULL, 1) == 0); 1228 1229 /* Continue the child ignoring the SIGSTOP. */ 1230 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 1231 1232 /* The first event should be for the child thread's birth. */ 1233 wpid = waitpid(fpid, &status, 0); 1234 ATF_REQUIRE(wpid == fpid); 1235 ATF_REQUIRE(WIFSTOPPED(status)); 1236 ATF_REQUIRE(WSTOPSIG(status) == SIGTRAP); 1237 1238 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 1239 ATF_REQUIRE((pl.pl_flags & (PL_FLAG_BORN | PL_FLAG_SCX)) == 1240 (PL_FLAG_BORN | PL_FLAG_SCX)); 1241 ATF_REQUIRE(pl.pl_lwpid != lwps[0]); 1242 lwps[1] = pl.pl_lwpid; 1243 1244 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 1245 1246 /* The next event should be for the child thread's death. */ 1247 wpid = waitpid(fpid, &status, 0); 1248 ATF_REQUIRE(wpid == fpid); 1249 ATF_REQUIRE(WIFSTOPPED(status)); 1250 ATF_REQUIRE(WSTOPSIG(status) == SIGTRAP); 1251 1252 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 1253 ATF_REQUIRE((pl.pl_flags & (PL_FLAG_EXITED | PL_FLAG_SCE)) == 1254 (PL_FLAG_EXITED | PL_FLAG_SCE)); 1255 ATF_REQUIRE(pl.pl_lwpid == lwps[1]); 1256 1257 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 1258 1259 /* The last event should be for the child process's exit. */ 1260 wpid = waitpid(fpid, &status, 0); 1261 ATF_REQUIRE(WIFEXITED(status)); 1262 ATF_REQUIRE(WEXITSTATUS(status) == 1); 1263 1264 wpid = wait(&status); 1265 ATF_REQUIRE(wpid == -1); 1266 ATF_REQUIRE(errno == ECHILD); 1267 } 1268 1269 static void * 1270 exec_thread(void *arg __unused) 1271 { 1272 1273 execl("/usr/bin/true", "true", NULL); 1274 exit(127); 1275 } 1276 1277 static __dead2 void 1278 exec_thread_main(void) 1279 { 1280 pthread_t thread; 1281 1282 CHILD_REQUIRE(pthread_create(&thread, NULL, exec_thread, NULL) == 0); 1283 for (;;) 1284 sleep(60); 1285 exit(1); 1286 } 1287 1288 /* 1289 * Verify that the expected LWP events are reported for a multithreaded 1290 * process that calls execve(2). 1291 */ 1292 ATF_TC_WITHOUT_HEAD(ptrace__lwp_events_exec); 1293 ATF_TC_BODY(ptrace__lwp_events_exec, tc) 1294 { 1295 struct ptrace_lwpinfo pl; 1296 pid_t fpid, wpid; 1297 lwpid_t lwps[2]; 1298 int status; 1299 1300 ATF_REQUIRE((fpid = fork()) != -1); 1301 if (fpid == 0) { 1302 trace_me(); 1303 exec_thread_main(); 1304 } 1305 1306 /* The first wait() should report the stop from SIGSTOP. */ 1307 wpid = waitpid(fpid, &status, 0); 1308 ATF_REQUIRE(wpid == fpid); 1309 ATF_REQUIRE(WIFSTOPPED(status)); 1310 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 1311 1312 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, 1313 sizeof(pl)) != -1); 1314 lwps[0] = pl.pl_lwpid; 1315 1316 ATF_REQUIRE(ptrace(PT_LWP_EVENTS, wpid, NULL, 1) == 0); 1317 1318 /* Continue the child ignoring the SIGSTOP. */ 1319 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 1320 1321 /* The first event should be for the child thread's birth. */ 1322 wpid = waitpid(fpid, &status, 0); 1323 ATF_REQUIRE(wpid == fpid); 1324 ATF_REQUIRE(WIFSTOPPED(status)); 1325 ATF_REQUIRE(WSTOPSIG(status) == SIGTRAP); 1326 1327 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 1328 ATF_REQUIRE((pl.pl_flags & (PL_FLAG_BORN | PL_FLAG_SCX)) == 1329 (PL_FLAG_BORN | PL_FLAG_SCX)); 1330 ATF_REQUIRE(pl.pl_lwpid != lwps[0]); 1331 lwps[1] = pl.pl_lwpid; 1332 1333 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 1334 1335 /* 1336 * The next event should be for the main thread's death due to 1337 * single threading from execve(). 1338 */ 1339 wpid = waitpid(fpid, &status, 0); 1340 ATF_REQUIRE(wpid == fpid); 1341 ATF_REQUIRE(WIFSTOPPED(status)); 1342 ATF_REQUIRE(WSTOPSIG(status) == SIGTRAP); 1343 1344 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 1345 ATF_REQUIRE((pl.pl_flags & (PL_FLAG_EXITED | PL_FLAG_SCE)) == 1346 (PL_FLAG_EXITED)); 1347 ATF_REQUIRE(pl.pl_lwpid == lwps[0]); 1348 1349 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 1350 1351 /* The next event should be for the child process's exec. */ 1352 wpid = waitpid(fpid, &status, 0); 1353 ATF_REQUIRE(WIFSTOPPED(status)); 1354 ATF_REQUIRE(WSTOPSIG(status) == SIGTRAP); 1355 1356 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 1357 ATF_REQUIRE((pl.pl_flags & (PL_FLAG_EXEC | PL_FLAG_SCX)) == 1358 (PL_FLAG_EXEC | PL_FLAG_SCX)); 1359 ATF_REQUIRE(pl.pl_lwpid == lwps[1]); 1360 1361 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 1362 1363 /* The last event should be for the child process's exit. */ 1364 wpid = waitpid(fpid, &status, 0); 1365 ATF_REQUIRE(WIFEXITED(status)); 1366 ATF_REQUIRE(WEXITSTATUS(status) == 0); 1367 1368 wpid = wait(&status); 1369 ATF_REQUIRE(wpid == -1); 1370 ATF_REQUIRE(errno == ECHILD); 1371 } 1372 1373 static void 1374 handler(int sig __unused) 1375 { 1376 } 1377 1378 static void 1379 signal_main(void) 1380 { 1381 1382 signal(SIGINFO, handler); 1383 raise(SIGINFO); 1384 exit(0); 1385 } 1386 1387 /* 1388 * Verify that the expected ptrace event is reported for a signal. 1389 */ 1390 ATF_TC_WITHOUT_HEAD(ptrace__siginfo); 1391 ATF_TC_BODY(ptrace__siginfo, tc) 1392 { 1393 struct ptrace_lwpinfo pl; 1394 pid_t fpid, wpid; 1395 int status; 1396 1397 ATF_REQUIRE((fpid = fork()) != -1); 1398 if (fpid == 0) { 1399 trace_me(); 1400 signal_main(); 1401 } 1402 1403 /* The first wait() should report the stop from SIGSTOP. */ 1404 wpid = waitpid(fpid, &status, 0); 1405 ATF_REQUIRE(wpid == fpid); 1406 ATF_REQUIRE(WIFSTOPPED(status)); 1407 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 1408 1409 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 1410 1411 /* The next event should be for the SIGINFO. */ 1412 wpid = waitpid(fpid, &status, 0); 1413 ATF_REQUIRE(WIFSTOPPED(status)); 1414 ATF_REQUIRE(WSTOPSIG(status) == SIGINFO); 1415 1416 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 1417 ATF_REQUIRE(pl.pl_event == PL_EVENT_SIGNAL); 1418 ATF_REQUIRE(pl.pl_flags & PL_FLAG_SI); 1419 ATF_REQUIRE(pl.pl_siginfo.si_code == SI_LWP); 1420 ATF_REQUIRE(pl.pl_siginfo.si_pid == wpid); 1421 1422 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 1423 1424 /* The last event should be for the child process's exit. */ 1425 wpid = waitpid(fpid, &status, 0); 1426 ATF_REQUIRE(WIFEXITED(status)); 1427 ATF_REQUIRE(WEXITSTATUS(status) == 0); 1428 1429 wpid = wait(&status); 1430 ATF_REQUIRE(wpid == -1); 1431 ATF_REQUIRE(errno == ECHILD); 1432 } 1433 1434 /* 1435 * Verify that the expected ptrace events are reported for PTRACE_EXEC. 1436 */ 1437 ATF_TC_WITHOUT_HEAD(ptrace__ptrace_exec_disable); 1438 ATF_TC_BODY(ptrace__ptrace_exec_disable, tc) 1439 { 1440 pid_t fpid, wpid; 1441 int events, status; 1442 1443 ATF_REQUIRE((fpid = fork()) != -1); 1444 if (fpid == 0) { 1445 trace_me(); 1446 exec_thread(NULL); 1447 } 1448 1449 /* The first wait() should report the stop from SIGSTOP. */ 1450 wpid = waitpid(fpid, &status, 0); 1451 ATF_REQUIRE(wpid == fpid); 1452 ATF_REQUIRE(WIFSTOPPED(status)); 1453 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 1454 1455 events = 0; 1456 ATF_REQUIRE(ptrace(PT_SET_EVENT_MASK, fpid, (caddr_t)&events, 1457 sizeof(events)) == 0); 1458 1459 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 1460 1461 /* Should get one event at exit. */ 1462 wpid = waitpid(fpid, &status, 0); 1463 ATF_REQUIRE(WIFEXITED(status)); 1464 ATF_REQUIRE(WEXITSTATUS(status) == 0); 1465 1466 wpid = wait(&status); 1467 ATF_REQUIRE(wpid == -1); 1468 ATF_REQUIRE(errno == ECHILD); 1469 } 1470 1471 ATF_TC_WITHOUT_HEAD(ptrace__ptrace_exec_enable); 1472 ATF_TC_BODY(ptrace__ptrace_exec_enable, tc) 1473 { 1474 struct ptrace_lwpinfo pl; 1475 pid_t fpid, wpid; 1476 int events, status; 1477 1478 ATF_REQUIRE((fpid = fork()) != -1); 1479 if (fpid == 0) { 1480 trace_me(); 1481 exec_thread(NULL); 1482 } 1483 1484 /* The first wait() should report the stop from SIGSTOP. */ 1485 wpid = waitpid(fpid, &status, 0); 1486 ATF_REQUIRE(wpid == fpid); 1487 ATF_REQUIRE(WIFSTOPPED(status)); 1488 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 1489 1490 events = PTRACE_EXEC; 1491 ATF_REQUIRE(ptrace(PT_SET_EVENT_MASK, fpid, (caddr_t)&events, 1492 sizeof(events)) == 0); 1493 1494 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 1495 1496 /* The next event should be for the child process's exec. */ 1497 wpid = waitpid(fpid, &status, 0); 1498 ATF_REQUIRE(WIFSTOPPED(status)); 1499 ATF_REQUIRE(WSTOPSIG(status) == SIGTRAP); 1500 1501 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 1502 ATF_REQUIRE((pl.pl_flags & (PL_FLAG_EXEC | PL_FLAG_SCX)) == 1503 (PL_FLAG_EXEC | PL_FLAG_SCX)); 1504 1505 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 1506 1507 /* The last event should be for the child process's exit. */ 1508 wpid = waitpid(fpid, &status, 0); 1509 ATF_REQUIRE(WIFEXITED(status)); 1510 ATF_REQUIRE(WEXITSTATUS(status) == 0); 1511 1512 wpid = wait(&status); 1513 ATF_REQUIRE(wpid == -1); 1514 ATF_REQUIRE(errno == ECHILD); 1515 } 1516 1517 ATF_TC_WITHOUT_HEAD(ptrace__event_mask); 1518 ATF_TC_BODY(ptrace__event_mask, tc) 1519 { 1520 pid_t fpid, wpid; 1521 int events, status; 1522 1523 ATF_REQUIRE((fpid = fork()) != -1); 1524 if (fpid == 0) { 1525 trace_me(); 1526 exit(0); 1527 } 1528 1529 /* The first wait() should report the stop from SIGSTOP. */ 1530 wpid = waitpid(fpid, &status, 0); 1531 ATF_REQUIRE(wpid == fpid); 1532 ATF_REQUIRE(WIFSTOPPED(status)); 1533 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 1534 1535 /* PT_FOLLOW_FORK should toggle the state of PTRACE_FORK. */ 1536 ATF_REQUIRE(ptrace(PT_FOLLOW_FORK, fpid, NULL, 1) != -1); 1537 ATF_REQUIRE(ptrace(PT_GET_EVENT_MASK, fpid, (caddr_t)&events, 1538 sizeof(events)) == 0); 1539 ATF_REQUIRE(events & PTRACE_FORK); 1540 ATF_REQUIRE(ptrace(PT_FOLLOW_FORK, fpid, NULL, 0) != -1); 1541 ATF_REQUIRE(ptrace(PT_GET_EVENT_MASK, fpid, (caddr_t)&events, 1542 sizeof(events)) == 0); 1543 ATF_REQUIRE(!(events & PTRACE_FORK)); 1544 1545 /* PT_LWP_EVENTS should toggle the state of PTRACE_LWP. */ 1546 ATF_REQUIRE(ptrace(PT_LWP_EVENTS, fpid, NULL, 1) != -1); 1547 ATF_REQUIRE(ptrace(PT_GET_EVENT_MASK, fpid, (caddr_t)&events, 1548 sizeof(events)) == 0); 1549 ATF_REQUIRE(events & PTRACE_LWP); 1550 ATF_REQUIRE(ptrace(PT_LWP_EVENTS, fpid, NULL, 0) != -1); 1551 ATF_REQUIRE(ptrace(PT_GET_EVENT_MASK, fpid, (caddr_t)&events, 1552 sizeof(events)) == 0); 1553 ATF_REQUIRE(!(events & PTRACE_LWP)); 1554 1555 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 1556 1557 /* Should get one event at exit. */ 1558 wpid = waitpid(fpid, &status, 0); 1559 ATF_REQUIRE(WIFEXITED(status)); 1560 ATF_REQUIRE(WEXITSTATUS(status) == 0); 1561 1562 wpid = wait(&status); 1563 ATF_REQUIRE(wpid == -1); 1564 ATF_REQUIRE(errno == ECHILD); 1565 } 1566 1567 /* 1568 * Verify that the expected ptrace events are reported for PTRACE_VFORK. 1569 */ 1570 ATF_TC_WITHOUT_HEAD(ptrace__ptrace_vfork); 1571 ATF_TC_BODY(ptrace__ptrace_vfork, tc) 1572 { 1573 struct ptrace_lwpinfo pl; 1574 pid_t fpid, wpid; 1575 int events, status; 1576 1577 ATF_REQUIRE((fpid = fork()) != -1); 1578 if (fpid == 0) { 1579 trace_me(); 1580 follow_fork_parent(true); 1581 } 1582 1583 /* The first wait() should report the stop from SIGSTOP. */ 1584 wpid = waitpid(fpid, &status, 0); 1585 ATF_REQUIRE(wpid == fpid); 1586 ATF_REQUIRE(WIFSTOPPED(status)); 1587 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 1588 1589 ATF_REQUIRE(ptrace(PT_GET_EVENT_MASK, fpid, (caddr_t)&events, 1590 sizeof(events)) == 0); 1591 events |= PTRACE_VFORK; 1592 ATF_REQUIRE(ptrace(PT_SET_EVENT_MASK, fpid, (caddr_t)&events, 1593 sizeof(events)) == 0); 1594 1595 /* Continue the child ignoring the SIGSTOP. */ 1596 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) != -1); 1597 1598 /* The next event should report the end of the vfork. */ 1599 wpid = wait(&status); 1600 ATF_REQUIRE(wpid == fpid); 1601 ATF_REQUIRE(WIFSTOPPED(status)); 1602 ATF_REQUIRE(WSTOPSIG(status) == SIGTRAP); 1603 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 1604 ATF_REQUIRE((pl.pl_flags & PL_FLAG_VFORK_DONE) != 0); 1605 1606 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) != -1); 1607 1608 wpid = wait(&status); 1609 ATF_REQUIRE(wpid == fpid); 1610 ATF_REQUIRE(WIFEXITED(status)); 1611 ATF_REQUIRE(WEXITSTATUS(status) == 1); 1612 1613 wpid = wait(&status); 1614 ATF_REQUIRE(wpid == -1); 1615 ATF_REQUIRE(errno == ECHILD); 1616 } 1617 1618 ATF_TC_WITHOUT_HEAD(ptrace__ptrace_vfork_follow); 1619 ATF_TC_BODY(ptrace__ptrace_vfork_follow, tc) 1620 { 1621 struct ptrace_lwpinfo pl[2]; 1622 pid_t children[2], fpid, wpid; 1623 int events, status; 1624 1625 ATF_REQUIRE((fpid = fork()) != -1); 1626 if (fpid == 0) { 1627 trace_me(); 1628 follow_fork_parent(true); 1629 } 1630 1631 /* Parent process. */ 1632 children[0] = fpid; 1633 1634 /* The first wait() should report the stop from SIGSTOP. */ 1635 wpid = waitpid(children[0], &status, 0); 1636 ATF_REQUIRE(wpid == children[0]); 1637 ATF_REQUIRE(WIFSTOPPED(status)); 1638 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 1639 1640 ATF_REQUIRE(ptrace(PT_GET_EVENT_MASK, children[0], (caddr_t)&events, 1641 sizeof(events)) == 0); 1642 events |= PTRACE_FORK | PTRACE_VFORK; 1643 ATF_REQUIRE(ptrace(PT_SET_EVENT_MASK, children[0], (caddr_t)&events, 1644 sizeof(events)) == 0); 1645 1646 /* Continue the child ignoring the SIGSTOP. */ 1647 ATF_REQUIRE(ptrace(PT_CONTINUE, children[0], (caddr_t)1, 0) != -1); 1648 1649 /* Wait for both halves of the fork event to get reported. */ 1650 children[1] = handle_fork_events(children[0], pl); 1651 ATF_REQUIRE(children[1] > 0); 1652 1653 ATF_REQUIRE((pl[0].pl_flags & PL_FLAG_VFORKED) != 0); 1654 1655 ATF_REQUIRE(ptrace(PT_CONTINUE, children[0], (caddr_t)1, 0) != -1); 1656 ATF_REQUIRE(ptrace(PT_CONTINUE, children[1], (caddr_t)1, 0) != -1); 1657 1658 /* 1659 * The child can't exit until the grandchild reports status, so the 1660 * grandchild should report its exit first to the debugger. 1661 */ 1662 wpid = waitpid(children[1], &status, 0); 1663 ATF_REQUIRE(wpid == children[1]); 1664 ATF_REQUIRE(WIFEXITED(status)); 1665 ATF_REQUIRE(WEXITSTATUS(status) == 2); 1666 1667 /* 1668 * The child should report it's vfork() completion before it 1669 * exits. 1670 */ 1671 wpid = wait(&status); 1672 ATF_REQUIRE(wpid == children[0]); 1673 ATF_REQUIRE(WIFSTOPPED(status)); 1674 ATF_REQUIRE(WSTOPSIG(status) == SIGTRAP); 1675 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl[0], sizeof(pl[0])) != 1676 -1); 1677 ATF_REQUIRE((pl[0].pl_flags & PL_FLAG_VFORK_DONE) != 0); 1678 1679 ATF_REQUIRE(ptrace(PT_CONTINUE, children[0], (caddr_t)1, 0) != -1); 1680 1681 wpid = wait(&status); 1682 ATF_REQUIRE(wpid == children[0]); 1683 ATF_REQUIRE(WIFEXITED(status)); 1684 ATF_REQUIRE(WEXITSTATUS(status) == 1); 1685 1686 wpid = wait(&status); 1687 ATF_REQUIRE(wpid == -1); 1688 ATF_REQUIRE(errno == ECHILD); 1689 } 1690 1691 /* 1692 * XXX: There's nothing inherently platform specific about this test, however a 1693 * userspace visible breakpoint() is a prerequisite. 1694 */ 1695 #if defined(__amd64__) || defined(__i386__) || defined(__sparc64__) 1696 /* 1697 * Verify that no more events are reported after PT_KILL except for the 1698 * process exit when stopped due to a breakpoint trap. 1699 */ 1700 ATF_TC_WITHOUT_HEAD(ptrace__PT_KILL_breakpoint); 1701 ATF_TC_BODY(ptrace__PT_KILL_breakpoint, tc) 1702 { 1703 pid_t fpid, wpid; 1704 int status; 1705 1706 ATF_REQUIRE((fpid = fork()) != -1); 1707 if (fpid == 0) { 1708 trace_me(); 1709 breakpoint(); 1710 exit(1); 1711 } 1712 1713 /* The first wait() should report the stop from SIGSTOP. */ 1714 wpid = waitpid(fpid, &status, 0); 1715 ATF_REQUIRE(wpid == fpid); 1716 ATF_REQUIRE(WIFSTOPPED(status)); 1717 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 1718 1719 /* Continue the child ignoring the SIGSTOP. */ 1720 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 1721 1722 /* The second wait() should report hitting the breakpoint. */ 1723 wpid = waitpid(fpid, &status, 0); 1724 ATF_REQUIRE(wpid == fpid); 1725 ATF_REQUIRE(WIFSTOPPED(status)); 1726 ATF_REQUIRE(WSTOPSIG(status) == SIGTRAP); 1727 1728 /* Kill the child process. */ 1729 ATF_REQUIRE(ptrace(PT_KILL, fpid, 0, 0) == 0); 1730 1731 /* The last wait() should report the SIGKILL. */ 1732 wpid = waitpid(fpid, &status, 0); 1733 ATF_REQUIRE(wpid == fpid); 1734 ATF_REQUIRE(WIFSIGNALED(status)); 1735 ATF_REQUIRE(WTERMSIG(status) == SIGKILL); 1736 1737 wpid = wait(&status); 1738 ATF_REQUIRE(wpid == -1); 1739 ATF_REQUIRE(errno == ECHILD); 1740 } 1741 #endif /* defined(__amd64__) || defined(__i386__) || defined(__sparc64__) */ 1742 1743 /* 1744 * Verify that no more events are reported after PT_KILL except for the 1745 * process exit when stopped inside of a system call. 1746 */ 1747 ATF_TC_WITHOUT_HEAD(ptrace__PT_KILL_system_call); 1748 ATF_TC_BODY(ptrace__PT_KILL_system_call, tc) 1749 { 1750 struct ptrace_lwpinfo pl; 1751 pid_t fpid, wpid; 1752 int status; 1753 1754 ATF_REQUIRE((fpid = fork()) != -1); 1755 if (fpid == 0) { 1756 trace_me(); 1757 getpid(); 1758 exit(1); 1759 } 1760 1761 /* The first wait() should report the stop from SIGSTOP. */ 1762 wpid = waitpid(fpid, &status, 0); 1763 ATF_REQUIRE(wpid == fpid); 1764 ATF_REQUIRE(WIFSTOPPED(status)); 1765 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 1766 1767 /* Continue the child ignoring the SIGSTOP and tracing system calls. */ 1768 ATF_REQUIRE(ptrace(PT_SYSCALL, fpid, (caddr_t)1, 0) == 0); 1769 1770 /* The second wait() should report a system call entry for getpid(). */ 1771 wpid = waitpid(fpid, &status, 0); 1772 ATF_REQUIRE(wpid == fpid); 1773 ATF_REQUIRE(WIFSTOPPED(status)); 1774 ATF_REQUIRE(WSTOPSIG(status) == SIGTRAP); 1775 1776 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 1777 ATF_REQUIRE(pl.pl_flags & PL_FLAG_SCE); 1778 1779 /* Kill the child process. */ 1780 ATF_REQUIRE(ptrace(PT_KILL, fpid, 0, 0) == 0); 1781 1782 /* The last wait() should report the SIGKILL. */ 1783 wpid = waitpid(fpid, &status, 0); 1784 ATF_REQUIRE(wpid == fpid); 1785 ATF_REQUIRE(WIFSIGNALED(status)); 1786 ATF_REQUIRE(WTERMSIG(status) == SIGKILL); 1787 1788 wpid = wait(&status); 1789 ATF_REQUIRE(wpid == -1); 1790 ATF_REQUIRE(errno == ECHILD); 1791 } 1792 1793 /* 1794 * Verify that no more events are reported after PT_KILL except for the 1795 * process exit when killing a multithreaded process. 1796 */ 1797 ATF_TC_WITHOUT_HEAD(ptrace__PT_KILL_threads); 1798 ATF_TC_BODY(ptrace__PT_KILL_threads, tc) 1799 { 1800 struct ptrace_lwpinfo pl; 1801 pid_t fpid, wpid; 1802 lwpid_t main_lwp; 1803 int status; 1804 1805 ATF_REQUIRE((fpid = fork()) != -1); 1806 if (fpid == 0) { 1807 trace_me(); 1808 simple_thread_main(); 1809 } 1810 1811 /* The first wait() should report the stop from SIGSTOP. */ 1812 wpid = waitpid(fpid, &status, 0); 1813 ATF_REQUIRE(wpid == fpid); 1814 ATF_REQUIRE(WIFSTOPPED(status)); 1815 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 1816 1817 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, 1818 sizeof(pl)) != -1); 1819 main_lwp = pl.pl_lwpid; 1820 1821 ATF_REQUIRE(ptrace(PT_LWP_EVENTS, wpid, NULL, 1) == 0); 1822 1823 /* Continue the child ignoring the SIGSTOP. */ 1824 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 1825 1826 /* The first event should be for the child thread's birth. */ 1827 wpid = waitpid(fpid, &status, 0); 1828 ATF_REQUIRE(wpid == fpid); 1829 ATF_REQUIRE(WIFSTOPPED(status)); 1830 ATF_REQUIRE(WSTOPSIG(status) == SIGTRAP); 1831 1832 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 1833 ATF_REQUIRE((pl.pl_flags & (PL_FLAG_BORN | PL_FLAG_SCX)) == 1834 (PL_FLAG_BORN | PL_FLAG_SCX)); 1835 ATF_REQUIRE(pl.pl_lwpid != main_lwp); 1836 1837 /* Kill the child process. */ 1838 ATF_REQUIRE(ptrace(PT_KILL, fpid, 0, 0) == 0); 1839 1840 /* The last wait() should report the SIGKILL. */ 1841 wpid = waitpid(fpid, &status, 0); 1842 ATF_REQUIRE(wpid == fpid); 1843 ATF_REQUIRE(WIFSIGNALED(status)); 1844 ATF_REQUIRE(WTERMSIG(status) == SIGKILL); 1845 1846 wpid = wait(&status); 1847 ATF_REQUIRE(wpid == -1); 1848 ATF_REQUIRE(errno == ECHILD); 1849 } 1850 1851 static void * 1852 mask_usr1_thread(void *arg) 1853 { 1854 pthread_barrier_t *pbarrier; 1855 sigset_t sigmask; 1856 1857 pbarrier = (pthread_barrier_t*)arg; 1858 1859 sigemptyset(&sigmask); 1860 sigaddset(&sigmask, SIGUSR1); 1861 CHILD_REQUIRE(pthread_sigmask(SIG_BLOCK, &sigmask, NULL) == 0); 1862 1863 /* Sync up with other thread after sigmask updated. */ 1864 pthread_barrier_wait(pbarrier); 1865 1866 for (;;) 1867 sleep(60); 1868 1869 return (NULL); 1870 } 1871 1872 /* 1873 * Verify that the SIGKILL from PT_KILL takes priority over other signals 1874 * and prevents spurious stops due to those other signals. 1875 */ 1876 ATF_TC(ptrace__PT_KILL_competing_signal); 1877 ATF_TC_HEAD(ptrace__PT_KILL_competing_signal, tc) 1878 { 1879 1880 atf_tc_set_md_var(tc, "require.user", "root"); 1881 } 1882 ATF_TC_BODY(ptrace__PT_KILL_competing_signal, tc) 1883 { 1884 pid_t fpid, wpid; 1885 int status; 1886 cpuset_t setmask; 1887 pthread_t t; 1888 pthread_barrier_t barrier; 1889 struct sched_param sched_param; 1890 1891 ATF_REQUIRE((fpid = fork()) != -1); 1892 if (fpid == 0) { 1893 /* Bind to one CPU so only one thread at a time will run. */ 1894 CPU_ZERO(&setmask); 1895 CPU_SET(0, &setmask); 1896 cpusetid_t setid; 1897 CHILD_REQUIRE(cpuset(&setid) == 0); 1898 CHILD_REQUIRE(cpuset_setaffinity(CPU_LEVEL_CPUSET, 1899 CPU_WHICH_CPUSET, setid, sizeof(setmask), &setmask) == 0); 1900 1901 CHILD_REQUIRE(pthread_barrier_init(&barrier, NULL, 2) == 0); 1902 1903 CHILD_REQUIRE(pthread_create(&t, NULL, mask_usr1_thread, 1904 (void*)&barrier) == 0); 1905 1906 /* 1907 * Give the main thread higher priority. The test always 1908 * assumes that, if both threads are able to run, the main 1909 * thread runs first. 1910 */ 1911 sched_param.sched_priority = 1912 (sched_get_priority_max(SCHED_FIFO) + 1913 sched_get_priority_min(SCHED_FIFO)) / 2; 1914 CHILD_REQUIRE(pthread_setschedparam(pthread_self(), 1915 SCHED_FIFO, &sched_param) == 0); 1916 sched_param.sched_priority -= RQ_PPQ; 1917 CHILD_REQUIRE(pthread_setschedparam(t, SCHED_FIFO, 1918 &sched_param) == 0); 1919 1920 sigset_t sigmask; 1921 sigemptyset(&sigmask); 1922 sigaddset(&sigmask, SIGUSR2); 1923 CHILD_REQUIRE(pthread_sigmask(SIG_BLOCK, &sigmask, NULL) == 0); 1924 1925 /* Sync up with other thread after sigmask updated. */ 1926 pthread_barrier_wait(&barrier); 1927 1928 trace_me(); 1929 1930 for (;;) 1931 sleep(60); 1932 1933 exit(1); 1934 } 1935 1936 /* The first wait() should report the stop from SIGSTOP. */ 1937 wpid = waitpid(fpid, &status, 0); 1938 ATF_REQUIRE(wpid == fpid); 1939 ATF_REQUIRE(WIFSTOPPED(status)); 1940 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 1941 1942 /* Continue the child ignoring the SIGSTOP. */ 1943 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 1944 1945 /* Send a signal that only the second thread can handle. */ 1946 ATF_REQUIRE(kill(fpid, SIGUSR2) == 0); 1947 1948 /* The second wait() should report the SIGUSR2. */ 1949 wpid = waitpid(fpid, &status, 0); 1950 ATF_REQUIRE(wpid == fpid); 1951 ATF_REQUIRE(WIFSTOPPED(status)); 1952 ATF_REQUIRE(WSTOPSIG(status) == SIGUSR2); 1953 1954 /* Send a signal that only the first thread can handle. */ 1955 ATF_REQUIRE(kill(fpid, SIGUSR1) == 0); 1956 1957 /* Replace the SIGUSR2 with a kill. */ 1958 ATF_REQUIRE(ptrace(PT_KILL, fpid, 0, 0) == 0); 1959 1960 /* The last wait() should report the SIGKILL (not the SIGUSR signal). */ 1961 wpid = waitpid(fpid, &status, 0); 1962 ATF_REQUIRE(wpid == fpid); 1963 ATF_REQUIRE(WIFSIGNALED(status)); 1964 ATF_REQUIRE(WTERMSIG(status) == SIGKILL); 1965 1966 wpid = wait(&status); 1967 ATF_REQUIRE(wpid == -1); 1968 ATF_REQUIRE(errno == ECHILD); 1969 } 1970 1971 /* 1972 * Verify that the SIGKILL from PT_KILL takes priority over other stop events 1973 * and prevents spurious stops caused by those events. 1974 */ 1975 ATF_TC(ptrace__PT_KILL_competing_stop); 1976 ATF_TC_HEAD(ptrace__PT_KILL_competing_stop, tc) 1977 { 1978 1979 atf_tc_set_md_var(tc, "require.user", "root"); 1980 } 1981 ATF_TC_BODY(ptrace__PT_KILL_competing_stop, tc) 1982 { 1983 pid_t fpid, wpid; 1984 int status; 1985 cpuset_t setmask; 1986 pthread_t t; 1987 pthread_barrier_t barrier; 1988 lwpid_t main_lwp; 1989 struct ptrace_lwpinfo pl; 1990 struct sched_param sched_param; 1991 1992 ATF_REQUIRE((fpid = fork()) != -1); 1993 if (fpid == 0) { 1994 trace_me(); 1995 1996 /* Bind to one CPU so only one thread at a time will run. */ 1997 CPU_ZERO(&setmask); 1998 CPU_SET(0, &setmask); 1999 cpusetid_t setid; 2000 CHILD_REQUIRE(cpuset(&setid) == 0); 2001 CHILD_REQUIRE(cpuset_setaffinity(CPU_LEVEL_CPUSET, 2002 CPU_WHICH_CPUSET, setid, sizeof(setmask), &setmask) == 0); 2003 2004 CHILD_REQUIRE(pthread_barrier_init(&barrier, NULL, 2) == 0); 2005 2006 CHILD_REQUIRE(pthread_create(&t, NULL, mask_usr1_thread, 2007 (void*)&barrier) == 0); 2008 2009 /* 2010 * Give the main thread higher priority. The test always 2011 * assumes that, if both threads are able to run, the main 2012 * thread runs first. 2013 */ 2014 sched_param.sched_priority = 2015 (sched_get_priority_max(SCHED_FIFO) + 2016 sched_get_priority_min(SCHED_FIFO)) / 2; 2017 CHILD_REQUIRE(pthread_setschedparam(pthread_self(), 2018 SCHED_FIFO, &sched_param) == 0); 2019 sched_param.sched_priority -= RQ_PPQ; 2020 CHILD_REQUIRE(pthread_setschedparam(t, SCHED_FIFO, 2021 &sched_param) == 0); 2022 2023 sigset_t sigmask; 2024 sigemptyset(&sigmask); 2025 sigaddset(&sigmask, SIGUSR2); 2026 CHILD_REQUIRE(pthread_sigmask(SIG_BLOCK, &sigmask, NULL) == 0); 2027 2028 /* Sync up with other thread after sigmask updated. */ 2029 pthread_barrier_wait(&barrier); 2030 2031 /* Sync up with the test before doing the getpid(). */ 2032 raise(SIGSTOP); 2033 2034 getpid(); 2035 exit(1); 2036 } 2037 2038 /* The first wait() should report the stop from SIGSTOP. */ 2039 wpid = waitpid(fpid, &status, 0); 2040 ATF_REQUIRE(wpid == fpid); 2041 ATF_REQUIRE(WIFSTOPPED(status)); 2042 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 2043 2044 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 2045 main_lwp = pl.pl_lwpid; 2046 2047 /* Continue the child ignoring the SIGSTOP and tracing system calls. */ 2048 ATF_REQUIRE(ptrace(PT_SYSCALL, fpid, (caddr_t)1, 0) == 0); 2049 2050 /* 2051 * Continue until child is done with setup, which is indicated with 2052 * SIGSTOP. Ignore system calls in the meantime. 2053 */ 2054 for (;;) { 2055 wpid = waitpid(fpid, &status, 0); 2056 ATF_REQUIRE(wpid == fpid); 2057 ATF_REQUIRE(WIFSTOPPED(status)); 2058 if (WSTOPSIG(status) == SIGTRAP) { 2059 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, 2060 sizeof(pl)) != -1); 2061 ATF_REQUIRE(pl.pl_flags & (PL_FLAG_SCE | PL_FLAG_SCX)); 2062 } else { 2063 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 2064 break; 2065 } 2066 ATF_REQUIRE(ptrace(PT_SYSCALL, fpid, (caddr_t)1, 0) == 0); 2067 } 2068 2069 /* Proceed, allowing main thread to hit syscall entry for getpid(). */ 2070 ATF_REQUIRE(ptrace(PT_SYSCALL, fpid, (caddr_t)1, 0) == 0); 2071 2072 wpid = waitpid(fpid, &status, 0); 2073 ATF_REQUIRE(wpid == fpid); 2074 ATF_REQUIRE(WIFSTOPPED(status)); 2075 ATF_REQUIRE(WSTOPSIG(status) == SIGTRAP); 2076 2077 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, 2078 sizeof(pl)) != -1); 2079 ATF_REQUIRE(pl.pl_lwpid == main_lwp); 2080 ATF_REQUIRE(pl.pl_flags & PL_FLAG_SCE); 2081 /* Prevent the main thread from hitting its syscall exit for now. */ 2082 ATF_REQUIRE(ptrace(PT_SUSPEND, main_lwp, 0, 0) == 0); 2083 2084 /* 2085 * Proceed, allowing second thread to hit syscall exit for 2086 * pthread_barrier_wait(). 2087 */ 2088 ATF_REQUIRE(ptrace(PT_SYSCALL, fpid, (caddr_t)1, 0) == 0); 2089 2090 wpid = waitpid(fpid, &status, 0); 2091 ATF_REQUIRE(wpid == fpid); 2092 ATF_REQUIRE(WIFSTOPPED(status)); 2093 ATF_REQUIRE(WSTOPSIG(status) == SIGTRAP); 2094 2095 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, 2096 sizeof(pl)) != -1); 2097 ATF_REQUIRE(pl.pl_lwpid != main_lwp); 2098 ATF_REQUIRE(pl.pl_flags & PL_FLAG_SCX); 2099 2100 /* Send a signal that only the second thread can handle. */ 2101 ATF_REQUIRE(kill(fpid, SIGUSR2) == 0); 2102 2103 ATF_REQUIRE(ptrace(PT_SYSCALL, fpid, (caddr_t)1, 0) == 0); 2104 2105 /* The next wait() should report the SIGUSR2. */ 2106 wpid = waitpid(fpid, &status, 0); 2107 ATF_REQUIRE(wpid == fpid); 2108 ATF_REQUIRE(WIFSTOPPED(status)); 2109 ATF_REQUIRE(WSTOPSIG(status) == SIGUSR2); 2110 2111 /* Allow the main thread to try to finish its system call. */ 2112 ATF_REQUIRE(ptrace(PT_RESUME, main_lwp, 0, 0) == 0); 2113 2114 /* 2115 * At this point, the main thread is in the middle of a system call and 2116 * has been resumed. The second thread has taken a SIGUSR2 which will 2117 * be replaced with a SIGKILL below. The main thread will get to run 2118 * first. It should notice the kill request (even though the signal 2119 * replacement occurred in the other thread) and exit accordingly. It 2120 * should not stop for the system call exit event. 2121 */ 2122 2123 /* Replace the SIGUSR2 with a kill. */ 2124 ATF_REQUIRE(ptrace(PT_KILL, fpid, 0, 0) == 0); 2125 2126 /* The last wait() should report the SIGKILL (not a syscall exit). */ 2127 wpid = waitpid(fpid, &status, 0); 2128 ATF_REQUIRE(wpid == fpid); 2129 ATF_REQUIRE(WIFSIGNALED(status)); 2130 ATF_REQUIRE(WTERMSIG(status) == SIGKILL); 2131 2132 wpid = wait(&status); 2133 ATF_REQUIRE(wpid == -1); 2134 ATF_REQUIRE(errno == ECHILD); 2135 } 2136 2137 static void 2138 sigusr1_handler(int sig) 2139 { 2140 2141 CHILD_REQUIRE(sig == SIGUSR1); 2142 _exit(2); 2143 } 2144 2145 /* 2146 * Verify that even if the signal queue is full for a child process, 2147 * a PT_KILL will kill the process. 2148 */ 2149 ATF_TC_WITHOUT_HEAD(ptrace__PT_KILL_with_signal_full_sigqueue); 2150 ATF_TC_BODY(ptrace__PT_KILL_with_signal_full_sigqueue, tc) 2151 { 2152 pid_t fpid, wpid; 2153 int status; 2154 int max_pending_per_proc; 2155 size_t len; 2156 int i; 2157 2158 ATF_REQUIRE(signal(SIGUSR1, sigusr1_handler) != SIG_ERR); 2159 2160 ATF_REQUIRE((fpid = fork()) != -1); 2161 if (fpid == 0) { 2162 trace_me(); 2163 exit(1); 2164 } 2165 2166 /* The first wait() should report the stop from SIGSTOP. */ 2167 wpid = waitpid(fpid, &status, 0); 2168 ATF_REQUIRE(wpid == fpid); 2169 ATF_REQUIRE(WIFSTOPPED(status)); 2170 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 2171 2172 len = sizeof(max_pending_per_proc); 2173 ATF_REQUIRE(sysctlbyname("kern.sigqueue.max_pending_per_proc", 2174 &max_pending_per_proc, &len, NULL, 0) == 0); 2175 2176 /* Fill the signal queue. */ 2177 for (i = 0; i < max_pending_per_proc; ++i) 2178 ATF_REQUIRE(kill(fpid, SIGUSR1) == 0); 2179 2180 /* Kill the child process. */ 2181 ATF_REQUIRE(ptrace(PT_KILL, fpid, 0, 0) == 0); 2182 2183 /* The last wait() should report the SIGKILL. */ 2184 wpid = waitpid(fpid, &status, 0); 2185 ATF_REQUIRE(wpid == fpid); 2186 ATF_REQUIRE(WIFSIGNALED(status)); 2187 ATF_REQUIRE(WTERMSIG(status) == SIGKILL); 2188 2189 wpid = wait(&status); 2190 ATF_REQUIRE(wpid == -1); 2191 ATF_REQUIRE(errno == ECHILD); 2192 } 2193 2194 /* 2195 * Verify that when stopped at a system call entry, a signal can be 2196 * requested with PT_CONTINUE which will be delivered once the system 2197 * call is complete. 2198 */ 2199 ATF_TC_WITHOUT_HEAD(ptrace__PT_CONTINUE_with_signal_system_call_entry); 2200 ATF_TC_BODY(ptrace__PT_CONTINUE_with_signal_system_call_entry, tc) 2201 { 2202 struct ptrace_lwpinfo pl; 2203 pid_t fpid, wpid; 2204 int status; 2205 2206 ATF_REQUIRE(signal(SIGUSR1, sigusr1_handler) != SIG_ERR); 2207 2208 ATF_REQUIRE((fpid = fork()) != -1); 2209 if (fpid == 0) { 2210 trace_me(); 2211 getpid(); 2212 exit(1); 2213 } 2214 2215 /* The first wait() should report the stop from SIGSTOP. */ 2216 wpid = waitpid(fpid, &status, 0); 2217 ATF_REQUIRE(wpid == fpid); 2218 ATF_REQUIRE(WIFSTOPPED(status)); 2219 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 2220 2221 /* Continue the child ignoring the SIGSTOP and tracing system calls. */ 2222 ATF_REQUIRE(ptrace(PT_SYSCALL, fpid, (caddr_t)1, 0) == 0); 2223 2224 /* The second wait() should report a system call entry for getpid(). */ 2225 wpid = waitpid(fpid, &status, 0); 2226 ATF_REQUIRE(wpid == fpid); 2227 ATF_REQUIRE(WIFSTOPPED(status)); 2228 ATF_REQUIRE(WSTOPSIG(status) == SIGTRAP); 2229 2230 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 2231 ATF_REQUIRE(pl.pl_flags & PL_FLAG_SCE); 2232 2233 /* Continue the child process with a signal. */ 2234 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, SIGUSR1) == 0); 2235 2236 for (;;) { 2237 /* 2238 * The last wait() should report exit 2, i.e., a normal _exit 2239 * from the signal handler. In the meantime, catch and proceed 2240 * past any syscall stops. 2241 */ 2242 wpid = waitpid(fpid, &status, 0); 2243 ATF_REQUIRE(wpid == fpid); 2244 if (WIFSTOPPED(status) && WSTOPSIG(status) == SIGTRAP) { 2245 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 2246 ATF_REQUIRE(pl.pl_flags & (PL_FLAG_SCE | PL_FLAG_SCX)); 2247 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 2248 } else { 2249 ATF_REQUIRE(WIFEXITED(status)); 2250 ATF_REQUIRE(WEXITSTATUS(status) == 2); 2251 break; 2252 } 2253 } 2254 2255 wpid = wait(&status); 2256 ATF_REQUIRE(wpid == -1); 2257 ATF_REQUIRE(errno == ECHILD); 2258 } 2259 2260 static void 2261 sigusr1_counting_handler(int sig) 2262 { 2263 static int counter = 0; 2264 2265 CHILD_REQUIRE(sig == SIGUSR1); 2266 counter++; 2267 if (counter == 2) 2268 _exit(2); 2269 } 2270 2271 /* 2272 * Verify that, when continuing from a stop at system call entry and exit, 2273 * a signal can be requested from both stops, and both will be delivered when 2274 * the system call is complete. 2275 */ 2276 ATF_TC_WITHOUT_HEAD(ptrace__PT_CONTINUE_with_signal_system_call_entry_and_exit); 2277 ATF_TC_BODY(ptrace__PT_CONTINUE_with_signal_system_call_entry_and_exit, tc) 2278 { 2279 struct ptrace_lwpinfo pl; 2280 pid_t fpid, wpid; 2281 int status; 2282 2283 ATF_REQUIRE(signal(SIGUSR1, sigusr1_counting_handler) != SIG_ERR); 2284 2285 ATF_REQUIRE((fpid = fork()) != -1); 2286 if (fpid == 0) { 2287 trace_me(); 2288 getpid(); 2289 exit(1); 2290 } 2291 2292 /* The first wait() should report the stop from SIGSTOP. */ 2293 wpid = waitpid(fpid, &status, 0); 2294 ATF_REQUIRE(wpid == fpid); 2295 ATF_REQUIRE(WIFSTOPPED(status)); 2296 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 2297 2298 /* Continue the child ignoring the SIGSTOP and tracing system calls. */ 2299 ATF_REQUIRE(ptrace(PT_SYSCALL, fpid, (caddr_t)1, 0) == 0); 2300 2301 /* The second wait() should report a system call entry for getpid(). */ 2302 wpid = waitpid(fpid, &status, 0); 2303 ATF_REQUIRE(wpid == fpid); 2304 ATF_REQUIRE(WIFSTOPPED(status)); 2305 ATF_REQUIRE(WSTOPSIG(status) == SIGTRAP); 2306 2307 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 2308 ATF_REQUIRE(pl.pl_flags & PL_FLAG_SCE); 2309 2310 /* Continue the child process with a signal. */ 2311 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, SIGUSR1) == 0); 2312 2313 /* The third wait() should report a system call exit for getpid(). */ 2314 wpid = waitpid(fpid, &status, 0); 2315 ATF_REQUIRE(wpid == fpid); 2316 ATF_REQUIRE(WIFSTOPPED(status)); 2317 ATF_REQUIRE(WSTOPSIG(status) == SIGTRAP); 2318 2319 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 2320 ATF_REQUIRE(pl.pl_flags & PL_FLAG_SCX); 2321 2322 /* Continue the child process with a signal. */ 2323 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, SIGUSR1) == 0); 2324 2325 for (;;) { 2326 /* 2327 * The last wait() should report exit 2, i.e., a normal _exit 2328 * from the signal handler. In the meantime, catch and proceed 2329 * past any syscall stops. 2330 */ 2331 wpid = waitpid(fpid, &status, 0); 2332 ATF_REQUIRE(wpid == fpid); 2333 if (WIFSTOPPED(status) && WSTOPSIG(status) == SIGTRAP) { 2334 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 2335 ATF_REQUIRE(pl.pl_flags & (PL_FLAG_SCE | PL_FLAG_SCX)); 2336 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 2337 } else { 2338 ATF_REQUIRE(WIFEXITED(status)); 2339 ATF_REQUIRE(WEXITSTATUS(status) == 2); 2340 break; 2341 } 2342 } 2343 2344 wpid = wait(&status); 2345 ATF_REQUIRE(wpid == -1); 2346 ATF_REQUIRE(errno == ECHILD); 2347 } 2348 2349 /* 2350 * Verify that even if the signal queue is full for a child process, 2351 * a PT_CONTINUE with a signal will not result in loss of that signal. 2352 */ 2353 ATF_TC_WITHOUT_HEAD(ptrace__PT_CONTINUE_with_signal_full_sigqueue); 2354 ATF_TC_BODY(ptrace__PT_CONTINUE_with_signal_full_sigqueue, tc) 2355 { 2356 pid_t fpid, wpid; 2357 int status; 2358 int max_pending_per_proc; 2359 size_t len; 2360 int i; 2361 2362 ATF_REQUIRE(signal(SIGUSR2, handler) != SIG_ERR); 2363 ATF_REQUIRE(signal(SIGUSR1, sigusr1_handler) != SIG_ERR); 2364 2365 ATF_REQUIRE((fpid = fork()) != -1); 2366 if (fpid == 0) { 2367 trace_me(); 2368 exit(1); 2369 } 2370 2371 /* The first wait() should report the stop from SIGSTOP. */ 2372 wpid = waitpid(fpid, &status, 0); 2373 ATF_REQUIRE(wpid == fpid); 2374 ATF_REQUIRE(WIFSTOPPED(status)); 2375 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 2376 2377 len = sizeof(max_pending_per_proc); 2378 ATF_REQUIRE(sysctlbyname("kern.sigqueue.max_pending_per_proc", 2379 &max_pending_per_proc, &len, NULL, 0) == 0); 2380 2381 /* Fill the signal queue. */ 2382 for (i = 0; i < max_pending_per_proc; ++i) 2383 ATF_REQUIRE(kill(fpid, SIGUSR2) == 0); 2384 2385 /* Continue with signal. */ 2386 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, SIGUSR1) == 0); 2387 2388 for (;;) { 2389 wpid = waitpid(fpid, &status, 0); 2390 ATF_REQUIRE(wpid == fpid); 2391 if (WIFSTOPPED(status)) { 2392 ATF_REQUIRE(WSTOPSIG(status) == SIGUSR2); 2393 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 2394 } else { 2395 /* 2396 * The last wait() should report normal _exit from the 2397 * SIGUSR1 handler. 2398 */ 2399 ATF_REQUIRE(WIFEXITED(status)); 2400 ATF_REQUIRE(WEXITSTATUS(status) == 2); 2401 break; 2402 } 2403 } 2404 2405 wpid = wait(&status); 2406 ATF_REQUIRE(wpid == -1); 2407 ATF_REQUIRE(errno == ECHILD); 2408 } 2409 2410 static sem_t sigusr1_sem; 2411 static int got_usr1; 2412 2413 static void 2414 sigusr1_sempost_handler(int sig __unused) 2415 { 2416 2417 got_usr1++; 2418 CHILD_REQUIRE(sem_post(&sigusr1_sem) == 0); 2419 } 2420 2421 /* 2422 * Verify that even if the signal queue is full for a child process, 2423 * and the signal is masked, a PT_CONTINUE with a signal will not 2424 * result in loss of that signal. 2425 */ 2426 ATF_TC_WITHOUT_HEAD(ptrace__PT_CONTINUE_with_signal_masked_full_sigqueue); 2427 ATF_TC_BODY(ptrace__PT_CONTINUE_with_signal_masked_full_sigqueue, tc) 2428 { 2429 struct ptrace_lwpinfo pl; 2430 pid_t fpid, wpid; 2431 int status, err; 2432 int max_pending_per_proc; 2433 size_t len; 2434 int i; 2435 sigset_t sigmask; 2436 2437 ATF_REQUIRE(signal(SIGUSR2, handler) != SIG_ERR); 2438 ATF_REQUIRE(sem_init(&sigusr1_sem, 0, 0) == 0); 2439 ATF_REQUIRE(signal(SIGUSR1, sigusr1_sempost_handler) != SIG_ERR); 2440 2441 got_usr1 = 0; 2442 ATF_REQUIRE((fpid = fork()) != -1); 2443 if (fpid == 0) { 2444 CHILD_REQUIRE(sigemptyset(&sigmask) == 0); 2445 CHILD_REQUIRE(sigaddset(&sigmask, SIGUSR1) == 0); 2446 CHILD_REQUIRE(sigprocmask(SIG_BLOCK, &sigmask, NULL) == 0); 2447 2448 trace_me(); 2449 CHILD_REQUIRE(got_usr1 == 0); 2450 2451 /* Allow the pending SIGUSR1 in now. */ 2452 CHILD_REQUIRE(sigprocmask(SIG_UNBLOCK, &sigmask, NULL) == 0); 2453 /* Wait to receive the SIGUSR1. */ 2454 do { 2455 err = sem_wait(&sigusr1_sem); 2456 CHILD_REQUIRE(err == 0 || errno == EINTR); 2457 } while (err != 0 && errno == EINTR); 2458 CHILD_REQUIRE(got_usr1 == 1); 2459 exit(1); 2460 } 2461 2462 /* The first wait() should report the stop from SIGSTOP. */ 2463 wpid = waitpid(fpid, &status, 0); 2464 ATF_REQUIRE(wpid == fpid); 2465 ATF_REQUIRE(WIFSTOPPED(status)); 2466 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 2467 2468 len = sizeof(max_pending_per_proc); 2469 ATF_REQUIRE(sysctlbyname("kern.sigqueue.max_pending_per_proc", 2470 &max_pending_per_proc, &len, NULL, 0) == 0); 2471 2472 /* Fill the signal queue. */ 2473 for (i = 0; i < max_pending_per_proc; ++i) 2474 ATF_REQUIRE(kill(fpid, SIGUSR2) == 0); 2475 2476 /* Continue with signal. */ 2477 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, SIGUSR1) == 0); 2478 2479 /* Collect and ignore all of the SIGUSR2. */ 2480 for (i = 0; i < max_pending_per_proc; ++i) { 2481 wpid = waitpid(fpid, &status, 0); 2482 ATF_REQUIRE(wpid == fpid); 2483 ATF_REQUIRE(WIFSTOPPED(status)); 2484 ATF_REQUIRE(WSTOPSIG(status) == SIGUSR2); 2485 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 2486 } 2487 2488 /* Now our PT_CONTINUE'd SIGUSR1 should cause a stop after unmask. */ 2489 wpid = waitpid(fpid, &status, 0); 2490 ATF_REQUIRE(wpid == fpid); 2491 ATF_REQUIRE(WIFSTOPPED(status)); 2492 ATF_REQUIRE(WSTOPSIG(status) == SIGUSR1); 2493 ATF_REQUIRE(ptrace(PT_LWPINFO, fpid, (caddr_t)&pl, sizeof(pl)) != -1); 2494 ATF_REQUIRE(pl.pl_siginfo.si_signo == SIGUSR1); 2495 2496 /* Continue the child, ignoring the SIGUSR1. */ 2497 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 2498 2499 /* The last wait() should report exit after receiving SIGUSR1. */ 2500 wpid = waitpid(fpid, &status, 0); 2501 ATF_REQUIRE(wpid == fpid); 2502 ATF_REQUIRE(WIFEXITED(status)); 2503 ATF_REQUIRE(WEXITSTATUS(status) == 1); 2504 2505 wpid = wait(&status); 2506 ATF_REQUIRE(wpid == -1); 2507 ATF_REQUIRE(errno == ECHILD); 2508 } 2509 2510 /* 2511 * Verify that, after stopping due to a signal, that signal can be 2512 * replaced with another signal. 2513 */ 2514 ATF_TC_WITHOUT_HEAD(ptrace__PT_CONTINUE_change_sig); 2515 ATF_TC_BODY(ptrace__PT_CONTINUE_change_sig, tc) 2516 { 2517 struct ptrace_lwpinfo pl; 2518 pid_t fpid, wpid; 2519 int status; 2520 2521 ATF_REQUIRE((fpid = fork()) != -1); 2522 if (fpid == 0) { 2523 trace_me(); 2524 sleep(20); 2525 exit(1); 2526 } 2527 2528 /* The first wait() should report the stop from SIGSTOP. */ 2529 wpid = waitpid(fpid, &status, 0); 2530 ATF_REQUIRE(wpid == fpid); 2531 ATF_REQUIRE(WIFSTOPPED(status)); 2532 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 2533 2534 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 2535 2536 /* Send a signal without ptrace. */ 2537 ATF_REQUIRE(kill(fpid, SIGINT) == 0); 2538 2539 /* The second wait() should report a SIGINT was received. */ 2540 wpid = waitpid(fpid, &status, 0); 2541 ATF_REQUIRE(wpid == fpid); 2542 ATF_REQUIRE(WIFSTOPPED(status)); 2543 ATF_REQUIRE(WSTOPSIG(status) == SIGINT); 2544 2545 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 2546 ATF_REQUIRE(pl.pl_flags & PL_FLAG_SI); 2547 ATF_REQUIRE(pl.pl_siginfo.si_signo == SIGINT); 2548 2549 /* Continue the child process with a different signal. */ 2550 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, SIGTERM) == 0); 2551 2552 /* 2553 * The last wait() should report having died due to the new 2554 * signal, SIGTERM. 2555 */ 2556 wpid = waitpid(fpid, &status, 0); 2557 ATF_REQUIRE(wpid == fpid); 2558 ATF_REQUIRE(WIFSIGNALED(status)); 2559 ATF_REQUIRE(WTERMSIG(status) == SIGTERM); 2560 2561 wpid = wait(&status); 2562 ATF_REQUIRE(wpid == -1); 2563 ATF_REQUIRE(errno == ECHILD); 2564 } 2565 2566 /* 2567 * Verify that a signal can be passed through to the child even when there 2568 * was no true signal originally. Such cases arise when a SIGTRAP is 2569 * invented for e.g, system call stops. 2570 */ 2571 ATF_TC_WITHOUT_HEAD(ptrace__PT_CONTINUE_with_sigtrap_system_call_entry); 2572 ATF_TC_BODY(ptrace__PT_CONTINUE_with_sigtrap_system_call_entry, tc) 2573 { 2574 struct ptrace_lwpinfo pl; 2575 struct rlimit rl; 2576 pid_t fpid, wpid; 2577 int status; 2578 2579 ATF_REQUIRE((fpid = fork()) != -1); 2580 if (fpid == 0) { 2581 trace_me(); 2582 /* SIGTRAP expected to cause exit on syscall entry. */ 2583 rl.rlim_cur = rl.rlim_max = 0; 2584 ATF_REQUIRE(setrlimit(RLIMIT_CORE, &rl) == 0); 2585 getpid(); 2586 exit(1); 2587 } 2588 2589 /* The first wait() should report the stop from SIGSTOP. */ 2590 wpid = waitpid(fpid, &status, 0); 2591 ATF_REQUIRE(wpid == fpid); 2592 ATF_REQUIRE(WIFSTOPPED(status)); 2593 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 2594 2595 /* Continue the child ignoring the SIGSTOP and tracing system calls. */ 2596 ATF_REQUIRE(ptrace(PT_SYSCALL, fpid, (caddr_t)1, 0) == 0); 2597 2598 /* The second wait() should report a system call entry for getpid(). */ 2599 wpid = waitpid(fpid, &status, 0); 2600 ATF_REQUIRE(wpid == fpid); 2601 ATF_REQUIRE(WIFSTOPPED(status)); 2602 ATF_REQUIRE(WSTOPSIG(status) == SIGTRAP); 2603 2604 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 2605 ATF_REQUIRE(pl.pl_flags & PL_FLAG_SCE); 2606 2607 /* Continue the child process with a SIGTRAP. */ 2608 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, SIGTRAP) == 0); 2609 2610 for (;;) { 2611 /* 2612 * The last wait() should report exit due to SIGTRAP. In the 2613 * meantime, catch and proceed past any syscall stops. 2614 */ 2615 wpid = waitpid(fpid, &status, 0); 2616 ATF_REQUIRE(wpid == fpid); 2617 if (WIFSTOPPED(status) && WSTOPSIG(status) == SIGTRAP) { 2618 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 2619 ATF_REQUIRE(pl.pl_flags & (PL_FLAG_SCE | PL_FLAG_SCX)); 2620 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 2621 } else { 2622 ATF_REQUIRE(WIFSIGNALED(status)); 2623 ATF_REQUIRE(WTERMSIG(status) == SIGTRAP); 2624 break; 2625 } 2626 } 2627 2628 wpid = wait(&status); 2629 ATF_REQUIRE(wpid == -1); 2630 ATF_REQUIRE(errno == ECHILD); 2631 2632 } 2633 2634 /* 2635 * A mixed bag PT_CONTINUE with signal test. 2636 */ 2637 ATF_TC_WITHOUT_HEAD(ptrace__PT_CONTINUE_with_signal_mix); 2638 ATF_TC_BODY(ptrace__PT_CONTINUE_with_signal_mix, tc) 2639 { 2640 struct ptrace_lwpinfo pl; 2641 pid_t fpid, wpid; 2642 int status; 2643 2644 ATF_REQUIRE(signal(SIGUSR1, sigusr1_counting_handler) != SIG_ERR); 2645 2646 ATF_REQUIRE((fpid = fork()) != -1); 2647 if (fpid == 0) { 2648 trace_me(); 2649 getpid(); 2650 exit(1); 2651 } 2652 2653 /* The first wait() should report the stop from SIGSTOP. */ 2654 wpid = waitpid(fpid, &status, 0); 2655 ATF_REQUIRE(wpid == fpid); 2656 ATF_REQUIRE(WIFSTOPPED(status)); 2657 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 2658 2659 /* Continue the child ignoring the SIGSTOP and tracing system calls. */ 2660 ATF_REQUIRE(ptrace(PT_SYSCALL, fpid, (caddr_t)1, 0) == 0); 2661 2662 /* The second wait() should report a system call entry for getpid(). */ 2663 wpid = waitpid(fpid, &status, 0); 2664 ATF_REQUIRE(wpid == fpid); 2665 ATF_REQUIRE(WIFSTOPPED(status)); 2666 ATF_REQUIRE(WSTOPSIG(status) == SIGTRAP); 2667 2668 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 2669 ATF_REQUIRE(pl.pl_flags & PL_FLAG_SCE); 2670 2671 /* Continue with the first SIGUSR1. */ 2672 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, SIGUSR1) == 0); 2673 2674 /* The next wait() should report a system call exit for getpid(). */ 2675 wpid = waitpid(fpid, &status, 0); 2676 ATF_REQUIRE(wpid == fpid); 2677 ATF_REQUIRE(WIFSTOPPED(status)); 2678 ATF_REQUIRE(WSTOPSIG(status) == SIGTRAP); 2679 2680 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 2681 ATF_REQUIRE(pl.pl_flags & PL_FLAG_SCX); 2682 2683 /* Send an ABRT without ptrace. */ 2684 ATF_REQUIRE(kill(fpid, SIGABRT) == 0); 2685 2686 /* Continue normally. */ 2687 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 2688 2689 /* The next wait() should report the SIGABRT. */ 2690 wpid = waitpid(fpid, &status, 0); 2691 ATF_REQUIRE(wpid == fpid); 2692 ATF_REQUIRE(WIFSTOPPED(status)); 2693 ATF_REQUIRE(WSTOPSIG(status) == SIGABRT); 2694 2695 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 2696 ATF_REQUIRE(pl.pl_flags & PL_FLAG_SI); 2697 ATF_REQUIRE(pl.pl_siginfo.si_signo == SIGABRT); 2698 2699 /* Continue, replacing the SIGABRT with another SIGUSR1. */ 2700 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, SIGUSR1) == 0); 2701 2702 for (;;) { 2703 /* 2704 * The last wait() should report exit 2, i.e., a normal _exit 2705 * from the signal handler. In the meantime, catch and proceed 2706 * past any syscall stops. 2707 */ 2708 wpid = waitpid(fpid, &status, 0); 2709 ATF_REQUIRE(wpid == fpid); 2710 if (WIFSTOPPED(status) && WSTOPSIG(status) == SIGTRAP) { 2711 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 2712 ATF_REQUIRE(pl.pl_flags & (PL_FLAG_SCE | PL_FLAG_SCX)); 2713 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 2714 } else { 2715 ATF_REQUIRE(WIFEXITED(status)); 2716 ATF_REQUIRE(WEXITSTATUS(status) == 2); 2717 break; 2718 } 2719 } 2720 2721 wpid = wait(&status); 2722 ATF_REQUIRE(wpid == -1); 2723 ATF_REQUIRE(errno == ECHILD); 2724 2725 } 2726 2727 /* 2728 * Verify a signal delivered by ptrace is noticed by kevent(2). 2729 */ 2730 ATF_TC_WITHOUT_HEAD(ptrace__PT_CONTINUE_with_signal_kqueue); 2731 ATF_TC_BODY(ptrace__PT_CONTINUE_with_signal_kqueue, tc) 2732 { 2733 pid_t fpid, wpid; 2734 int status, kq, nevents; 2735 struct kevent kev; 2736 2737 ATF_REQUIRE(signal(SIGUSR1, SIG_IGN) != SIG_ERR); 2738 2739 ATF_REQUIRE((fpid = fork()) != -1); 2740 if (fpid == 0) { 2741 CHILD_REQUIRE((kq = kqueue()) > 0); 2742 EV_SET(&kev, SIGUSR1, EVFILT_SIGNAL, EV_ADD, 0, 0, 0); 2743 CHILD_REQUIRE(kevent(kq, &kev, 1, NULL, 0, NULL) == 0); 2744 2745 trace_me(); 2746 2747 for (;;) { 2748 nevents = kevent(kq, NULL, 0, &kev, 1, NULL); 2749 if (nevents == -1 && errno == EINTR) 2750 continue; 2751 CHILD_REQUIRE(nevents > 0); 2752 CHILD_REQUIRE(kev.filter == EVFILT_SIGNAL); 2753 CHILD_REQUIRE(kev.ident == SIGUSR1); 2754 break; 2755 } 2756 2757 exit(1); 2758 } 2759 2760 /* The first wait() should report the stop from SIGSTOP. */ 2761 wpid = waitpid(fpid, &status, 0); 2762 ATF_REQUIRE(wpid == fpid); 2763 ATF_REQUIRE(WIFSTOPPED(status)); 2764 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 2765 2766 /* Continue with the SIGUSR1. */ 2767 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, SIGUSR1) == 0); 2768 2769 /* 2770 * The last wait() should report normal exit with code 1. 2771 */ 2772 wpid = waitpid(fpid, &status, 0); 2773 ATF_REQUIRE(wpid == fpid); 2774 ATF_REQUIRE(WIFEXITED(status)); 2775 ATF_REQUIRE(WEXITSTATUS(status) == 1); 2776 2777 wpid = wait(&status); 2778 ATF_REQUIRE(wpid == -1); 2779 ATF_REQUIRE(errno == ECHILD); 2780 } 2781 2782 static void * 2783 signal_thread(void *arg) 2784 { 2785 int err; 2786 sigset_t sigmask; 2787 2788 pthread_barrier_t *pbarrier = (pthread_barrier_t*)arg; 2789 2790 /* Wait for this thread to receive a SIGUSR1. */ 2791 do { 2792 err = sem_wait(&sigusr1_sem); 2793 CHILD_REQUIRE(err == 0 || errno == EINTR); 2794 } while (err != 0 && errno == EINTR); 2795 2796 /* Free our companion thread from the barrier. */ 2797 pthread_barrier_wait(pbarrier); 2798 2799 /* 2800 * Swap ignore duties; the next SIGUSR1 should go to the 2801 * other thread. 2802 */ 2803 CHILD_REQUIRE(sigemptyset(&sigmask) == 0); 2804 CHILD_REQUIRE(sigaddset(&sigmask, SIGUSR1) == 0); 2805 CHILD_REQUIRE(pthread_sigmask(SIG_BLOCK, &sigmask, NULL) == 0); 2806 2807 /* Sync up threads after swapping signal masks. */ 2808 pthread_barrier_wait(pbarrier); 2809 2810 /* Wait until our companion has received its SIGUSR1. */ 2811 pthread_barrier_wait(pbarrier); 2812 2813 return (NULL); 2814 } 2815 2816 /* 2817 * Verify that a traced process with blocked signal received the 2818 * signal from kill() once unmasked. 2819 */ 2820 ATF_TC_WITHOUT_HEAD(ptrace__killed_with_sigmask); 2821 ATF_TC_BODY(ptrace__killed_with_sigmask, tc) 2822 { 2823 struct ptrace_lwpinfo pl; 2824 pid_t fpid, wpid; 2825 int status, err; 2826 sigset_t sigmask; 2827 2828 ATF_REQUIRE(sem_init(&sigusr1_sem, 0, 0) == 0); 2829 ATF_REQUIRE(signal(SIGUSR1, sigusr1_sempost_handler) != SIG_ERR); 2830 got_usr1 = 0; 2831 2832 ATF_REQUIRE((fpid = fork()) != -1); 2833 if (fpid == 0) { 2834 CHILD_REQUIRE(sigemptyset(&sigmask) == 0); 2835 CHILD_REQUIRE(sigaddset(&sigmask, SIGUSR1) == 0); 2836 CHILD_REQUIRE(sigprocmask(SIG_BLOCK, &sigmask, NULL) == 0); 2837 2838 trace_me(); 2839 CHILD_REQUIRE(got_usr1 == 0); 2840 2841 /* Allow the pending SIGUSR1 in now. */ 2842 CHILD_REQUIRE(sigprocmask(SIG_UNBLOCK, &sigmask, NULL) == 0); 2843 /* Wait to receive a SIGUSR1. */ 2844 do { 2845 err = sem_wait(&sigusr1_sem); 2846 CHILD_REQUIRE(err == 0 || errno == EINTR); 2847 } while (err != 0 && errno == EINTR); 2848 CHILD_REQUIRE(got_usr1 == 1); 2849 exit(1); 2850 } 2851 2852 /* The first wait() should report the stop from SIGSTOP. */ 2853 wpid = waitpid(fpid, &status, 0); 2854 ATF_REQUIRE(wpid == fpid); 2855 ATF_REQUIRE(WIFSTOPPED(status)); 2856 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 2857 ATF_REQUIRE(ptrace(PT_LWPINFO, fpid, (caddr_t)&pl, sizeof(pl)) != -1); 2858 ATF_REQUIRE(pl.pl_siginfo.si_signo == SIGSTOP); 2859 2860 /* Send blocked SIGUSR1 which should cause a stop. */ 2861 ATF_REQUIRE(kill(fpid, SIGUSR1) == 0); 2862 2863 /* Continue the child ignoring the SIGSTOP. */ 2864 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 2865 2866 /* The next wait() should report the kill(SIGUSR1) was received. */ 2867 wpid = waitpid(fpid, &status, 0); 2868 ATF_REQUIRE(wpid == fpid); 2869 ATF_REQUIRE(WIFSTOPPED(status)); 2870 ATF_REQUIRE(WSTOPSIG(status) == SIGUSR1); 2871 ATF_REQUIRE(ptrace(PT_LWPINFO, fpid, (caddr_t)&pl, sizeof(pl)) != -1); 2872 ATF_REQUIRE(pl.pl_siginfo.si_signo == SIGUSR1); 2873 2874 /* Continue the child, allowing in the SIGUSR1. */ 2875 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, SIGUSR1) == 0); 2876 2877 /* The last wait() should report normal exit with code 1. */ 2878 wpid = waitpid(fpid, &status, 0); 2879 ATF_REQUIRE(wpid == fpid); 2880 ATF_REQUIRE(WIFEXITED(status)); 2881 ATF_REQUIRE(WEXITSTATUS(status) == 1); 2882 2883 wpid = wait(&status); 2884 ATF_REQUIRE(wpid == -1); 2885 ATF_REQUIRE(errno == ECHILD); 2886 } 2887 2888 /* 2889 * Verify that a traced process with blocked signal received the 2890 * signal from PT_CONTINUE once unmasked. 2891 */ 2892 ATF_TC_WITHOUT_HEAD(ptrace__PT_CONTINUE_with_sigmask); 2893 ATF_TC_BODY(ptrace__PT_CONTINUE_with_sigmask, tc) 2894 { 2895 struct ptrace_lwpinfo pl; 2896 pid_t fpid, wpid; 2897 int status, err; 2898 sigset_t sigmask; 2899 2900 ATF_REQUIRE(sem_init(&sigusr1_sem, 0, 0) == 0); 2901 ATF_REQUIRE(signal(SIGUSR1, sigusr1_sempost_handler) != SIG_ERR); 2902 got_usr1 = 0; 2903 2904 ATF_REQUIRE((fpid = fork()) != -1); 2905 if (fpid == 0) { 2906 CHILD_REQUIRE(sigemptyset(&sigmask) == 0); 2907 CHILD_REQUIRE(sigaddset(&sigmask, SIGUSR1) == 0); 2908 CHILD_REQUIRE(sigprocmask(SIG_BLOCK, &sigmask, NULL) == 0); 2909 2910 trace_me(); 2911 CHILD_REQUIRE(got_usr1 == 0); 2912 2913 /* Allow the pending SIGUSR1 in now. */ 2914 CHILD_REQUIRE(sigprocmask(SIG_UNBLOCK, &sigmask, NULL) == 0); 2915 /* Wait to receive a SIGUSR1. */ 2916 do { 2917 err = sem_wait(&sigusr1_sem); 2918 CHILD_REQUIRE(err == 0 || errno == EINTR); 2919 } while (err != 0 && errno == EINTR); 2920 2921 CHILD_REQUIRE(got_usr1 == 1); 2922 exit(1); 2923 } 2924 2925 /* The first wait() should report the stop from SIGSTOP. */ 2926 wpid = waitpid(fpid, &status, 0); 2927 ATF_REQUIRE(wpid == fpid); 2928 ATF_REQUIRE(WIFSTOPPED(status)); 2929 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 2930 ATF_REQUIRE(ptrace(PT_LWPINFO, fpid, (caddr_t)&pl, sizeof(pl)) != -1); 2931 ATF_REQUIRE(pl.pl_siginfo.si_signo == SIGSTOP); 2932 2933 /* Continue the child replacing SIGSTOP with SIGUSR1. */ 2934 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, SIGUSR1) == 0); 2935 2936 /* The next wait() should report the SIGUSR1 was received. */ 2937 wpid = waitpid(fpid, &status, 0); 2938 ATF_REQUIRE(wpid == fpid); 2939 ATF_REQUIRE(WIFSTOPPED(status)); 2940 ATF_REQUIRE(WSTOPSIG(status) == SIGUSR1); 2941 ATF_REQUIRE(ptrace(PT_LWPINFO, fpid, (caddr_t)&pl, sizeof(pl)) != -1); 2942 ATF_REQUIRE(pl.pl_siginfo.si_signo == SIGUSR1); 2943 2944 /* Continue the child, ignoring the SIGUSR1. */ 2945 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 2946 2947 /* The last wait() should report normal exit with code 1. */ 2948 wpid = waitpid(fpid, &status, 0); 2949 ATF_REQUIRE(wpid == fpid); 2950 ATF_REQUIRE(WIFEXITED(status)); 2951 ATF_REQUIRE(WEXITSTATUS(status) == 1); 2952 2953 wpid = wait(&status); 2954 ATF_REQUIRE(wpid == -1); 2955 ATF_REQUIRE(errno == ECHILD); 2956 } 2957 2958 /* 2959 * Verify that if ptrace stops due to a signal but continues with 2960 * a different signal that the new signal is routed to a thread 2961 * that can accept it, and that the thread is awakened by the signal 2962 * in a timely manner. 2963 */ 2964 ATF_TC_WITHOUT_HEAD(ptrace__PT_CONTINUE_with_signal_thread_sigmask); 2965 ATF_TC_BODY(ptrace__PT_CONTINUE_with_signal_thread_sigmask, tc) 2966 { 2967 pid_t fpid, wpid; 2968 int status, err; 2969 pthread_t t; 2970 sigset_t sigmask; 2971 pthread_barrier_t barrier; 2972 2973 ATF_REQUIRE(pthread_barrier_init(&barrier, NULL, 2) == 0); 2974 ATF_REQUIRE(sem_init(&sigusr1_sem, 0, 0) == 0); 2975 ATF_REQUIRE(signal(SIGUSR1, sigusr1_sempost_handler) != SIG_ERR); 2976 2977 ATF_REQUIRE((fpid = fork()) != -1); 2978 if (fpid == 0) { 2979 CHILD_REQUIRE(pthread_create(&t, NULL, signal_thread, (void*)&barrier) == 0); 2980 2981 /* The other thread should receive the first SIGUSR1. */ 2982 CHILD_REQUIRE(sigemptyset(&sigmask) == 0); 2983 CHILD_REQUIRE(sigaddset(&sigmask, SIGUSR1) == 0); 2984 CHILD_REQUIRE(pthread_sigmask(SIG_BLOCK, &sigmask, NULL) == 0); 2985 2986 trace_me(); 2987 2988 /* Wait until other thread has received its SIGUSR1. */ 2989 pthread_barrier_wait(&barrier); 2990 2991 /* 2992 * Swap ignore duties; the next SIGUSR1 should go to this 2993 * thread. 2994 */ 2995 CHILD_REQUIRE(pthread_sigmask(SIG_UNBLOCK, &sigmask, NULL) == 0); 2996 2997 /* Sync up threads after swapping signal masks. */ 2998 pthread_barrier_wait(&barrier); 2999 3000 /* 3001 * Sync up with test code; we're ready for the next SIGUSR1 3002 * now. 3003 */ 3004 raise(SIGSTOP); 3005 3006 /* Wait for this thread to receive a SIGUSR1. */ 3007 do { 3008 err = sem_wait(&sigusr1_sem); 3009 CHILD_REQUIRE(err == 0 || errno == EINTR); 3010 } while (err != 0 && errno == EINTR); 3011 3012 /* Free the other thread from the barrier. */ 3013 pthread_barrier_wait(&barrier); 3014 3015 CHILD_REQUIRE(pthread_join(t, NULL) == 0); 3016 3017 exit(1); 3018 } 3019 3020 /* The first wait() should report the stop from SIGSTOP. */ 3021 wpid = waitpid(fpid, &status, 0); 3022 ATF_REQUIRE(wpid == fpid); 3023 ATF_REQUIRE(WIFSTOPPED(status)); 3024 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 3025 3026 /* Continue the child ignoring the SIGSTOP. */ 3027 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 3028 3029 /* 3030 * Send a signal without ptrace that either thread will accept (USR2, 3031 * in this case). 3032 */ 3033 ATF_REQUIRE(kill(fpid, SIGUSR2) == 0); 3034 3035 /* The second wait() should report a SIGUSR2 was received. */ 3036 wpid = waitpid(fpid, &status, 0); 3037 ATF_REQUIRE(wpid == fpid); 3038 ATF_REQUIRE(WIFSTOPPED(status)); 3039 ATF_REQUIRE(WSTOPSIG(status) == SIGUSR2); 3040 3041 /* Continue the child, changing the signal to USR1. */ 3042 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, SIGUSR1) == 0); 3043 3044 /* The next wait() should report the stop from SIGSTOP. */ 3045 wpid = waitpid(fpid, &status, 0); 3046 ATF_REQUIRE(wpid == fpid); 3047 ATF_REQUIRE(WIFSTOPPED(status)); 3048 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 3049 3050 /* Continue the child ignoring the SIGSTOP. */ 3051 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 3052 3053 ATF_REQUIRE(kill(fpid, SIGUSR2) == 0); 3054 3055 /* The next wait() should report a SIGUSR2 was received. */ 3056 wpid = waitpid(fpid, &status, 0); 3057 ATF_REQUIRE(wpid == fpid); 3058 ATF_REQUIRE(WIFSTOPPED(status)); 3059 ATF_REQUIRE(WSTOPSIG(status) == SIGUSR2); 3060 3061 /* Continue the child, changing the signal to USR1. */ 3062 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, SIGUSR1) == 0); 3063 3064 /* The last wait() should report normal exit with code 1. */ 3065 wpid = waitpid(fpid, &status, 0); 3066 ATF_REQUIRE(wpid == fpid); 3067 ATF_REQUIRE(WIFEXITED(status)); 3068 ATF_REQUIRE(WEXITSTATUS(status) == 1); 3069 3070 wpid = wait(&status); 3071 ATF_REQUIRE(wpid == -1); 3072 ATF_REQUIRE(errno == ECHILD); 3073 } 3074 3075 static void * 3076 raise_sigstop_thread(void *arg __unused) 3077 { 3078 3079 raise(SIGSTOP); 3080 return NULL; 3081 } 3082 3083 static void * 3084 sleep_thread(void *arg __unused) 3085 { 3086 3087 sleep(60); 3088 return NULL; 3089 } 3090 3091 static void 3092 terminate_with_pending_sigstop(bool sigstop_from_main_thread) 3093 { 3094 pid_t fpid, wpid; 3095 int status, i; 3096 cpuset_t setmask; 3097 cpusetid_t setid; 3098 pthread_t t; 3099 3100 /* 3101 * Become the reaper for this process tree. We need to be able to check 3102 * that both child and grandchild have died. 3103 */ 3104 ATF_REQUIRE(procctl(P_PID, getpid(), PROC_REAP_ACQUIRE, NULL) == 0); 3105 3106 fpid = fork(); 3107 ATF_REQUIRE(fpid >= 0); 3108 if (fpid == 0) { 3109 fpid = fork(); 3110 CHILD_REQUIRE(fpid >= 0); 3111 if (fpid == 0) { 3112 trace_me(); 3113 3114 /* Pin to CPU 0 to serialize thread execution. */ 3115 CPU_ZERO(&setmask); 3116 CPU_SET(0, &setmask); 3117 CHILD_REQUIRE(cpuset(&setid) == 0); 3118 CHILD_REQUIRE(cpuset_setaffinity(CPU_LEVEL_CPUSET, 3119 CPU_WHICH_CPUSET, setid, 3120 sizeof(setmask), &setmask) == 0); 3121 3122 if (sigstop_from_main_thread) { 3123 /* 3124 * We expect the SIGKILL sent when our parent 3125 * dies to be delivered to the new thread. 3126 * Raise the SIGSTOP in this thread so the 3127 * threads compete. 3128 */ 3129 CHILD_REQUIRE(pthread_create(&t, NULL, 3130 sleep_thread, NULL) == 0); 3131 raise(SIGSTOP); 3132 } else { 3133 /* 3134 * We expect the SIGKILL to be delivered to 3135 * this thread. After creating the new thread, 3136 * just get off the CPU so the other thread can 3137 * raise the SIGSTOP. 3138 */ 3139 CHILD_REQUIRE(pthread_create(&t, NULL, 3140 raise_sigstop_thread, NULL) == 0); 3141 sleep(60); 3142 } 3143 3144 exit(0); 3145 } 3146 /* First stop is trace_me() immediately after fork. */ 3147 wpid = waitpid(fpid, &status, 0); 3148 CHILD_REQUIRE(wpid == fpid); 3149 CHILD_REQUIRE(WIFSTOPPED(status)); 3150 CHILD_REQUIRE(WSTOPSIG(status) == SIGSTOP); 3151 3152 CHILD_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 3153 3154 /* Second stop is from the raise(SIGSTOP). */ 3155 wpid = waitpid(fpid, &status, 0); 3156 CHILD_REQUIRE(wpid == fpid); 3157 CHILD_REQUIRE(WIFSTOPPED(status)); 3158 CHILD_REQUIRE(WSTOPSIG(status) == SIGSTOP); 3159 3160 /* 3161 * Terminate tracing process without detaching. Our child 3162 * should be killed. 3163 */ 3164 exit(0); 3165 } 3166 3167 /* 3168 * We should get a normal exit from our immediate child and a SIGKILL 3169 * exit from our grandchild. The latter case is the interesting one. 3170 * Our grandchild should not have stopped due to the SIGSTOP that was 3171 * left dangling when its parent died. 3172 */ 3173 for (i = 0; i < 2; ++i) { 3174 wpid = wait(&status); 3175 if (wpid == fpid) 3176 ATF_REQUIRE(WIFEXITED(status) && 3177 WEXITSTATUS(status) == 0); 3178 else 3179 ATF_REQUIRE(WIFSIGNALED(status) && 3180 WTERMSIG(status) == SIGKILL); 3181 } 3182 } 3183 3184 /* 3185 * These two tests ensure that if the tracing process exits without detaching 3186 * just after the child received a SIGSTOP, the child is cleanly killed and 3187 * doesn't go to sleep due to the SIGSTOP. The parent's death will send a 3188 * SIGKILL to the child. If the SIGKILL and the SIGSTOP are handled by 3189 * different threads, the SIGKILL must win. There are two variants of this 3190 * test, designed to catch the case where the SIGKILL is delivered to the 3191 * younger thread (the first test) and the case where the SIGKILL is delivered 3192 * to the older thread (the second test). This behavior has changed in the 3193 * past, so make no assumption. 3194 */ 3195 ATF_TC(ptrace__parent_terminate_with_pending_sigstop1); 3196 ATF_TC_HEAD(ptrace__parent_terminate_with_pending_sigstop1, tc) 3197 { 3198 3199 atf_tc_set_md_var(tc, "require.user", "root"); 3200 } 3201 ATF_TC_BODY(ptrace__parent_terminate_with_pending_sigstop1, tc) 3202 { 3203 3204 terminate_with_pending_sigstop(true); 3205 } 3206 3207 ATF_TC(ptrace__parent_terminate_with_pending_sigstop2); 3208 ATF_TC_HEAD(ptrace__parent_terminate_with_pending_sigstop2, tc) 3209 { 3210 3211 atf_tc_set_md_var(tc, "require.user", "root"); 3212 } 3213 ATF_TC_BODY(ptrace__parent_terminate_with_pending_sigstop2, tc) 3214 { 3215 3216 terminate_with_pending_sigstop(false); 3217 } 3218 3219 /* 3220 * Verify that after ptrace() discards a SIGKILL signal, the event mask 3221 * is not modified. 3222 */ 3223 ATF_TC_WITHOUT_HEAD(ptrace__event_mask_sigkill_discard); 3224 ATF_TC_BODY(ptrace__event_mask_sigkill_discard, tc) 3225 { 3226 struct ptrace_lwpinfo pl; 3227 pid_t fpid, wpid; 3228 int status, event_mask, new_event_mask; 3229 3230 ATF_REQUIRE((fpid = fork()) != -1); 3231 if (fpid == 0) { 3232 trace_me(); 3233 raise(SIGSTOP); 3234 exit(0); 3235 } 3236 3237 /* The first wait() should report the stop from trace_me(). */ 3238 wpid = waitpid(fpid, &status, 0); 3239 ATF_REQUIRE(wpid == fpid); 3240 ATF_REQUIRE(WIFSTOPPED(status)); 3241 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 3242 3243 /* Set several unobtrusive event bits. */ 3244 event_mask = PTRACE_EXEC | PTRACE_FORK | PTRACE_LWP; 3245 ATF_REQUIRE(ptrace(PT_SET_EVENT_MASK, wpid, (caddr_t)&event_mask, 3246 sizeof(event_mask)) == 0); 3247 3248 /* Send a SIGKILL without using ptrace. */ 3249 ATF_REQUIRE(kill(fpid, SIGKILL) == 0); 3250 3251 /* Continue the child ignoring the SIGSTOP. */ 3252 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 3253 3254 /* The next stop should be due to the SIGKILL. */ 3255 wpid = waitpid(fpid, &status, 0); 3256 ATF_REQUIRE(wpid == fpid); 3257 ATF_REQUIRE(WIFSTOPPED(status)); 3258 ATF_REQUIRE(WSTOPSIG(status) == SIGKILL); 3259 3260 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 3261 ATF_REQUIRE(pl.pl_flags & PL_FLAG_SI); 3262 ATF_REQUIRE(pl.pl_siginfo.si_signo == SIGKILL); 3263 3264 /* Continue the child ignoring the SIGKILL. */ 3265 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 3266 3267 /* The next wait() should report the stop from SIGSTOP. */ 3268 wpid = waitpid(fpid, &status, 0); 3269 ATF_REQUIRE(wpid == fpid); 3270 ATF_REQUIRE(WIFSTOPPED(status)); 3271 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 3272 3273 /* Check the current event mask. It should not have changed. */ 3274 new_event_mask = 0; 3275 ATF_REQUIRE(ptrace(PT_GET_EVENT_MASK, wpid, (caddr_t)&new_event_mask, 3276 sizeof(new_event_mask)) == 0); 3277 ATF_REQUIRE(event_mask == new_event_mask); 3278 3279 /* Continue the child to let it exit. */ 3280 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 3281 3282 /* The last event should be for the child process's exit. */ 3283 wpid = waitpid(fpid, &status, 0); 3284 ATF_REQUIRE(WIFEXITED(status)); 3285 ATF_REQUIRE(WEXITSTATUS(status) == 0); 3286 3287 wpid = wait(&status); 3288 ATF_REQUIRE(wpid == -1); 3289 ATF_REQUIRE(errno == ECHILD); 3290 } 3291 3292 static void * 3293 flock_thread(void *arg) 3294 { 3295 int fd; 3296 3297 fd = *(int *)arg; 3298 (void)flock(fd, LOCK_EX); 3299 (void)flock(fd, LOCK_UN); 3300 return (NULL); 3301 } 3302 3303 /* 3304 * Verify that PT_ATTACH will suspend threads sleeping in an SBDRY section. 3305 * We rely on the fact that the lockf implementation sets SBDRY before blocking 3306 * on a lock. This is a regression test for r318191. 3307 */ 3308 ATF_TC_WITHOUT_HEAD(ptrace__PT_ATTACH_with_SBDRY_thread); 3309 ATF_TC_BODY(ptrace__PT_ATTACH_with_SBDRY_thread, tc) 3310 { 3311 pthread_barrier_t barrier; 3312 pthread_barrierattr_t battr; 3313 char tmpfile[64]; 3314 pid_t child, wpid; 3315 int error, fd, i, status; 3316 3317 ATF_REQUIRE(pthread_barrierattr_init(&battr) == 0); 3318 ATF_REQUIRE(pthread_barrierattr_setpshared(&battr, 3319 PTHREAD_PROCESS_SHARED) == 0); 3320 ATF_REQUIRE(pthread_barrier_init(&barrier, &battr, 2) == 0); 3321 3322 (void)snprintf(tmpfile, sizeof(tmpfile), "./ptrace.XXXXXX"); 3323 fd = mkstemp(tmpfile); 3324 ATF_REQUIRE(fd >= 0); 3325 3326 ATF_REQUIRE((child = fork()) != -1); 3327 if (child == 0) { 3328 pthread_t t[2]; 3329 int cfd; 3330 3331 error = pthread_barrier_wait(&barrier); 3332 if (error != 0 && error != PTHREAD_BARRIER_SERIAL_THREAD) 3333 _exit(1); 3334 3335 cfd = open(tmpfile, O_RDONLY); 3336 if (cfd < 0) 3337 _exit(1); 3338 3339 /* 3340 * We want at least two threads blocked on the file lock since 3341 * the SIGSTOP from PT_ATTACH may kick one of them out of 3342 * sleep. 3343 */ 3344 if (pthread_create(&t[0], NULL, flock_thread, &cfd) != 0) 3345 _exit(1); 3346 if (pthread_create(&t[1], NULL, flock_thread, &cfd) != 0) 3347 _exit(1); 3348 if (pthread_join(t[0], NULL) != 0) 3349 _exit(1); 3350 if (pthread_join(t[1], NULL) != 0) 3351 _exit(1); 3352 _exit(0); 3353 } 3354 3355 ATF_REQUIRE(flock(fd, LOCK_EX) == 0); 3356 3357 error = pthread_barrier_wait(&barrier); 3358 ATF_REQUIRE(error == 0 || error == PTHREAD_BARRIER_SERIAL_THREAD); 3359 3360 /* 3361 * Give the child some time to block. Is there a better way to do this? 3362 */ 3363 sleep(1); 3364 3365 /* 3366 * Attach and give the child 3 seconds to stop. 3367 */ 3368 ATF_REQUIRE(ptrace(PT_ATTACH, child, NULL, 0) == 0); 3369 for (i = 0; i < 3; i++) { 3370 wpid = waitpid(child, &status, WNOHANG); 3371 if (wpid == child && WIFSTOPPED(status) && 3372 WSTOPSIG(status) == SIGSTOP) 3373 break; 3374 sleep(1); 3375 } 3376 ATF_REQUIRE_MSG(i < 3, "failed to stop child process after PT_ATTACH"); 3377 3378 ATF_REQUIRE(ptrace(PT_DETACH, child, NULL, 0) == 0); 3379 3380 ATF_REQUIRE(flock(fd, LOCK_UN) == 0); 3381 ATF_REQUIRE(unlink(tmpfile) == 0); 3382 ATF_REQUIRE(close(fd) == 0); 3383 } 3384 3385 static void 3386 sigusr1_step_handler(int sig) 3387 { 3388 3389 CHILD_REQUIRE(sig == SIGUSR1); 3390 raise(SIGABRT); 3391 } 3392 3393 /* 3394 * Verify that PT_STEP with a signal invokes the signal before 3395 * stepping the next instruction (and that the next instruction is 3396 * stepped correctly). 3397 */ 3398 ATF_TC_WITHOUT_HEAD(ptrace__PT_STEP_with_signal); 3399 ATF_TC_BODY(ptrace__PT_STEP_with_signal, tc) 3400 { 3401 struct ptrace_lwpinfo pl; 3402 pid_t fpid, wpid; 3403 int status; 3404 3405 ATF_REQUIRE((fpid = fork()) != -1); 3406 if (fpid == 0) { 3407 trace_me(); 3408 signal(SIGUSR1, sigusr1_step_handler); 3409 raise(SIGABRT); 3410 exit(1); 3411 } 3412 3413 /* The first wait() should report the stop from SIGSTOP. */ 3414 wpid = waitpid(fpid, &status, 0); 3415 ATF_REQUIRE(wpid == fpid); 3416 ATF_REQUIRE(WIFSTOPPED(status)); 3417 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 3418 3419 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 3420 3421 /* The next stop should report the SIGABRT in the child body. */ 3422 wpid = waitpid(fpid, &status, 0); 3423 ATF_REQUIRE(wpid == fpid); 3424 ATF_REQUIRE(WIFSTOPPED(status)); 3425 ATF_REQUIRE(WSTOPSIG(status) == SIGABRT); 3426 3427 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 3428 ATF_REQUIRE(pl.pl_flags & PL_FLAG_SI); 3429 ATF_REQUIRE(pl.pl_siginfo.si_signo == SIGABRT); 3430 3431 /* Step the child process inserting SIGUSR1. */ 3432 ATF_REQUIRE(ptrace(PT_STEP, fpid, (caddr_t)1, SIGUSR1) == 0); 3433 3434 /* The next stop should report the SIGABRT in the signal handler. */ 3435 wpid = waitpid(fpid, &status, 0); 3436 ATF_REQUIRE(wpid == fpid); 3437 ATF_REQUIRE(WIFSTOPPED(status)); 3438 ATF_REQUIRE(WSTOPSIG(status) == SIGABRT); 3439 3440 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 3441 ATF_REQUIRE(pl.pl_flags & PL_FLAG_SI); 3442 ATF_REQUIRE(pl.pl_siginfo.si_signo == SIGABRT); 3443 3444 /* Continue the child process discarding the signal. */ 3445 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 3446 3447 /* The next stop should report a trace trap from PT_STEP. */ 3448 wpid = waitpid(fpid, &status, 0); 3449 ATF_REQUIRE(wpid == fpid); 3450 ATF_REQUIRE(WIFSTOPPED(status)); 3451 ATF_REQUIRE(WSTOPSIG(status) == SIGTRAP); 3452 3453 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 3454 ATF_REQUIRE(pl.pl_flags & PL_FLAG_SI); 3455 ATF_REQUIRE(pl.pl_siginfo.si_signo == SIGTRAP); 3456 ATF_REQUIRE(pl.pl_siginfo.si_code == TRAP_TRACE); 3457 3458 /* Continue the child to let it exit. */ 3459 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 3460 3461 /* The last event should be for the child process's exit. */ 3462 wpid = waitpid(fpid, &status, 0); 3463 ATF_REQUIRE(WIFEXITED(status)); 3464 ATF_REQUIRE(WEXITSTATUS(status) == 1); 3465 3466 wpid = wait(&status); 3467 ATF_REQUIRE(wpid == -1); 3468 ATF_REQUIRE(errno == ECHILD); 3469 } 3470 3471 #if defined(__amd64__) || defined(__i386__) 3472 /* 3473 * Only x86 both define breakpoint() and have a PC after breakpoint so 3474 * that restarting doesn't retrigger the breakpoint. 3475 */ 3476 static void * 3477 continue_thread(void *arg) 3478 { 3479 breakpoint(); 3480 return (NULL); 3481 } 3482 3483 static __dead2 void 3484 continue_thread_main(void) 3485 { 3486 pthread_t threads[2]; 3487 3488 CHILD_REQUIRE(pthread_create(&threads[0], NULL, continue_thread, 3489 NULL) == 0); 3490 CHILD_REQUIRE(pthread_create(&threads[1], NULL, continue_thread, 3491 NULL) == 0); 3492 CHILD_REQUIRE(pthread_join(threads[0], NULL) == 0); 3493 CHILD_REQUIRE(pthread_join(threads[1], NULL) == 0); 3494 exit(1); 3495 } 3496 3497 /* 3498 * Ensure that PT_CONTINUE clears the status of the thread that 3499 * triggered the stop even if a different thread's LWP was passed to 3500 * PT_CONTINUE. 3501 */ 3502 ATF_TC_WITHOUT_HEAD(ptrace__PT_CONTINUE_different_thread); 3503 ATF_TC_BODY(ptrace__PT_CONTINUE_different_thread, tc) 3504 { 3505 struct ptrace_lwpinfo pl; 3506 pid_t fpid, wpid; 3507 lwpid_t lwps[2]; 3508 bool hit_break[2]; 3509 int i, j, status; 3510 3511 ATF_REQUIRE((fpid = fork()) != -1); 3512 if (fpid == 0) { 3513 trace_me(); 3514 continue_thread_main(); 3515 } 3516 3517 /* The first wait() should report the stop from SIGSTOP. */ 3518 wpid = waitpid(fpid, &status, 0); 3519 ATF_REQUIRE(wpid == fpid); 3520 ATF_REQUIRE(WIFSTOPPED(status)); 3521 ATF_REQUIRE(WSTOPSIG(status) == SIGSTOP); 3522 3523 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, 3524 sizeof(pl)) != -1); 3525 3526 ATF_REQUIRE(ptrace(PT_LWP_EVENTS, wpid, NULL, 1) == 0); 3527 3528 /* Continue the child ignoring the SIGSTOP. */ 3529 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 3530 3531 /* One of the new threads should report it's birth. */ 3532 wpid = waitpid(fpid, &status, 0); 3533 ATF_REQUIRE(wpid == fpid); 3534 ATF_REQUIRE(WIFSTOPPED(status)); 3535 ATF_REQUIRE(WSTOPSIG(status) == SIGTRAP); 3536 3537 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 3538 ATF_REQUIRE((pl.pl_flags & (PL_FLAG_BORN | PL_FLAG_SCX)) == 3539 (PL_FLAG_BORN | PL_FLAG_SCX)); 3540 lwps[0] = pl.pl_lwpid; 3541 3542 /* 3543 * Suspend this thread to ensure both threads are alive before 3544 * hitting the breakpoint. 3545 */ 3546 ATF_REQUIRE(ptrace(PT_SUSPEND, lwps[0], NULL, 0) != -1); 3547 3548 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 3549 3550 /* Second thread should report it's birth. */ 3551 wpid = waitpid(fpid, &status, 0); 3552 ATF_REQUIRE(wpid == fpid); 3553 ATF_REQUIRE(WIFSTOPPED(status)); 3554 ATF_REQUIRE(WSTOPSIG(status) == SIGTRAP); 3555 3556 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 3557 ATF_REQUIRE((pl.pl_flags & (PL_FLAG_BORN | PL_FLAG_SCX)) == 3558 (PL_FLAG_BORN | PL_FLAG_SCX)); 3559 ATF_REQUIRE(pl.pl_lwpid != lwps[0]); 3560 lwps[1] = pl.pl_lwpid; 3561 3562 /* Resume both threads waiting for breakpoint events. */ 3563 hit_break[0] = hit_break[1] = false; 3564 ATF_REQUIRE(ptrace(PT_RESUME, lwps[0], NULL, 0) != -1); 3565 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 3566 3567 /* One thread should report a breakpoint. */ 3568 wpid = waitpid(fpid, &status, 0); 3569 ATF_REQUIRE(wpid == fpid); 3570 ATF_REQUIRE(WIFSTOPPED(status)); 3571 ATF_REQUIRE(WSTOPSIG(status) == SIGTRAP); 3572 3573 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, sizeof(pl)) != -1); 3574 ATF_REQUIRE((pl.pl_flags & PL_FLAG_SI) != 0); 3575 ATF_REQUIRE(pl.pl_siginfo.si_signo == SIGTRAP && 3576 pl.pl_siginfo.si_code == TRAP_BRKPT); 3577 if (pl.pl_lwpid == lwps[0]) 3578 i = 0; 3579 else 3580 i = 1; 3581 hit_break[i] = true; 3582 3583 /* 3584 * Resume both threads but pass the other thread's LWPID to 3585 * PT_CONTINUE. 3586 */ 3587 ATF_REQUIRE(ptrace(PT_CONTINUE, lwps[i ^ 1], (caddr_t)1, 0) == 0); 3588 3589 /* 3590 * Will now get two thread exit events and one more breakpoint 3591 * event. 3592 */ 3593 for (j = 0; j < 3; j++) { 3594 wpid = waitpid(fpid, &status, 0); 3595 ATF_REQUIRE(wpid == fpid); 3596 ATF_REQUIRE(WIFSTOPPED(status)); 3597 ATF_REQUIRE(WSTOPSIG(status) == SIGTRAP); 3598 3599 ATF_REQUIRE(ptrace(PT_LWPINFO, wpid, (caddr_t)&pl, 3600 sizeof(pl)) != -1); 3601 3602 if (pl.pl_lwpid == lwps[0]) 3603 i = 0; 3604 else 3605 i = 1; 3606 3607 ATF_REQUIRE_MSG(lwps[i] != 0, "event for exited thread"); 3608 if (pl.pl_flags & PL_FLAG_EXITED) { 3609 ATF_REQUIRE_MSG(hit_break[i], 3610 "exited thread did not report breakpoint"); 3611 lwps[i] = 0; 3612 } else { 3613 ATF_REQUIRE((pl.pl_flags & PL_FLAG_SI) != 0); 3614 ATF_REQUIRE(pl.pl_siginfo.si_signo == SIGTRAP && 3615 pl.pl_siginfo.si_code == TRAP_BRKPT); 3616 ATF_REQUIRE_MSG(!hit_break[i], 3617 "double breakpoint event"); 3618 hit_break[i] = true; 3619 } 3620 3621 ATF_REQUIRE(ptrace(PT_CONTINUE, fpid, (caddr_t)1, 0) == 0); 3622 } 3623 3624 /* Both threads should have exited. */ 3625 ATF_REQUIRE(lwps[0] == 0); 3626 ATF_REQUIRE(lwps[1] == 0); 3627 3628 /* The last event should be for the child process's exit. */ 3629 wpid = waitpid(fpid, &status, 0); 3630 ATF_REQUIRE(WIFEXITED(status)); 3631 ATF_REQUIRE(WEXITSTATUS(status) == 1); 3632 3633 wpid = wait(&status); 3634 ATF_REQUIRE(wpid == -1); 3635 ATF_REQUIRE(errno == ECHILD); 3636 } 3637 #endif 3638 3639 ATF_TP_ADD_TCS(tp) 3640 { 3641 3642 ATF_TP_ADD_TC(tp, ptrace__parent_wait_after_trace_me); 3643 ATF_TP_ADD_TC(tp, ptrace__parent_wait_after_attach); 3644 ATF_TP_ADD_TC(tp, ptrace__parent_sees_exit_after_child_debugger); 3645 ATF_TP_ADD_TC(tp, ptrace__parent_sees_exit_after_unrelated_debugger); 3646 ATF_TP_ADD_TC(tp, ptrace__follow_fork_both_attached); 3647 ATF_TP_ADD_TC(tp, ptrace__follow_fork_child_detached); 3648 ATF_TP_ADD_TC(tp, ptrace__follow_fork_parent_detached); 3649 ATF_TP_ADD_TC(tp, ptrace__follow_fork_both_attached_unrelated_debugger); 3650 ATF_TP_ADD_TC(tp, 3651 ptrace__follow_fork_child_detached_unrelated_debugger); 3652 ATF_TP_ADD_TC(tp, 3653 ptrace__follow_fork_parent_detached_unrelated_debugger); 3654 ATF_TP_ADD_TC(tp, ptrace__getppid); 3655 ATF_TP_ADD_TC(tp, ptrace__new_child_pl_syscall_code_fork); 3656 ATF_TP_ADD_TC(tp, ptrace__new_child_pl_syscall_code_vfork); 3657 ATF_TP_ADD_TC(tp, ptrace__new_child_pl_syscall_code_thread); 3658 ATF_TP_ADD_TC(tp, ptrace__lwp_events); 3659 ATF_TP_ADD_TC(tp, ptrace__lwp_events_exec); 3660 ATF_TP_ADD_TC(tp, ptrace__siginfo); 3661 ATF_TP_ADD_TC(tp, ptrace__ptrace_exec_disable); 3662 ATF_TP_ADD_TC(tp, ptrace__ptrace_exec_enable); 3663 ATF_TP_ADD_TC(tp, ptrace__event_mask); 3664 ATF_TP_ADD_TC(tp, ptrace__ptrace_vfork); 3665 ATF_TP_ADD_TC(tp, ptrace__ptrace_vfork_follow); 3666 #if defined(__amd64__) || defined(__i386__) || defined(__sparc64__) 3667 ATF_TP_ADD_TC(tp, ptrace__PT_KILL_breakpoint); 3668 #endif 3669 ATF_TP_ADD_TC(tp, ptrace__PT_KILL_system_call); 3670 ATF_TP_ADD_TC(tp, ptrace__PT_KILL_threads); 3671 ATF_TP_ADD_TC(tp, ptrace__PT_KILL_competing_signal); 3672 ATF_TP_ADD_TC(tp, ptrace__PT_KILL_competing_stop); 3673 ATF_TP_ADD_TC(tp, ptrace__PT_KILL_with_signal_full_sigqueue); 3674 ATF_TP_ADD_TC(tp, ptrace__PT_CONTINUE_with_signal_system_call_entry); 3675 ATF_TP_ADD_TC(tp, 3676 ptrace__PT_CONTINUE_with_signal_system_call_entry_and_exit); 3677 ATF_TP_ADD_TC(tp, ptrace__PT_CONTINUE_with_signal_full_sigqueue); 3678 ATF_TP_ADD_TC(tp, ptrace__PT_CONTINUE_with_signal_masked_full_sigqueue); 3679 ATF_TP_ADD_TC(tp, ptrace__PT_CONTINUE_change_sig); 3680 ATF_TP_ADD_TC(tp, ptrace__PT_CONTINUE_with_sigtrap_system_call_entry); 3681 ATF_TP_ADD_TC(tp, ptrace__PT_CONTINUE_with_signal_mix); 3682 ATF_TP_ADD_TC(tp, ptrace__PT_CONTINUE_with_signal_kqueue); 3683 ATF_TP_ADD_TC(tp, ptrace__killed_with_sigmask); 3684 ATF_TP_ADD_TC(tp, ptrace__PT_CONTINUE_with_sigmask); 3685 ATF_TP_ADD_TC(tp, ptrace__PT_CONTINUE_with_signal_thread_sigmask); 3686 ATF_TP_ADD_TC(tp, ptrace__parent_terminate_with_pending_sigstop1); 3687 ATF_TP_ADD_TC(tp, ptrace__parent_terminate_with_pending_sigstop2); 3688 ATF_TP_ADD_TC(tp, ptrace__event_mask_sigkill_discard); 3689 ATF_TP_ADD_TC(tp, ptrace__PT_ATTACH_with_SBDRY_thread); 3690 ATF_TP_ADD_TC(tp, ptrace__PT_STEP_with_signal); 3691 #if defined(__amd64__) || defined(__i386__) 3692 ATF_TP_ADD_TC(tp, ptrace__PT_CONTINUE_different_thread); 3693 #endif 3694 3695 return (atf_no_error()); 3696 } 3697