1 /* $NetBSD: t_ptrace_wait.c,v 1.22 2017/12/28 18:41:33 christos Exp $ */ 2 3 /*- 4 * Copyright (c) 2016 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #include <sys/cdefs.h> 30 __RCSID("$NetBSD: t_ptrace_wait.c,v 1.22 2017/12/28 18:41:33 christos Exp $"); 31 32 #include <sys/param.h> 33 #include <sys/types.h> 34 #include <sys/ptrace.h> 35 #include <sys/resource.h> 36 #include <sys/stat.h> 37 #include <sys/syscall.h> 38 #include <sys/sysctl.h> 39 #include <sys/wait.h> 40 #include <machine/reg.h> 41 #include <elf.h> 42 #include <err.h> 43 #include <errno.h> 44 #include <lwp.h> 45 #include <sched.h> 46 #include <signal.h> 47 #include <stdint.h> 48 #include <stdio.h> 49 #include <stdlib.h> 50 #include <strings.h> 51 #include <unistd.h> 52 53 #include <atf-c.h> 54 55 #include "h_macros.h" 56 57 #include "t_ptrace_wait.h" 58 #include "msg.h" 59 60 #define PARENT_TO_CHILD(info, fds, msg) \ 61 SYSCALL_REQUIRE(msg_write_child(info " to child " # fds, &fds, &msg, sizeof(msg)) == 0) 62 63 #define CHILD_FROM_PARENT(info, fds, msg) \ 64 FORKEE_ASSERT(msg_read_parent(info " from parent " # fds, &fds, &msg, sizeof(msg)) == 0) 65 66 #define CHILD_TO_PARENT(info, fds, msg) \ 67 FORKEE_ASSERT(msg_write_parent(info " to parent " # fds, &fds, &msg, sizeof(msg)) == 0) 68 69 #define PARENT_FROM_CHILD(info, fds, msg) \ 70 SYSCALL_REQUIRE(msg_read_child(info " from parent " # fds, &fds, &msg, sizeof(msg)) == 0) 71 72 #define SYSCALL_REQUIRE(expr) ATF_REQUIRE_MSG(expr, "%s: %s", # expr, \ 73 strerror(errno)) 74 #define SYSCALL_REQUIRE_ERRNO(res, exp) ATF_REQUIRE_MSG(res == exp, \ 75 "%d(%s) != %d", res, strerror(res), exp) 76 77 static int debug = 0; 78 79 #define DPRINTF(a, ...) do \ 80 if (debug) printf(a, ##__VA_ARGS__); \ 81 while (/*CONSTCOND*/0) 82 83 84 ATF_TC(traceme1); 85 ATF_TC_HEAD(traceme1, tc) 86 { 87 atf_tc_set_md_var(tc, "descr", 88 "Verify SIGSTOP followed by _exit(2) in a child"); 89 } 90 91 ATF_TC_BODY(traceme1, tc) 92 { 93 const int exitval = 5; 94 const int sigval = SIGSTOP; 95 pid_t child, wpid; 96 #if defined(TWAIT_HAVE_STATUS) 97 int status; 98 #endif 99 100 DPRINTF("Before forking process PID=%d\n", getpid()); 101 SYSCALL_REQUIRE((child = fork()) != -1); 102 if (child == 0) { 103 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 104 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 105 106 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 107 FORKEE_ASSERT(raise(sigval) == 0); 108 109 DPRINTF("Before exiting of the child process\n"); 110 _exit(exitval); 111 } 112 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 113 114 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 115 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 116 117 validate_status_stopped(status, sigval); 118 119 DPRINTF("Before resuming the child process where it left off and " 120 "without signal to be sent\n"); 121 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 122 123 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 124 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 125 126 validate_status_exited(status, exitval); 127 128 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 129 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 130 } 131 132 ATF_TC(traceme2); 133 ATF_TC_HEAD(traceme2, tc) 134 { 135 atf_tc_set_md_var(tc, "descr", 136 "Verify SIGSTOP followed by _exit(2) in a child"); 137 } 138 139 static int traceme2_caught = 0; 140 141 static void 142 traceme2_sighandler(int sig) 143 { 144 FORKEE_ASSERT_EQ(sig, SIGINT); 145 146 ++traceme2_caught; 147 } 148 149 ATF_TC_BODY(traceme2, tc) 150 { 151 const int exitval = 5; 152 const int sigval = SIGSTOP, sigsent = SIGINT; 153 pid_t child, wpid; 154 struct sigaction sa; 155 #if defined(TWAIT_HAVE_STATUS) 156 int status; 157 #endif 158 159 DPRINTF("Before forking process PID=%d\n", getpid()); 160 SYSCALL_REQUIRE((child = fork()) != -1); 161 if (child == 0) { 162 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 163 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 164 165 sa.sa_handler = traceme2_sighandler; 166 sa.sa_flags = SA_SIGINFO; 167 sigemptyset(&sa.sa_mask); 168 169 FORKEE_ASSERT(sigaction(sigsent, &sa, NULL) != -1); 170 171 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 172 FORKEE_ASSERT(raise(sigval) == 0); 173 174 FORKEE_ASSERT_EQ(traceme2_caught, 1); 175 176 DPRINTF("Before exiting of the child process\n"); 177 _exit(exitval); 178 } 179 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 180 181 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 182 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 183 184 validate_status_stopped(status, sigval); 185 186 DPRINTF("Before resuming the child process where it left off and with " 187 "signal %s to be sent\n", strsignal(sigsent)); 188 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, sigsent) != -1); 189 190 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 191 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 192 193 validate_status_exited(status, exitval); 194 195 DPRINTF("Before calling %s() for the exited child\n", TWAIT_FNAME); 196 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 197 } 198 199 ATF_TC(traceme3); 200 ATF_TC_HEAD(traceme3, tc) 201 { 202 atf_tc_set_md_var(tc, "descr", 203 "Verify SIGSTOP followed by termination by a signal in a child"); 204 } 205 206 ATF_TC_BODY(traceme3, tc) 207 { 208 const int sigval = SIGSTOP, sigsent = SIGINT /* Without core-dump */; 209 pid_t child, wpid; 210 #if defined(TWAIT_HAVE_STATUS) 211 int status; 212 #endif 213 214 DPRINTF("Before forking process PID=%d\n", getpid()); 215 SYSCALL_REQUIRE((child = fork()) != -1); 216 if (child == 0) { 217 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 218 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 219 220 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 221 FORKEE_ASSERT(raise(sigval) == 0); 222 223 /* NOTREACHED */ 224 FORKEE_ASSERTX(0 && 225 "Child should be terminated by a signal from its parent"); 226 } 227 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 228 229 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 230 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 231 232 validate_status_stopped(status, sigval); 233 234 DPRINTF("Before resuming the child process where it left off and with " 235 "signal %s to be sent\n", strsignal(sigsent)); 236 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, sigsent) != -1); 237 238 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 239 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 240 241 validate_status_signaled(status, sigsent, 0); 242 243 DPRINTF("Before calling %s() for the exited child\n", TWAIT_FNAME); 244 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 245 } 246 247 ATF_TC(traceme4); 248 ATF_TC_HEAD(traceme4, tc) 249 { 250 atf_tc_set_md_var(tc, "descr", 251 "Verify SIGSTOP followed by SIGCONT and _exit(2) in a child"); 252 } 253 254 ATF_TC_BODY(traceme4, tc) 255 { 256 const int exitval = 5; 257 const int sigval = SIGSTOP, sigsent = SIGCONT; 258 pid_t child, wpid; 259 #if defined(TWAIT_HAVE_STATUS) 260 int status; 261 #endif 262 263 DPRINTF("Before forking process PID=%d\n", getpid()); 264 SYSCALL_REQUIRE((child = fork()) != -1); 265 if (child == 0) { 266 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 267 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 268 269 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 270 FORKEE_ASSERT(raise(sigval) == 0); 271 272 DPRINTF("Before raising %s from child\n", strsignal(sigsent)); 273 FORKEE_ASSERT(raise(sigsent) == 0); 274 275 DPRINTF("Before exiting of the child process\n"); 276 _exit(exitval); 277 } 278 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(),child); 279 280 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 281 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 282 283 validate_status_stopped(status, sigval); 284 285 DPRINTF("Before resuming the child process where it left off and " 286 "without signal to be sent\n"); 287 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 288 289 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 290 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 291 292 validate_status_stopped(status, sigsent); 293 294 DPRINTF("Before resuming the child process where it left off and " 295 "without signal to be sent\n"); 296 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 297 298 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 299 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 300 301 validate_status_exited(status, exitval); 302 303 DPRINTF("Before calling %s() for the exited child\n", TWAIT_FNAME); 304 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 305 } 306 307 #if defined(TWAIT_HAVE_PID) 308 ATF_TC(attach1); 309 ATF_TC_HEAD(attach1, tc) 310 { 311 atf_tc_set_md_var(tc, "descr", 312 "Assert that tracer sees process termination before the parent"); 313 } 314 315 ATF_TC_BODY(attach1, tc) 316 { 317 struct msg_fds parent_tracee, parent_tracer; 318 const int exitval_tracee = 5; 319 const int exitval_tracer = 10; 320 pid_t tracee, tracer, wpid; 321 uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */ 322 #if defined(TWAIT_HAVE_STATUS) 323 int status; 324 #endif 325 326 DPRINTF("Spawn tracee\n"); 327 SYSCALL_REQUIRE(msg_open(&parent_tracee) == 0); 328 tracee = atf_utils_fork(); 329 if (tracee == 0) { 330 // Wait for parent to let us exit 331 CHILD_FROM_PARENT("exit tracee", parent_tracee, msg); 332 _exit(exitval_tracee); 333 } 334 335 DPRINTF("Spawn debugger\n"); 336 SYSCALL_REQUIRE(msg_open(&parent_tracer) == 0); 337 tracer = atf_utils_fork(); 338 if (tracer == 0) { 339 DPRINTF("Before calling PT_ATTACH from tracee %d\n", getpid()); 340 FORKEE_ASSERT(ptrace(PT_ATTACH, tracee, NULL, 0) != -1); 341 342 /* Wait for tracee and assert that it was stopped w/ SIGSTOP */ 343 FORKEE_REQUIRE_SUCCESS( 344 wpid = TWAIT_GENERIC(tracee, &status, 0), tracee); 345 346 forkee_status_stopped(status, SIGSTOP); 347 348 /* Resume tracee with PT_CONTINUE */ 349 FORKEE_ASSERT(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1); 350 351 /* Inform parent that tracer has attached to tracee */ 352 CHILD_TO_PARENT("tracer ready", parent_tracer, msg); 353 354 /* Wait for parent to tell use that tracee should have exited */ 355 CHILD_FROM_PARENT("wait for tracee exit", parent_tracer, msg); 356 357 /* Wait for tracee and assert that it exited */ 358 FORKEE_REQUIRE_SUCCESS( 359 wpid = TWAIT_GENERIC(tracee, &status, 0), tracee); 360 361 forkee_status_exited(status, exitval_tracee); 362 DPRINTF("Tracee %d exited with %d\n", tracee, exitval_tracee); 363 364 DPRINTF("Before exiting of the tracer process\n"); 365 _exit(exitval_tracer); 366 } 367 368 DPRINTF("Wait for the tracer to attach to the tracee\n"); 369 PARENT_FROM_CHILD("tracer ready", parent_tracer, msg); 370 371 DPRINTF("Resume the tracee and let it exit\n"); 372 PARENT_TO_CHILD("exit tracee", parent_tracee, msg); 373 374 DPRINTF("Detect that tracee is zombie\n"); 375 await_zombie(tracee); 376 377 378 DPRINTF("Assert that there is no status about tracee %d - " 379 "Tracer must detect zombie first - calling %s()\n", tracee, 380 TWAIT_FNAME); 381 TWAIT_REQUIRE_SUCCESS( 382 wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 0); 383 384 DPRINTF("Tell the tracer child should have exited\n"); 385 PARENT_TO_CHILD("wait for tracee exit", parent_tracer, msg); 386 DPRINTF("Wait for tracer to finish its job and exit - calling %s()\n", 387 TWAIT_FNAME); 388 389 DPRINTF("Wait from tracer child to complete waiting for tracee\n"); 390 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracer, &status, 0), 391 tracer); 392 393 validate_status_exited(status, exitval_tracer); 394 395 DPRINTF("Wait for tracee to finish its job and exit - calling %s()\n", 396 TWAIT_FNAME); 397 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 398 tracee); 399 400 validate_status_exited(status, exitval_tracee); 401 402 msg_close(&parent_tracer); 403 msg_close(&parent_tracee); 404 } 405 #endif 406 407 #if defined(TWAIT_HAVE_PID) 408 ATF_TC(attach2); 409 ATF_TC_HEAD(attach2, tc) 410 { 411 atf_tc_set_md_var(tc, "descr", 412 "Assert that any tracer sees process termination before its " 413 "parent"); 414 } 415 416 ATF_TC_BODY(attach2, tc) 417 { 418 struct msg_fds parent_tracer, parent_tracee; 419 const int exitval_tracee = 5; 420 const int exitval_tracer1 = 10, exitval_tracer2 = 20; 421 pid_t tracee, tracer, wpid; 422 uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */ 423 #if defined(TWAIT_HAVE_STATUS) 424 int status; 425 #endif 426 427 // Feature pending for refactoring 428 atf_tc_expect_fail("test is racy"); 429 430 DPRINTF("Spawn tracee\n"); 431 SYSCALL_REQUIRE(msg_open(&parent_tracee) == 0); 432 tracee = atf_utils_fork(); 433 if (tracee == 0) { 434 /* Wait for message from the parent */ 435 CHILD_FROM_PARENT("Message 1", parent_tracee, msg); 436 _exit(exitval_tracee); 437 } 438 439 DPRINTF("Spawn debugger\n"); 440 SYSCALL_REQUIRE(msg_open(&parent_tracer) == 0); 441 tracer = atf_utils_fork(); 442 if (tracer == 0) { 443 /* Fork again and drop parent to reattach to PID 1 */ 444 tracer = atf_utils_fork(); 445 if (tracer != 0) 446 _exit(exitval_tracer1); 447 448 DPRINTF("Before calling PT_ATTACH from tracee %d\n", getpid()); 449 FORKEE_ASSERT(ptrace(PT_ATTACH, tracee, NULL, 0) != -1); 450 451 /* Wait for tracee and assert that it was stopped w/ SIGSTOP */ 452 FORKEE_REQUIRE_SUCCESS( 453 wpid = TWAIT_GENERIC(tracee, &status, 0), tracee); 454 455 forkee_status_stopped(status, SIGSTOP); 456 457 /* Resume tracee with PT_CONTINUE */ 458 FORKEE_ASSERT(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1); 459 460 /* Inform parent that tracer has attached to tracee */ 461 CHILD_TO_PARENT("Message 1", parent_tracer, msg); 462 CHILD_FROM_PARENT("Message 2", parent_tracer, msg); 463 464 /* Wait for tracee and assert that it exited */ 465 FORKEE_REQUIRE_SUCCESS( 466 wpid = TWAIT_GENERIC(tracee, &status, 0), tracee); 467 468 forkee_status_exited(status, exitval_tracee); 469 470 DPRINTF("Before exiting of the tracer process\n"); 471 _exit(exitval_tracer2); 472 } 473 DPRINTF("Wait for the tracer process (direct child) to exit calling " 474 "%s()\n", TWAIT_FNAME); 475 TWAIT_REQUIRE_SUCCESS( 476 wpid = TWAIT_GENERIC(tracer, &status, 0), tracer); 477 478 validate_status_exited(status, exitval_tracer1); 479 480 DPRINTF("Wait for the non-exited tracee process with %s()\n", 481 TWAIT_FNAME); 482 TWAIT_REQUIRE_SUCCESS( 483 wpid = TWAIT_GENERIC(tracee, NULL, WNOHANG), 0); 484 485 DPRINTF("Wait for the tracer to attach to the tracee\n"); 486 PARENT_FROM_CHILD("Message 1", parent_tracer, msg); 487 DPRINTF("Resume the tracee and let it exit\n"); 488 PARENT_TO_CHILD("Message 1", parent_tracee, msg); 489 490 DPRINTF("Detect that tracee is zombie\n"); 491 await_zombie(tracee); 492 493 DPRINTF("Assert that there is no status about tracee - " 494 "Tracer must detect zombie first - calling %s()\n", TWAIT_FNAME); 495 TWAIT_REQUIRE_SUCCESS( 496 wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 0); 497 498 DPRINTF("Resume the tracer and let it detect exited tracee\n"); 499 PARENT_TO_CHILD("Message 2", parent_tracer, msg); 500 501 DPRINTF("Wait for tracee to finish its job and exit - calling %s()\n", 502 TWAIT_FNAME); 503 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 504 tracee); 505 506 validate_status_exited(status, exitval_tracee); 507 508 msg_close(&parent_tracer); 509 msg_close(&parent_tracee); 510 511 // Test is racy 512 ATF_REQUIRE(0 && "In order to get reliable failure, abort"); 513 } 514 #endif 515 516 ATF_TC(attach3); 517 ATF_TC_HEAD(attach3, tc) 518 { 519 atf_tc_set_md_var(tc, "descr", 520 "Assert that tracer parent can PT_ATTACH to its child"); 521 } 522 523 ATF_TC_BODY(attach3, tc) 524 { 525 struct msg_fds parent_tracee; 526 const int exitval_tracee = 5; 527 pid_t tracee, wpid; 528 uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */ 529 #if defined(TWAIT_HAVE_STATUS) 530 int status; 531 #endif 532 533 DPRINTF("Spawn tracee\n"); 534 SYSCALL_REQUIRE(msg_open(&parent_tracee) == 0); 535 tracee = atf_utils_fork(); 536 if (tracee == 0) { 537 CHILD_FROM_PARENT("Message 1", parent_tracee, msg); 538 DPRINTF("Parent should now attach to tracee\n"); 539 540 CHILD_FROM_PARENT("Message 2", parent_tracee, msg); 541 /* Wait for message from the parent */ 542 _exit(exitval_tracee); 543 } 544 PARENT_TO_CHILD("Message 1", parent_tracee, msg); 545 546 DPRINTF("Before calling PT_ATTACH for tracee %d\n", tracee); 547 SYSCALL_REQUIRE(ptrace(PT_ATTACH, tracee, NULL, 0) != -1); 548 549 DPRINTF("Wait for the stopped tracee process with %s()\n", 550 TWAIT_FNAME); 551 TWAIT_REQUIRE_SUCCESS( 552 wpid = TWAIT_GENERIC(tracee, &status, 0), tracee); 553 554 validate_status_stopped(status, SIGSTOP); 555 556 DPRINTF("Resume tracee with PT_CONTINUE\n"); 557 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1); 558 559 DPRINTF("Let the tracee exit now\n"); 560 PARENT_TO_CHILD("Message 2", parent_tracee, msg); 561 562 DPRINTF("Wait for tracee to exit with %s()\n", TWAIT_FNAME); 563 TWAIT_REQUIRE_SUCCESS( 564 wpid = TWAIT_GENERIC(tracee, &status, 0), tracee); 565 566 validate_status_exited(status, exitval_tracee); 567 568 DPRINTF("Before calling %s() for tracee\n", TWAIT_FNAME); 569 TWAIT_REQUIRE_FAILURE(ECHILD, 570 wpid = TWAIT_GENERIC(tracee, &status, 0)); 571 572 msg_close(&parent_tracee); 573 } 574 575 ATF_TC(attach4); 576 ATF_TC_HEAD(attach4, tc) 577 { 578 atf_tc_set_md_var(tc, "descr", 579 "Assert that tracer child can PT_ATTACH to its parent"); 580 } 581 582 ATF_TC_BODY(attach4, tc) 583 { 584 struct msg_fds parent_tracee; 585 const int exitval_tracer = 5; 586 pid_t tracer, wpid; 587 uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */ 588 #if defined(TWAIT_HAVE_STATUS) 589 int status; 590 #endif 591 592 DPRINTF("Spawn tracer\n"); 593 SYSCALL_REQUIRE(msg_open(&parent_tracee) == 0); 594 tracer = atf_utils_fork(); 595 if (tracer == 0) { 596 597 /* Wait for message from the parent */ 598 CHILD_FROM_PARENT("Message 1", parent_tracee, msg); 599 600 DPRINTF("Attach to parent PID %d with PT_ATTACH from child\n", 601 getppid()); 602 FORKEE_ASSERT(ptrace(PT_ATTACH, getppid(), NULL, 0) != -1); 603 604 DPRINTF("Wait for the stopped parent process with %s()\n", 605 TWAIT_FNAME); 606 FORKEE_REQUIRE_SUCCESS( 607 wpid = TWAIT_GENERIC(getppid(), &status, 0), getppid()); 608 609 forkee_status_stopped(status, SIGSTOP); 610 611 DPRINTF("Resume parent with PT_DETACH\n"); 612 FORKEE_ASSERT(ptrace(PT_DETACH, getppid(), (void *)1, 0) 613 != -1); 614 615 /* Tell parent we are ready */ 616 CHILD_TO_PARENT("Message 1", parent_tracee, msg); 617 618 _exit(exitval_tracer); 619 } 620 621 DPRINTF("Wait for the tracer to become ready\n"); 622 PARENT_TO_CHILD("Message 1", parent_tracee, msg); 623 DPRINTF("Allow the tracer to exit now\n"); 624 PARENT_FROM_CHILD("Message 1", parent_tracee, msg); 625 626 DPRINTF("Wait for tracer to exit with %s()\n", TWAIT_FNAME); 627 TWAIT_REQUIRE_SUCCESS( 628 wpid = TWAIT_GENERIC(tracer, &status, 0), tracer); 629 630 validate_status_exited(status, exitval_tracer); 631 632 DPRINTF("Before calling %s() for tracer\n", TWAIT_FNAME); 633 TWAIT_REQUIRE_FAILURE(ECHILD, 634 wpid = TWAIT_GENERIC(tracer, &status, 0)); 635 636 msg_close(&parent_tracee); 637 } 638 639 #if defined(TWAIT_HAVE_PID) 640 ATF_TC(attach5); 641 ATF_TC_HEAD(attach5, tc) 642 { 643 atf_tc_set_md_var(tc, "descr", 644 "Assert that tracer sees its parent when attached to tracer " 645 "(check getppid(2))"); 646 } 647 648 ATF_TC_BODY(attach5, tc) 649 { 650 struct msg_fds parent_tracer, parent_tracee; 651 const int exitval_tracee = 5; 652 const int exitval_tracer = 10; 653 pid_t parent, tracee, tracer, wpid; 654 uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */ 655 #if defined(TWAIT_HAVE_STATUS) 656 int status; 657 #endif 658 659 DPRINTF("Spawn tracee\n"); 660 SYSCALL_REQUIRE(msg_open(&parent_tracer) == 0); 661 SYSCALL_REQUIRE(msg_open(&parent_tracee) == 0); 662 tracee = atf_utils_fork(); 663 if (tracee == 0) { 664 parent = getppid(); 665 666 /* Emit message to the parent */ 667 CHILD_TO_PARENT("tracee ready", parent_tracee, msg); 668 CHILD_FROM_PARENT("exit tracee", parent_tracee, msg); 669 670 FORKEE_ASSERT_EQ(parent, getppid()); 671 672 _exit(exitval_tracee); 673 } 674 DPRINTF("Wait for child to record its parent identifier (pid)\n"); 675 PARENT_FROM_CHILD("tracee ready", parent_tracee, msg); 676 677 DPRINTF("Spawn debugger\n"); 678 tracer = atf_utils_fork(); 679 if (tracer == 0) { 680 /* No IPC to communicate with the child */ 681 DPRINTF("Before calling PT_ATTACH from tracee %d\n", getpid()); 682 FORKEE_ASSERT(ptrace(PT_ATTACH, tracee, NULL, 0) != -1); 683 684 /* Wait for tracee and assert that it was stopped w/ SIGSTOP */ 685 FORKEE_REQUIRE_SUCCESS( 686 wpid = TWAIT_GENERIC(tracee, &status, 0), tracee); 687 688 forkee_status_stopped(status, SIGSTOP); 689 690 /* Resume tracee with PT_CONTINUE */ 691 FORKEE_ASSERT(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1); 692 693 /* Inform parent that tracer has attached to tracee */ 694 CHILD_TO_PARENT("tracer ready", parent_tracer, msg); 695 696 /* Wait for parent to tell use that tracee should have exited */ 697 CHILD_FROM_PARENT("wait for tracee exit", parent_tracer, msg); 698 699 /* Wait for tracee and assert that it exited */ 700 FORKEE_REQUIRE_SUCCESS( 701 wpid = TWAIT_GENERIC(tracee, &status, 0), tracee); 702 703 forkee_status_exited(status, exitval_tracee); 704 705 DPRINTF("Before exiting of the tracer process\n"); 706 _exit(exitval_tracer); 707 } 708 709 DPRINTF("Wait for the tracer to attach to the tracee\n"); 710 PARENT_FROM_CHILD("tracer ready", parent_tracer, msg); 711 712 DPRINTF("Resume the tracee and let it exit\n"); 713 PARENT_TO_CHILD("exit tracee", parent_tracee, msg); 714 715 DPRINTF("Detect that tracee is zombie\n"); 716 await_zombie(tracee); 717 718 DPRINTF("Assert that there is no status about tracee - " 719 "Tracer must detect zombie first - calling %s()\n", TWAIT_FNAME); 720 TWAIT_REQUIRE_SUCCESS( 721 wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 0); 722 723 DPRINTF("Tell the tracer child should have exited\n"); 724 PARENT_TO_CHILD("wait for tracee exit", parent_tracer, msg); 725 726 DPRINTF("Wait from tracer child to complete waiting for tracee\n"); 727 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracer, &status, 0), 728 tracer); 729 730 validate_status_exited(status, exitval_tracer); 731 732 DPRINTF("Wait for tracee to finish its job and exit - calling %s()\n", 733 TWAIT_FNAME); 734 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 735 tracee); 736 737 validate_status_exited(status, exitval_tracee); 738 739 msg_close(&parent_tracer); 740 msg_close(&parent_tracee); 741 } 742 #endif 743 744 #if defined(TWAIT_HAVE_PID) 745 ATF_TC(attach6); 746 ATF_TC_HEAD(attach6, tc) 747 { 748 atf_tc_set_md_var(tc, "descr", 749 "Assert that tracer sees its parent when attached to tracer " 750 "(check sysctl(7) and struct kinfo_proc2)"); 751 } 752 753 ATF_TC_BODY(attach6, tc) 754 { 755 struct msg_fds parent_tracee, parent_tracer; 756 const int exitval_tracee = 5; 757 const int exitval_tracer = 10; 758 pid_t parent, tracee, tracer, wpid; 759 uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */ 760 #if defined(TWAIT_HAVE_STATUS) 761 int status; 762 #endif 763 int name[CTL_MAXNAME]; 764 struct kinfo_proc2 kp; 765 size_t len = sizeof(kp); 766 unsigned int namelen; 767 768 DPRINTF("Spawn tracee\n"); 769 SYSCALL_REQUIRE(msg_open(&parent_tracee) == 0); 770 SYSCALL_REQUIRE(msg_open(&parent_tracer) == 0); 771 tracee = atf_utils_fork(); 772 if (tracee == 0) { 773 parent = getppid(); 774 775 /* Emit message to the parent */ 776 CHILD_TO_PARENT("Message 1", parent_tracee, msg); 777 CHILD_FROM_PARENT("Message 2", parent_tracee, msg); 778 779 namelen = 0; 780 name[namelen++] = CTL_KERN; 781 name[namelen++] = KERN_PROC2; 782 name[namelen++] = KERN_PROC_PID; 783 name[namelen++] = getpid(); 784 name[namelen++] = len; 785 name[namelen++] = 1; 786 787 FORKEE_ASSERT(sysctl(name, namelen, &kp, &len, NULL, 0) == 0); 788 FORKEE_ASSERT_EQ(parent, kp.p_ppid); 789 790 _exit(exitval_tracee); 791 } 792 793 DPRINTF("Wait for child to record its parent identifier (pid)\n"); 794 PARENT_FROM_CHILD("Message 1", parent_tracee, msg); 795 796 DPRINTF("Spawn debugger\n"); 797 tracer = atf_utils_fork(); 798 if (tracer == 0) { 799 /* No IPC to communicate with the child */ 800 DPRINTF("Before calling PT_ATTACH from tracee %d\n", getpid()); 801 FORKEE_ASSERT(ptrace(PT_ATTACH, tracee, NULL, 0) != -1); 802 803 /* Wait for tracee and assert that it was stopped w/ SIGSTOP */ 804 FORKEE_REQUIRE_SUCCESS( 805 wpid = TWAIT_GENERIC(tracee, &status, 0), tracee); 806 807 forkee_status_stopped(status, SIGSTOP); 808 809 /* Resume tracee with PT_CONTINUE */ 810 FORKEE_ASSERT(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1); 811 812 /* Inform parent that tracer has attached to tracee */ 813 CHILD_TO_PARENT("Message 1", parent_tracer, msg); 814 815 CHILD_FROM_PARENT("Message 2", parent_tracer, msg); 816 817 /* Wait for tracee and assert that it exited */ 818 FORKEE_REQUIRE_SUCCESS( 819 wpid = TWAIT_GENERIC(tracee, &status, 0), tracee); 820 821 forkee_status_exited(status, exitval_tracee); 822 823 DPRINTF("Before exiting of the tracer process\n"); 824 _exit(exitval_tracer); 825 } 826 827 DPRINTF("Wait for the tracer to attach to the tracee\n"); 828 PARENT_FROM_CHILD("Message 1", parent_tracer, msg); 829 830 DPRINTF("Resume the tracee and let it exit\n"); 831 PARENT_TO_CHILD("Message 1", parent_tracee, msg); 832 833 DPRINTF("Detect that tracee is zombie\n"); 834 await_zombie(tracee); 835 836 DPRINTF("Assert that there is no status about tracee - " 837 "Tracer must detect zombie first - calling %s()\n", TWAIT_FNAME); 838 TWAIT_REQUIRE_SUCCESS( 839 wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 0); 840 841 DPRINTF("Resume the tracer and let it detect exited tracee\n"); 842 PARENT_TO_CHILD("Message 2", parent_tracer, msg); 843 844 DPRINTF("Wait for tracer to finish its job and exit - calling %s()\n", 845 TWAIT_FNAME); 846 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracer, &status, 0), 847 tracer); 848 849 validate_status_exited(status, exitval_tracer); 850 851 DPRINTF("Wait for tracee to finish its job and exit - calling %s()\n", 852 TWAIT_FNAME); 853 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 854 tracee); 855 856 validate_status_exited(status, exitval_tracee); 857 858 msg_close(&parent_tracee); 859 msg_close(&parent_tracer); 860 } 861 #endif 862 863 #if defined(TWAIT_HAVE_PID) 864 ATF_TC(attach7); 865 ATF_TC_HEAD(attach7, tc) 866 { 867 atf_tc_set_md_var(tc, "descr", 868 "Assert that tracer sees its parent when attached to tracer " 869 "(check /proc/curproc/status 3rd column)"); 870 } 871 872 ATF_TC_BODY(attach7, tc) 873 { 874 struct msg_fds parent_tracee, parent_tracer; 875 int rv; 876 const int exitval_tracee = 5; 877 const int exitval_tracer = 10; 878 pid_t parent, tracee, tracer, wpid; 879 uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */ 880 #if defined(TWAIT_HAVE_STATUS) 881 int status; 882 #endif 883 FILE *fp; 884 struct stat st; 885 const char *fname = "/proc/curproc/status"; 886 char s_executable[MAXPATHLEN]; 887 int s_pid, s_ppid; 888 /* 889 * Format: 890 * EXECUTABLE PID PPID ... 891 */ 892 893 SYSCALL_REQUIRE((rv = stat(fname, &st)) == 0 || (errno == ENOENT)); 894 if (rv != 0) { 895 atf_tc_skip("/proc/curproc/status not found"); 896 } 897 898 DPRINTF("Spawn tracee\n"); 899 SYSCALL_REQUIRE(msg_open(&parent_tracee) == 0); 900 SYSCALL_REQUIRE(msg_open(&parent_tracer) == 0); 901 tracee = atf_utils_fork(); 902 if (tracee == 0) { 903 parent = getppid(); 904 905 // Wait for parent to let us exit 906 CHILD_TO_PARENT("tracee ready", parent_tracee, msg); 907 CHILD_FROM_PARENT("tracee exit", parent_tracee, msg); 908 909 FORKEE_ASSERT((fp = fopen(fname, "r")) != NULL); 910 fscanf(fp, "%s %d %d", s_executable, &s_pid, &s_ppid); 911 FORKEE_ASSERT(fclose(fp) == 0); 912 FORKEE_ASSERT_EQ(parent, s_ppid); 913 914 _exit(exitval_tracee); 915 } 916 917 DPRINTF("Wait for child to record its parent identifier (pid)\n"); 918 PARENT_FROM_CHILD("tracee ready", parent_tracee, msg); 919 920 DPRINTF("Spawn debugger\n"); 921 tracer = atf_utils_fork(); 922 if (tracer == 0) { 923 DPRINTF("Before calling PT_ATTACH from tracee %d\n", getpid()); 924 FORKEE_ASSERT(ptrace(PT_ATTACH, tracee, NULL, 0) != -1); 925 926 /* Wait for tracee and assert that it was stopped w/ SIGSTOP */ 927 FORKEE_REQUIRE_SUCCESS( 928 wpid = TWAIT_GENERIC(tracee, &status, 0), tracee); 929 930 forkee_status_stopped(status, SIGSTOP); 931 932 /* Resume tracee with PT_CONTINUE */ 933 FORKEE_ASSERT(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1); 934 935 /* Inform parent that tracer has attached to tracee */ 936 CHILD_TO_PARENT("tracer ready", parent_tracer, msg); 937 938 /* Wait for parent to tell use that tracee should have exited */ 939 CHILD_FROM_PARENT("wait for tracee exit", parent_tracer, msg); 940 941 /* Wait for tracee and assert that it exited */ 942 FORKEE_REQUIRE_SUCCESS( 943 wpid = TWAIT_GENERIC(tracee, &status, 0), tracee); 944 945 forkee_status_exited(status, exitval_tracee); 946 947 DPRINTF("Before exiting of the tracer process\n"); 948 _exit(exitval_tracer); 949 } 950 DPRINTF("Wait for the tracer to attach to the tracee\n"); 951 PARENT_FROM_CHILD("tracer ready", parent_tracer, msg); 952 DPRINTF("Resume the tracee and let it exit\n"); 953 PARENT_TO_CHILD("tracee exit", parent_tracee, msg); 954 955 DPRINTF("Detect that tracee is zombie\n"); 956 await_zombie(tracee); 957 958 DPRINTF("Assert that there is no status about tracee - " 959 "Tracer must detect zombie first - calling %s()\n", TWAIT_FNAME); 960 TWAIT_REQUIRE_SUCCESS( 961 wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 0); 962 963 DPRINTF("Resume the tracer and let it detect exited tracee\n"); 964 PARENT_TO_CHILD("Message 2", parent_tracer, msg); 965 966 DPRINTF("Wait for tracer to finish its job and exit - calling %s()\n", 967 TWAIT_FNAME); 968 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracer, &status, 0), 969 tracer); 970 971 validate_status_exited(status, exitval_tracer); 972 973 DPRINTF("Wait for tracee to finish its job and exit - calling %s()\n", 974 TWAIT_FNAME); 975 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 976 tracee); 977 978 validate_status_exited(status, exitval_tracee); 979 980 msg_close(&parent_tracee); 981 msg_close(&parent_tracer); 982 } 983 #endif 984 985 ATF_TC(eventmask1); 986 ATF_TC_HEAD(eventmask1, tc) 987 { 988 atf_tc_set_md_var(tc, "descr", 989 "Verify that empty EVENT_MASK is preserved"); 990 } 991 992 ATF_TC_BODY(eventmask1, tc) 993 { 994 const int exitval = 5; 995 const int sigval = SIGSTOP; 996 pid_t child, wpid; 997 #if defined(TWAIT_HAVE_STATUS) 998 int status; 999 #endif 1000 ptrace_event_t set_event, get_event; 1001 const int len = sizeof(ptrace_event_t); 1002 1003 DPRINTF("Before forking process PID=%d\n", getpid()); 1004 SYSCALL_REQUIRE((child = fork()) != -1); 1005 if (child == 0) { 1006 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 1007 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 1008 1009 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 1010 FORKEE_ASSERT(raise(sigval) == 0); 1011 1012 DPRINTF("Before exiting of the child process\n"); 1013 _exit(exitval); 1014 } 1015 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 1016 1017 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 1018 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1019 1020 validate_status_stopped(status, sigval); 1021 1022 set_event.pe_set_event = 0; 1023 SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &set_event, len) != -1); 1024 SYSCALL_REQUIRE(ptrace(PT_GET_EVENT_MASK, child, &get_event, len) != -1); 1025 ATF_REQUIRE(memcmp(&set_event, &get_event, len) == 0); 1026 1027 DPRINTF("Before resuming the child process where it left off and " 1028 "without signal to be sent\n"); 1029 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 1030 1031 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 1032 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1033 1034 validate_status_exited(status, exitval); 1035 1036 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 1037 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 1038 } 1039 1040 ATF_TC(eventmask2); 1041 ATF_TC_HEAD(eventmask2, tc) 1042 { 1043 atf_tc_set_md_var(tc, "descr", 1044 "Verify that PTRACE_FORK in EVENT_MASK is preserved"); 1045 } 1046 1047 ATF_TC_BODY(eventmask2, tc) 1048 { 1049 const int exitval = 5; 1050 const int sigval = SIGSTOP; 1051 pid_t child, wpid; 1052 #if defined(TWAIT_HAVE_STATUS) 1053 int status; 1054 #endif 1055 ptrace_event_t set_event, get_event; 1056 const int len = sizeof(ptrace_event_t); 1057 1058 DPRINTF("Before forking process PID=%d\n", getpid()); 1059 SYSCALL_REQUIRE((child = fork()) != -1); 1060 if (child == 0) { 1061 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 1062 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 1063 1064 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 1065 FORKEE_ASSERT(raise(sigval) == 0); 1066 1067 DPRINTF("Before exiting of the child process\n"); 1068 _exit(exitval); 1069 } 1070 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 1071 1072 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 1073 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1074 1075 validate_status_stopped(status, sigval); 1076 1077 set_event.pe_set_event = PTRACE_FORK; 1078 SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &set_event, len) != -1); 1079 SYSCALL_REQUIRE(ptrace(PT_GET_EVENT_MASK, child, &get_event, len) != -1); 1080 ATF_REQUIRE(memcmp(&set_event, &get_event, len) == 0); 1081 1082 DPRINTF("Before resuming the child process where it left off and " 1083 "without signal to be sent\n"); 1084 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 1085 1086 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 1087 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1088 1089 validate_status_exited(status, exitval); 1090 1091 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 1092 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 1093 } 1094 1095 ATF_TC(eventmask3); 1096 ATF_TC_HEAD(eventmask3, tc) 1097 { 1098 atf_tc_set_md_var(tc, "descr", 1099 "Verify that PTRACE_VFORK in EVENT_MASK is preserved"); 1100 } 1101 1102 ATF_TC_BODY(eventmask3, tc) 1103 { 1104 const int exitval = 5; 1105 const int sigval = SIGSTOP; 1106 pid_t child, wpid; 1107 #if defined(TWAIT_HAVE_STATUS) 1108 int status; 1109 #endif 1110 ptrace_event_t set_event, get_event; 1111 const int len = sizeof(ptrace_event_t); 1112 1113 atf_tc_expect_fail("PR kern/51630"); 1114 1115 DPRINTF("Before forking process PID=%d\n", getpid()); 1116 SYSCALL_REQUIRE((child = fork()) != -1); 1117 if (child == 0) { 1118 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 1119 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 1120 1121 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 1122 FORKEE_ASSERT(raise(sigval) == 0); 1123 1124 DPRINTF("Before exiting of the child process\n"); 1125 _exit(exitval); 1126 } 1127 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 1128 1129 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 1130 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1131 1132 validate_status_stopped(status, sigval); 1133 1134 set_event.pe_set_event = PTRACE_VFORK; 1135 SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &set_event, len) != -1 || errno == ENOTSUP); 1136 SYSCALL_REQUIRE(ptrace(PT_GET_EVENT_MASK, child, &get_event, len) != -1); 1137 ATF_REQUIRE(memcmp(&set_event, &get_event, len) == 0); 1138 1139 DPRINTF("Before resuming the child process where it left off and " 1140 "without signal to be sent\n"); 1141 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 1142 1143 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 1144 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1145 1146 validate_status_exited(status, exitval); 1147 1148 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 1149 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 1150 } 1151 1152 ATF_TC(eventmask4); 1153 ATF_TC_HEAD(eventmask4, tc) 1154 { 1155 atf_tc_set_md_var(tc, "descr", 1156 "Verify that PTRACE_VFORK_DONE in EVENT_MASK is preserved"); 1157 } 1158 1159 ATF_TC_BODY(eventmask4, tc) 1160 { 1161 const int exitval = 5; 1162 const int sigval = SIGSTOP; 1163 pid_t child, wpid; 1164 #if defined(TWAIT_HAVE_STATUS) 1165 int status; 1166 #endif 1167 ptrace_event_t set_event, get_event; 1168 const int len = sizeof(ptrace_event_t); 1169 1170 DPRINTF("Before forking process PID=%d\n", getpid()); 1171 SYSCALL_REQUIRE((child = fork()) != -1); 1172 if (child == 0) { 1173 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 1174 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 1175 1176 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 1177 FORKEE_ASSERT(raise(sigval) == 0); 1178 1179 DPRINTF("Before exiting of the child process\n"); 1180 _exit(exitval); 1181 } 1182 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 1183 1184 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 1185 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1186 1187 validate_status_stopped(status, sigval); 1188 1189 set_event.pe_set_event = PTRACE_VFORK_DONE; 1190 SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &set_event, len) != -1); 1191 SYSCALL_REQUIRE(ptrace(PT_GET_EVENT_MASK, child, &get_event, len) != -1); 1192 ATF_REQUIRE(memcmp(&set_event, &get_event, len) == 0); 1193 1194 DPRINTF("Before resuming the child process where it left off and " 1195 "without signal to be sent\n"); 1196 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 1197 1198 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 1199 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1200 1201 validate_status_exited(status, exitval); 1202 1203 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 1204 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 1205 } 1206 1207 ATF_TC(eventmask5); 1208 ATF_TC_HEAD(eventmask5, tc) 1209 { 1210 atf_tc_set_md_var(tc, "descr", 1211 "Verify that PTRACE_LWP_CREATE in EVENT_MASK is preserved"); 1212 } 1213 1214 ATF_TC_BODY(eventmask5, tc) 1215 { 1216 const int exitval = 5; 1217 const int sigval = SIGSTOP; 1218 pid_t child, wpid; 1219 #if defined(TWAIT_HAVE_STATUS) 1220 int status; 1221 #endif 1222 ptrace_event_t set_event, get_event; 1223 const int len = sizeof(ptrace_event_t); 1224 1225 DPRINTF("Before forking process PID=%d\n", getpid()); 1226 SYSCALL_REQUIRE((child = fork()) != -1); 1227 if (child == 0) { 1228 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 1229 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 1230 1231 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 1232 FORKEE_ASSERT(raise(sigval) == 0); 1233 1234 DPRINTF("Before exiting of the child process\n"); 1235 _exit(exitval); 1236 } 1237 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 1238 1239 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 1240 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1241 1242 validate_status_stopped(status, sigval); 1243 1244 set_event.pe_set_event = PTRACE_LWP_CREATE; 1245 SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &set_event, len) != -1); 1246 SYSCALL_REQUIRE(ptrace(PT_GET_EVENT_MASK, child, &get_event, len) != -1); 1247 ATF_REQUIRE(memcmp(&set_event, &get_event, len) == 0); 1248 1249 DPRINTF("Before resuming the child process where it left off and " 1250 "without signal to be sent\n"); 1251 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 1252 1253 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 1254 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1255 1256 validate_status_exited(status, exitval); 1257 1258 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 1259 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 1260 } 1261 1262 ATF_TC(eventmask6); 1263 ATF_TC_HEAD(eventmask6, tc) 1264 { 1265 atf_tc_set_md_var(tc, "descr", 1266 "Verify that PTRACE_LWP_EXIT in EVENT_MASK is preserved"); 1267 } 1268 1269 ATF_TC_BODY(eventmask6, tc) 1270 { 1271 const int exitval = 5; 1272 const int sigval = SIGSTOP; 1273 pid_t child, wpid; 1274 #if defined(TWAIT_HAVE_STATUS) 1275 int status; 1276 #endif 1277 ptrace_event_t set_event, get_event; 1278 const int len = sizeof(ptrace_event_t); 1279 1280 DPRINTF("Before forking process PID=%d\n", getpid()); 1281 SYSCALL_REQUIRE((child = fork()) != -1); 1282 if (child == 0) { 1283 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 1284 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 1285 1286 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 1287 FORKEE_ASSERT(raise(sigval) == 0); 1288 1289 DPRINTF("Before exiting of the child process\n"); 1290 _exit(exitval); 1291 } 1292 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 1293 1294 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 1295 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1296 1297 validate_status_stopped(status, sigval); 1298 1299 set_event.pe_set_event = PTRACE_LWP_EXIT; 1300 SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &set_event, len) != -1); 1301 SYSCALL_REQUIRE(ptrace(PT_GET_EVENT_MASK, child, &get_event, len) != -1); 1302 ATF_REQUIRE(memcmp(&set_event, &get_event, len) == 0); 1303 1304 DPRINTF("Before resuming the child process where it left off and " 1305 "without signal to be sent\n"); 1306 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 1307 1308 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 1309 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1310 1311 validate_status_exited(status, exitval); 1312 1313 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 1314 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 1315 } 1316 1317 #if defined(TWAIT_HAVE_PID) 1318 ATF_TC(fork1); 1319 ATF_TC_HEAD(fork1, tc) 1320 { 1321 atf_tc_set_md_var(tc, "descr", 1322 "Verify that fork(2) is intercepted by ptrace(2) with EVENT_MASK " 1323 "set to PTRACE_FORK"); 1324 } 1325 1326 ATF_TC_BODY(fork1, tc) 1327 { 1328 const int exitval = 5; 1329 const int exitval2 = 15; 1330 const int sigval = SIGSTOP; 1331 pid_t child, child2, wpid; 1332 #if defined(TWAIT_HAVE_STATUS) 1333 int status; 1334 #endif 1335 ptrace_state_t state; 1336 const int slen = sizeof(state); 1337 ptrace_event_t event; 1338 const int elen = sizeof(event); 1339 1340 DPRINTF("Before forking process PID=%d\n", getpid()); 1341 SYSCALL_REQUIRE((child = fork()) != -1); 1342 if (child == 0) { 1343 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 1344 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 1345 1346 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 1347 FORKEE_ASSERT(raise(sigval) == 0); 1348 1349 FORKEE_ASSERT((child2 = fork()) != -1); 1350 1351 if (child2 == 0) 1352 _exit(exitval2); 1353 1354 FORKEE_REQUIRE_SUCCESS 1355 (wpid = TWAIT_GENERIC(child2, &status, 0), child2); 1356 1357 forkee_status_exited(status, exitval2); 1358 1359 DPRINTF("Before exiting of the child process\n"); 1360 _exit(exitval); 1361 } 1362 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 1363 1364 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 1365 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1366 1367 validate_status_stopped(status, sigval); 1368 1369 DPRINTF("Enable PTRACE_FORK in EVENT_MASK for the child %d\n", child); 1370 event.pe_set_event = PTRACE_FORK; 1371 SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1); 1372 1373 DPRINTF("Before resuming the child process where it left off and " 1374 "without signal to be sent\n"); 1375 DPRINTF("We expect two SIGTRAP events, for child %d (TRAP_CHLD, " 1376 "pe_report_event=PTRACE_FORK, state.pe_other_pid=child2) and " 1377 "for child2 (TRAP_CHLD, pe_report_event=PTRACE_FORK, " 1378 "state.pe_other_pid=child)\n", child); 1379 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 1380 1381 DPRINTF("Before calling %s() for the child %d\n", TWAIT_FNAME, child); 1382 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1383 1384 validate_status_stopped(status, SIGTRAP); 1385 1386 SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child, &state, slen) != -1); 1387 ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_FORK); 1388 1389 child2 = state.pe_other_pid; 1390 DPRINTF("Reported PTRACE_FORK event with forkee %d\n", child2); 1391 1392 DPRINTF("Before calling %s() for the forkee %d of the child %d\n", 1393 TWAIT_FNAME, child2, child); 1394 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child2, &status, 0), 1395 child2); 1396 1397 validate_status_stopped(status, SIGTRAP); 1398 1399 SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child2, &state, slen) != -1); 1400 ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_FORK); 1401 ATF_REQUIRE_EQ(state.pe_other_pid, child); 1402 1403 DPRINTF("Before resuming the forkee process where it left off and " 1404 "without signal to be sent\n"); 1405 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child2, (void *)1, 0) != -1); 1406 1407 DPRINTF("Before resuming the child process where it left off and " 1408 "without signal to be sent\n"); 1409 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 1410 1411 DPRINTF("Before calling %s() for the forkee - expected exited\n", 1412 TWAIT_FNAME); 1413 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child2, &status, 0), 1414 child2); 1415 1416 validate_status_exited(status, exitval2); 1417 1418 DPRINTF("Before calling %s() for the forkee - expected no process\n", 1419 TWAIT_FNAME); 1420 TWAIT_REQUIRE_FAILURE(ECHILD, 1421 wpid = TWAIT_GENERIC(child2, &status, 0)); 1422 1423 DPRINTF("Before calling %s() for the child - expected stopped " 1424 "SIGCHLD\n", TWAIT_FNAME); 1425 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1426 1427 validate_status_stopped(status, SIGCHLD); 1428 1429 DPRINTF("Before resuming the child process where it left off and " 1430 "without signal to be sent\n"); 1431 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 1432 1433 DPRINTF("Before calling %s() for the child - expected exited\n", 1434 TWAIT_FNAME); 1435 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1436 1437 validate_status_exited(status, exitval); 1438 1439 DPRINTF("Before calling %s() for the child - expected no process\n", 1440 TWAIT_FNAME); 1441 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 1442 } 1443 #endif 1444 1445 ATF_TC(fork2); 1446 ATF_TC_HEAD(fork2, tc) 1447 { 1448 atf_tc_set_md_var(tc, "descr", 1449 "Verify that fork(2) is not intercepted by ptrace(2) with empty " 1450 "EVENT_MASK"); 1451 } 1452 1453 ATF_TC_BODY(fork2, tc) 1454 { 1455 const int exitval = 5; 1456 const int exitval2 = 15; 1457 const int sigval = SIGSTOP; 1458 pid_t child, child2, wpid; 1459 #if defined(TWAIT_HAVE_STATUS) 1460 int status; 1461 #endif 1462 ptrace_event_t event; 1463 const int elen = sizeof(event); 1464 1465 DPRINTF("Before forking process PID=%d\n", getpid()); 1466 SYSCALL_REQUIRE((child = fork()) != -1); 1467 if (child == 0) { 1468 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 1469 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 1470 1471 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 1472 FORKEE_ASSERT(raise(sigval) == 0); 1473 1474 FORKEE_ASSERT((child2 = fork()) != -1); 1475 1476 if (child2 == 0) 1477 _exit(exitval2); 1478 1479 FORKEE_REQUIRE_SUCCESS 1480 (wpid = TWAIT_GENERIC(child2, &status, 0), child2); 1481 1482 forkee_status_exited(status, exitval2); 1483 1484 DPRINTF("Before exiting of the child process\n"); 1485 _exit(exitval); 1486 } 1487 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 1488 1489 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 1490 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1491 1492 validate_status_stopped(status, sigval); 1493 1494 DPRINTF("Set empty EVENT_MASK for the child %d\n", child); 1495 event.pe_set_event = 0; 1496 SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1); 1497 1498 DPRINTF("Before resuming the child process where it left off and " 1499 "without signal to be sent\n"); 1500 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 1501 1502 DPRINTF("Before calling %s() for the child - expected stopped " 1503 "SIGCHLD\n", TWAIT_FNAME); 1504 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1505 1506 validate_status_stopped(status, SIGCHLD); 1507 1508 DPRINTF("Before resuming the child process where it left off and " 1509 "without signal to be sent\n"); 1510 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 1511 1512 DPRINTF("Before calling %s() for the child - expected exited\n", 1513 TWAIT_FNAME); 1514 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1515 1516 validate_status_exited(status, exitval); 1517 1518 DPRINTF("Before calling %s() for the child - expected no process\n", 1519 TWAIT_FNAME); 1520 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 1521 } 1522 1523 #if defined(TWAIT_HAVE_PID) 1524 ATF_TC(vfork1); 1525 ATF_TC_HEAD(vfork1, tc) 1526 { 1527 atf_tc_set_md_var(tc, "descr", 1528 "Verify that vfork(2) is intercepted by ptrace(2) with EVENT_MASK " 1529 "set to PTRACE_VFORK"); 1530 } 1531 1532 ATF_TC_BODY(vfork1, tc) 1533 { 1534 const int exitval = 5; 1535 const int exitval2 = 15; 1536 const int sigval = SIGSTOP; 1537 pid_t child, child2, wpid; 1538 #if defined(TWAIT_HAVE_STATUS) 1539 int status; 1540 #endif 1541 ptrace_state_t state; 1542 const int slen = sizeof(state); 1543 ptrace_event_t event; 1544 const int elen = sizeof(event); 1545 1546 atf_tc_expect_fail("PR kern/51630"); 1547 1548 DPRINTF("Before forking process PID=%d\n", getpid()); 1549 SYSCALL_REQUIRE((child = fork()) != -1); 1550 if (child == 0) { 1551 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 1552 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 1553 1554 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 1555 FORKEE_ASSERT(raise(sigval) == 0); 1556 1557 FORKEE_ASSERT((child2 = vfork()) != -1); 1558 1559 if (child2 == 0) 1560 _exit(exitval2); 1561 1562 FORKEE_REQUIRE_SUCCESS 1563 (wpid = TWAIT_GENERIC(child2, &status, 0), child2); 1564 1565 forkee_status_exited(status, exitval2); 1566 1567 DPRINTF("Before exiting of the child process\n"); 1568 _exit(exitval); 1569 } 1570 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 1571 1572 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 1573 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1574 1575 validate_status_stopped(status, sigval); 1576 1577 DPRINTF("Enable PTRACE_VFORK in EVENT_MASK for the child %d\n", child); 1578 event.pe_set_event = PTRACE_VFORK; 1579 SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1 || errno == ENOTSUP); 1580 1581 DPRINTF("Before resuming the child process where it left off and " 1582 "without signal to be sent\n"); 1583 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 1584 1585 DPRINTF("Before calling %s() for the child %d\n", TWAIT_FNAME, child); 1586 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1587 1588 validate_status_stopped(status, SIGTRAP); 1589 1590 SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child, &state, slen) != -1); 1591 ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_VFORK); 1592 1593 child2 = state.pe_other_pid; 1594 DPRINTF("Reported PTRACE_VFORK event with forkee %d\n", child2); 1595 1596 DPRINTF("Before calling %s() for the forkee %d of the child %d\n", 1597 TWAIT_FNAME, child2, child); 1598 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child2, &status, 0), 1599 child2); 1600 1601 validate_status_stopped(status, SIGTRAP); 1602 1603 SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child2, &state, slen) != -1); 1604 ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_VFORK); 1605 ATF_REQUIRE_EQ(state.pe_other_pid, child); 1606 1607 DPRINTF("Before resuming the forkee process where it left off and " 1608 "without signal to be sent\n"); 1609 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child2, (void *)1, 0) != -1); 1610 1611 DPRINTF("Before resuming the child process where it left off and " 1612 "without signal to be sent\n"); 1613 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 1614 1615 DPRINTF("Before calling %s() for the forkee - expected exited\n", 1616 TWAIT_FNAME); 1617 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child2, &status, 0), 1618 child2); 1619 1620 validate_status_exited(status, exitval2); 1621 1622 DPRINTF("Before calling %s() for the forkee - expected no process\n", 1623 TWAIT_FNAME); 1624 TWAIT_REQUIRE_FAILURE(ECHILD, 1625 wpid = TWAIT_GENERIC(child2, &status, 0)); 1626 1627 DPRINTF("Before calling %s() for the child - expected stopped " 1628 "SIGCHLD\n", TWAIT_FNAME); 1629 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1630 1631 validate_status_stopped(status, SIGCHLD); 1632 1633 DPRINTF("Before resuming the child process where it left off and " 1634 "without signal to be sent\n"); 1635 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 1636 1637 DPRINTF("Before calling %s() for the child - expected exited\n", 1638 TWAIT_FNAME); 1639 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1640 1641 validate_status_exited(status, exitval); 1642 1643 DPRINTF("Before calling %s() for the child - expected no process\n", 1644 TWAIT_FNAME); 1645 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 1646 } 1647 #endif 1648 1649 ATF_TC(vfork2); 1650 ATF_TC_HEAD(vfork2, tc) 1651 { 1652 atf_tc_set_md_var(tc, "descr", 1653 "Verify that vfork(2) is not intercepted by ptrace(2) with empty " 1654 "EVENT_MASK"); 1655 } 1656 1657 ATF_TC_BODY(vfork2, tc) 1658 { 1659 const int exitval = 5; 1660 const int exitval2 = 15; 1661 const int sigval = SIGSTOP; 1662 pid_t child, child2, wpid; 1663 #if defined(TWAIT_HAVE_STATUS) 1664 int status; 1665 #endif 1666 ptrace_event_t event; 1667 const int elen = sizeof(event); 1668 1669 DPRINTF("Before forking process PID=%d\n", getpid()); 1670 SYSCALL_REQUIRE((child = fork()) != -1); 1671 if (child == 0) { 1672 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 1673 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 1674 1675 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 1676 FORKEE_ASSERT(raise(sigval) == 0); 1677 1678 FORKEE_ASSERT((child2 = vfork()) != -1); 1679 1680 if (child2 == 0) 1681 _exit(exitval2); 1682 1683 FORKEE_REQUIRE_SUCCESS 1684 (wpid = TWAIT_GENERIC(child2, &status, 0), child2); 1685 1686 forkee_status_exited(status, exitval2); 1687 1688 DPRINTF("Before exiting of the child process\n"); 1689 _exit(exitval); 1690 } 1691 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 1692 1693 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 1694 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1695 1696 validate_status_stopped(status, sigval); 1697 1698 DPRINTF("Set empty EVENT_MASK for the child %d\n", child); 1699 event.pe_set_event = 0; 1700 SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1); 1701 1702 DPRINTF("Before resuming the child process where it left off and " 1703 "without signal to be sent\n"); 1704 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 1705 1706 DPRINTF("Before calling %s() for the child - expected stopped " 1707 "SIGCHLD\n", TWAIT_FNAME); 1708 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1709 1710 validate_status_stopped(status, SIGCHLD); 1711 1712 DPRINTF("Before resuming the child process where it left off and " 1713 "without signal to be sent\n"); 1714 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 1715 1716 DPRINTF("Before calling %s() for the child - expected exited\n", 1717 TWAIT_FNAME); 1718 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1719 1720 validate_status_exited(status, exitval); 1721 1722 DPRINTF("Before calling %s() for the child - expected no process\n", 1723 TWAIT_FNAME); 1724 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 1725 } 1726 1727 ATF_TC(vforkdone1); 1728 ATF_TC_HEAD(vforkdone1, tc) 1729 { 1730 atf_tc_set_md_var(tc, "descr", 1731 "Verify that vfork(2) is intercepted by ptrace(2) with EVENT_MASK " 1732 "set to PTRACE_VFORK_DONE"); 1733 } 1734 1735 ATF_TC_BODY(vforkdone1, tc) 1736 { 1737 const int exitval = 5; 1738 const int exitval2 = 15; 1739 const int sigval = SIGSTOP; 1740 pid_t child, child2, wpid; 1741 #if defined(TWAIT_HAVE_STATUS) 1742 int status; 1743 #endif 1744 ptrace_state_t state; 1745 const int slen = sizeof(state); 1746 ptrace_event_t event; 1747 const int elen = sizeof(event); 1748 1749 DPRINTF("Before forking process PID=%d\n", getpid()); 1750 SYSCALL_REQUIRE((child = fork()) != -1); 1751 if (child == 0) { 1752 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 1753 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 1754 1755 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 1756 FORKEE_ASSERT(raise(sigval) == 0); 1757 1758 FORKEE_ASSERT((child2 = vfork()) != -1); 1759 1760 if (child2 == 0) 1761 _exit(exitval2); 1762 1763 FORKEE_REQUIRE_SUCCESS 1764 (wpid = TWAIT_GENERIC(child2, &status, 0), child2); 1765 1766 forkee_status_exited(status, exitval2); 1767 1768 DPRINTF("Before exiting of the child process\n"); 1769 _exit(exitval); 1770 } 1771 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 1772 1773 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 1774 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1775 1776 validate_status_stopped(status, sigval); 1777 1778 DPRINTF("Enable PTRACE_VFORK_DONE in EVENT_MASK for the child %d\n", 1779 child); 1780 event.pe_set_event = PTRACE_VFORK_DONE; 1781 SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1); 1782 1783 DPRINTF("Before resuming the child process where it left off and " 1784 "without signal to be sent\n"); 1785 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 1786 1787 DPRINTF("Before calling %s() for the child %d\n", TWAIT_FNAME, child); 1788 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1789 1790 validate_status_stopped(status, SIGTRAP); 1791 1792 SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child, &state, slen) != -1); 1793 ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_VFORK_DONE); 1794 1795 child2 = state.pe_other_pid; 1796 DPRINTF("Reported PTRACE_VFORK_DONE event with forkee %d\n", child2); 1797 1798 DPRINTF("Before resuming the child process where it left off and " 1799 "without signal to be sent\n"); 1800 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 1801 1802 DPRINTF("Before calling %s() for the child - expected stopped " 1803 "SIGCHLD\n", TWAIT_FNAME); 1804 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1805 1806 validate_status_stopped(status, SIGCHLD); 1807 1808 DPRINTF("Before resuming the child process where it left off and " 1809 "without signal to be sent\n"); 1810 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 1811 1812 DPRINTF("Before calling %s() for the child - expected exited\n", 1813 TWAIT_FNAME); 1814 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1815 1816 validate_status_exited(status, exitval); 1817 1818 DPRINTF("Before calling %s() for the child - expected no process\n", 1819 TWAIT_FNAME); 1820 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 1821 } 1822 1823 ATF_TC(vforkdone2); 1824 ATF_TC_HEAD(vforkdone2, tc) 1825 { 1826 atf_tc_set_md_var(tc, "descr", 1827 "Verify that vfork(2) is intercepted by ptrace(2) with EVENT_MASK " 1828 "set to PTRACE_FORK | PTRACE_VFORK_DONE"); 1829 } 1830 1831 ATF_TC_BODY(vforkdone2, tc) 1832 { 1833 const int exitval = 5; 1834 const int exitval2 = 15; 1835 const int sigval = SIGSTOP; 1836 pid_t child, child2, wpid; 1837 #if defined(TWAIT_HAVE_STATUS) 1838 int status; 1839 #endif 1840 ptrace_state_t state; 1841 const int slen = sizeof(state); 1842 ptrace_event_t event; 1843 const int elen = sizeof(event); 1844 1845 DPRINTF("Before forking process PID=%d\n", getpid()); 1846 SYSCALL_REQUIRE((child = fork()) != -1); 1847 if (child == 0) { 1848 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 1849 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 1850 1851 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 1852 FORKEE_ASSERT(raise(sigval) == 0); 1853 1854 FORKEE_ASSERT((child2 = vfork()) != -1); 1855 1856 if (child2 == 0) 1857 _exit(exitval2); 1858 1859 FORKEE_REQUIRE_SUCCESS 1860 (wpid = TWAIT_GENERIC(child2, &status, 0), child2); 1861 1862 forkee_status_exited(status, exitval2); 1863 1864 DPRINTF("Before exiting of the child process\n"); 1865 _exit(exitval); 1866 } 1867 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 1868 1869 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 1870 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1871 1872 validate_status_stopped(status, sigval); 1873 1874 DPRINTF("Enable PTRACE_VFORK in EVENT_MASK for the child %d\n", child); 1875 event.pe_set_event = PTRACE_FORK | PTRACE_VFORK_DONE; 1876 SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1); 1877 1878 DPRINTF("Before resuming the child process where it left off and " 1879 "without signal to be sent\n"); 1880 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 1881 1882 DPRINTF("Before calling %s() for the child %d\n", TWAIT_FNAME, child); 1883 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1884 1885 validate_status_stopped(status, SIGTRAP); 1886 1887 SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child, &state, slen) != -1); 1888 ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_VFORK_DONE); 1889 1890 child2 = state.pe_other_pid; 1891 DPRINTF("Reported PTRACE_VFORK_DONE event with forkee %d\n", child2); 1892 1893 DPRINTF("Before resuming the child process where it left off and " 1894 "without signal to be sent\n"); 1895 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 1896 1897 DPRINTF("Before calling %s() for the child - expected stopped " 1898 "SIGCHLD\n", TWAIT_FNAME); 1899 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1900 1901 validate_status_stopped(status, SIGCHLD); 1902 1903 DPRINTF("Before resuming the child process where it left off and " 1904 "without signal to be sent\n"); 1905 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 1906 1907 DPRINTF("Before calling %s() for the child - expected exited\n", 1908 TWAIT_FNAME); 1909 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1910 1911 validate_status_exited(status, exitval); 1912 1913 DPRINTF("Before calling %s() for the child - expected no process\n", 1914 TWAIT_FNAME); 1915 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 1916 } 1917 1918 ATF_TC(io_read_d1); 1919 ATF_TC_HEAD(io_read_d1, tc) 1920 { 1921 atf_tc_set_md_var(tc, "descr", 1922 "Verify PT_IO with PIOD_READ_D and len = sizeof(uint8_t)"); 1923 } 1924 1925 ATF_TC_BODY(io_read_d1, tc) 1926 { 1927 const int exitval = 5; 1928 const int sigval = SIGSTOP; 1929 pid_t child, wpid; 1930 uint8_t lookup_me = 0; 1931 const uint8_t magic = 0xab; 1932 struct ptrace_io_desc io = { 1933 .piod_op = PIOD_READ_D, 1934 .piod_offs = &lookup_me, 1935 .piod_addr = &lookup_me, 1936 .piod_len = sizeof(lookup_me) 1937 }; 1938 #if defined(TWAIT_HAVE_STATUS) 1939 int status; 1940 #endif 1941 1942 DPRINTF("Before forking process PID=%d\n", getpid()); 1943 SYSCALL_REQUIRE((child = fork()) != -1); 1944 if (child == 0) { 1945 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 1946 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 1947 1948 lookup_me = magic; 1949 1950 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 1951 FORKEE_ASSERT(raise(sigval) == 0); 1952 1953 DPRINTF("Before exiting of the child process\n"); 1954 _exit(exitval); 1955 } 1956 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 1957 1958 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 1959 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1960 1961 validate_status_stopped(status, sigval); 1962 1963 DPRINTF("Read lookup_me from tracee (PID=%d) by tracer (PID=%d)\n", 1964 child, getpid()); 1965 SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1); 1966 1967 ATF_REQUIRE_EQ_MSG(lookup_me, magic, 1968 "got value %" PRIx8 " != expected %" PRIx8, lookup_me, magic); 1969 1970 DPRINTF("Before resuming the child process where it left off and " 1971 "without signal to be sent\n"); 1972 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 1973 1974 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 1975 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 1976 1977 validate_status_exited(status, exitval); 1978 1979 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 1980 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 1981 } 1982 1983 ATF_TC(io_read_d2); 1984 ATF_TC_HEAD(io_read_d2, tc) 1985 { 1986 atf_tc_set_md_var(tc, "descr", 1987 "Verify PT_IO with PIOD_READ_D and len = sizeof(uint16_t)"); 1988 } 1989 1990 ATF_TC_BODY(io_read_d2, tc) 1991 { 1992 const int exitval = 5; 1993 const int sigval = SIGSTOP; 1994 pid_t child, wpid; 1995 uint16_t lookup_me = 0; 1996 const uint16_t magic = 0x1234; 1997 struct ptrace_io_desc io = { 1998 .piod_op = PIOD_READ_D, 1999 .piod_offs = &lookup_me, 2000 .piod_addr = &lookup_me, 2001 .piod_len = sizeof(lookup_me) 2002 }; 2003 #if defined(TWAIT_HAVE_STATUS) 2004 int status; 2005 #endif 2006 2007 DPRINTF("Before forking process PID=%d\n", getpid()); 2008 SYSCALL_REQUIRE((child = fork()) != -1); 2009 if (child == 0) { 2010 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 2011 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 2012 2013 lookup_me = magic; 2014 2015 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 2016 FORKEE_ASSERT(raise(sigval) == 0); 2017 2018 DPRINTF("Before exiting of the child process\n"); 2019 _exit(exitval); 2020 } 2021 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 2022 2023 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2024 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2025 2026 validate_status_stopped(status, sigval); 2027 2028 DPRINTF("Read lookup_me from tracee (PID=%d) by tracer (PID=%d)\n", 2029 child, getpid()); 2030 SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1); 2031 2032 ATF_REQUIRE_EQ_MSG(lookup_me, magic, 2033 "got value %" PRIx16 " != expected %" PRIx16, lookup_me, magic); 2034 2035 DPRINTF("Before resuming the child process where it left off and " 2036 "without signal to be sent\n"); 2037 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 2038 2039 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2040 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2041 2042 validate_status_exited(status, exitval); 2043 2044 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2045 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 2046 } 2047 2048 ATF_TC(io_read_d3); 2049 ATF_TC_HEAD(io_read_d3, tc) 2050 { 2051 atf_tc_set_md_var(tc, "descr", 2052 "Verify PT_IO with PIOD_READ_D and len = sizeof(uint32_t)"); 2053 } 2054 2055 ATF_TC_BODY(io_read_d3, tc) 2056 { 2057 const int exitval = 5; 2058 const int sigval = SIGSTOP; 2059 pid_t child, wpid; 2060 uint32_t lookup_me = 0; 2061 const uint32_t magic = 0x1234abcd; 2062 struct ptrace_io_desc io = { 2063 .piod_op = PIOD_READ_D, 2064 .piod_offs = &lookup_me, 2065 .piod_addr = &lookup_me, 2066 .piod_len = sizeof(lookup_me) 2067 }; 2068 #if defined(TWAIT_HAVE_STATUS) 2069 int status; 2070 #endif 2071 2072 DPRINTF("Before forking process PID=%d\n", getpid()); 2073 SYSCALL_REQUIRE((child = fork()) != -1); 2074 if (child == 0) { 2075 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 2076 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 2077 2078 lookup_me = magic; 2079 2080 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 2081 FORKEE_ASSERT(raise(sigval) == 0); 2082 2083 DPRINTF("Before exiting of the child process\n"); 2084 _exit(exitval); 2085 } 2086 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 2087 2088 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2089 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2090 2091 validate_status_stopped(status, sigval); 2092 2093 DPRINTF("Read lookup_me from tracee (PID=%d) by tracer (PID=%d)\n", 2094 child, getpid()); 2095 SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1); 2096 2097 ATF_REQUIRE_EQ_MSG(lookup_me, magic, 2098 "got value %" PRIx32 " != expected %" PRIx32, lookup_me, magic); 2099 2100 DPRINTF("Before resuming the child process where it left off and " 2101 "without signal to be sent\n"); 2102 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 2103 2104 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2105 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2106 2107 validate_status_exited(status, exitval); 2108 2109 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2110 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 2111 } 2112 2113 ATF_TC(io_read_d4); 2114 ATF_TC_HEAD(io_read_d4, tc) 2115 { 2116 atf_tc_set_md_var(tc, "descr", 2117 "Verify PT_IO with PIOD_READ_D and len = sizeof(uint64_t)"); 2118 } 2119 2120 ATF_TC_BODY(io_read_d4, tc) 2121 { 2122 const int exitval = 5; 2123 const int sigval = SIGSTOP; 2124 pid_t child, wpid; 2125 uint64_t lookup_me = 0; 2126 const uint64_t magic = 0x1234abcd9876dcfa; 2127 struct ptrace_io_desc io = { 2128 .piod_op = PIOD_READ_D, 2129 .piod_offs = &lookup_me, 2130 .piod_addr = &lookup_me, 2131 .piod_len = sizeof(lookup_me) 2132 }; 2133 #if defined(TWAIT_HAVE_STATUS) 2134 int status; 2135 #endif 2136 2137 DPRINTF("Before forking process PID=%d\n", getpid()); 2138 SYSCALL_REQUIRE((child = fork()) != -1); 2139 if (child == 0) { 2140 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 2141 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 2142 2143 lookup_me = magic; 2144 2145 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 2146 FORKEE_ASSERT(raise(sigval) == 0); 2147 2148 DPRINTF("Before exiting of the child process\n"); 2149 _exit(exitval); 2150 } 2151 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 2152 2153 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2154 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2155 2156 validate_status_stopped(status, sigval); 2157 2158 DPRINTF("Read lookup_me from tracee (PID=%d) by tracer (PID=%d)\n", 2159 child, getpid()); 2160 SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1); 2161 2162 ATF_REQUIRE_EQ_MSG(lookup_me, magic, 2163 "got value %" PRIx64 " != expected %" PRIx64, lookup_me, magic); 2164 2165 DPRINTF("Before resuming the child process where it left off and " 2166 "without signal to be sent\n"); 2167 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 2168 2169 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2170 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2171 2172 validate_status_exited(status, exitval); 2173 2174 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2175 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 2176 } 2177 2178 ATF_TC(io_write_d1); 2179 ATF_TC_HEAD(io_write_d1, tc) 2180 { 2181 atf_tc_set_md_var(tc, "descr", 2182 "Verify PT_IO with PIOD_WRITE_D and len = sizeof(uint8_t)"); 2183 } 2184 2185 ATF_TC_BODY(io_write_d1, tc) 2186 { 2187 const int exitval = 5; 2188 const int sigval = SIGSTOP; 2189 pid_t child, wpid; 2190 uint8_t lookup_me = 0; 2191 const uint8_t magic = 0xab; 2192 struct ptrace_io_desc io = { 2193 .piod_op = PIOD_WRITE_D, 2194 .piod_offs = &lookup_me, 2195 .piod_addr = &lookup_me, 2196 .piod_len = sizeof(lookup_me) 2197 }; 2198 #if defined(TWAIT_HAVE_STATUS) 2199 int status; 2200 #endif 2201 2202 DPRINTF("Before forking process PID=%d\n", getpid()); 2203 SYSCALL_REQUIRE((child = fork()) != -1); 2204 if (child == 0) { 2205 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 2206 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 2207 2208 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 2209 FORKEE_ASSERT(raise(sigval) == 0); 2210 2211 FORKEE_ASSERT_EQ(lookup_me, magic); 2212 2213 DPRINTF("Before exiting of the child process\n"); 2214 _exit(exitval); 2215 } 2216 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 2217 2218 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2219 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2220 2221 validate_status_stopped(status, sigval); 2222 2223 lookup_me = magic; 2224 2225 DPRINTF("Write new lookup_me to tracee (PID=%d) from tracer (PID=%d)\n", 2226 child, getpid()); 2227 SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1); 2228 2229 DPRINTF("Before resuming the child process where it left off and " 2230 "without signal to be sent\n"); 2231 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 2232 2233 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2234 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2235 2236 validate_status_exited(status, exitval); 2237 2238 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2239 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 2240 } 2241 2242 ATF_TC(io_write_d2); 2243 ATF_TC_HEAD(io_write_d2, tc) 2244 { 2245 atf_tc_set_md_var(tc, "descr", 2246 "Verify PT_IO with PIOD_WRITE_D and len = sizeof(uint16_t)"); 2247 } 2248 2249 ATF_TC_BODY(io_write_d2, tc) 2250 { 2251 const int exitval = 5; 2252 const int sigval = SIGSTOP; 2253 pid_t child, wpid; 2254 uint16_t lookup_me = 0; 2255 const uint16_t magic = 0xab12; 2256 struct ptrace_io_desc io = { 2257 .piod_op = PIOD_WRITE_D, 2258 .piod_offs = &lookup_me, 2259 .piod_addr = &lookup_me, 2260 .piod_len = sizeof(lookup_me) 2261 }; 2262 #if defined(TWAIT_HAVE_STATUS) 2263 int status; 2264 #endif 2265 2266 DPRINTF("Before forking process PID=%d\n", getpid()); 2267 SYSCALL_REQUIRE((child = fork()) != -1); 2268 if (child == 0) { 2269 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 2270 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 2271 2272 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 2273 FORKEE_ASSERT(raise(sigval) == 0); 2274 2275 FORKEE_ASSERT_EQ(lookup_me, magic); 2276 2277 DPRINTF("Before exiting of the child process\n"); 2278 _exit(exitval); 2279 } 2280 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 2281 2282 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2283 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2284 2285 validate_status_stopped(status, sigval); 2286 2287 lookup_me = magic; 2288 2289 DPRINTF("Write new lookup_me to tracee (PID=%d) from tracer (PID=%d)\n", 2290 child, getpid()); 2291 SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1); 2292 2293 DPRINTF("Before resuming the child process where it left off and " 2294 "without signal to be sent\n"); 2295 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 2296 2297 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2298 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2299 2300 validate_status_exited(status, exitval); 2301 2302 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2303 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 2304 } 2305 2306 ATF_TC(io_write_d3); 2307 ATF_TC_HEAD(io_write_d3, tc) 2308 { 2309 atf_tc_set_md_var(tc, "descr", 2310 "Verify PT_IO with PIOD_WRITE_D and len = sizeof(uint32_t)"); 2311 } 2312 2313 ATF_TC_BODY(io_write_d3, tc) 2314 { 2315 const int exitval = 5; 2316 const int sigval = SIGSTOP; 2317 pid_t child, wpid; 2318 uint32_t lookup_me = 0; 2319 const uint32_t magic = 0xab127643; 2320 struct ptrace_io_desc io = { 2321 .piod_op = PIOD_WRITE_D, 2322 .piod_offs = &lookup_me, 2323 .piod_addr = &lookup_me, 2324 .piod_len = sizeof(lookup_me) 2325 }; 2326 #if defined(TWAIT_HAVE_STATUS) 2327 int status; 2328 #endif 2329 2330 DPRINTF("Before forking process PID=%d\n", getpid()); 2331 SYSCALL_REQUIRE((child = fork()) != -1); 2332 if (child == 0) { 2333 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 2334 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 2335 2336 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 2337 FORKEE_ASSERT(raise(sigval) == 0); 2338 2339 FORKEE_ASSERT_EQ(lookup_me, magic); 2340 2341 DPRINTF("Before exiting of the child process\n"); 2342 _exit(exitval); 2343 } 2344 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 2345 2346 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2347 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2348 2349 validate_status_stopped(status, sigval); 2350 2351 lookup_me = magic; 2352 2353 DPRINTF("Write new lookup_me to tracee (PID=%d) from tracer (PID=%d)\n", 2354 child, getpid()); 2355 SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1); 2356 2357 DPRINTF("Before resuming the child process where it left off and " 2358 "without signal to be sent\n"); 2359 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 2360 2361 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2362 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2363 2364 validate_status_exited(status, exitval); 2365 2366 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2367 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 2368 } 2369 2370 ATF_TC(io_write_d4); 2371 ATF_TC_HEAD(io_write_d4, tc) 2372 { 2373 atf_tc_set_md_var(tc, "descr", 2374 "Verify PT_IO with PIOD_WRITE_D and len = sizeof(uint64_t)"); 2375 } 2376 2377 ATF_TC_BODY(io_write_d4, tc) 2378 { 2379 const int exitval = 5; 2380 const int sigval = SIGSTOP; 2381 pid_t child, wpid; 2382 uint64_t lookup_me = 0; 2383 const uint64_t magic = 0xab12764376490123; 2384 struct ptrace_io_desc io = { 2385 .piod_op = PIOD_WRITE_D, 2386 .piod_offs = &lookup_me, 2387 .piod_addr = &lookup_me, 2388 .piod_len = sizeof(lookup_me) 2389 }; 2390 #if defined(TWAIT_HAVE_STATUS) 2391 int status; 2392 #endif 2393 2394 DPRINTF("Before forking process PID=%d\n", getpid()); 2395 SYSCALL_REQUIRE((child = fork()) != -1); 2396 if (child == 0) { 2397 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 2398 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 2399 2400 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 2401 FORKEE_ASSERT(raise(sigval) == 0); 2402 2403 FORKEE_ASSERT_EQ(lookup_me, magic); 2404 2405 DPRINTF("Before exiting of the child process\n"); 2406 _exit(exitval); 2407 } 2408 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 2409 2410 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2411 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2412 2413 validate_status_stopped(status, sigval); 2414 2415 lookup_me = magic; 2416 2417 DPRINTF("Write new lookup_me to tracee (PID=%d) from tracer (PID=%d)\n", 2418 child, getpid()); 2419 SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1); 2420 2421 DPRINTF("Before resuming the child process where it left off and " 2422 "without signal to be sent\n"); 2423 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 2424 2425 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2426 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2427 2428 validate_status_exited(status, exitval); 2429 2430 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2431 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 2432 } 2433 2434 ATF_TC(io_read_auxv1); 2435 ATF_TC_HEAD(io_read_auxv1, tc) 2436 { 2437 atf_tc_set_md_var(tc, "descr", 2438 "Verify PT_READ_AUXV called for tracee"); 2439 } 2440 2441 ATF_TC_BODY(io_read_auxv1, tc) 2442 { 2443 const int exitval = 5; 2444 const int sigval = SIGSTOP; 2445 pid_t child, wpid; 2446 #if defined(TWAIT_HAVE_STATUS) 2447 int status; 2448 #endif 2449 AuxInfo ai[100], *aip; 2450 struct ptrace_io_desc io = { 2451 .piod_op = PIOD_READ_AUXV, 2452 .piod_offs = 0, 2453 .piod_addr = ai, 2454 .piod_len = sizeof(ai) 2455 }; 2456 2457 DPRINTF("Before forking process PID=%d\n", getpid()); 2458 SYSCALL_REQUIRE((child = fork()) != -1); 2459 if (child == 0) { 2460 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 2461 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 2462 2463 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 2464 FORKEE_ASSERT(raise(sigval) == 0); 2465 2466 DPRINTF("Before exiting of the child process\n"); 2467 _exit(exitval); 2468 } 2469 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 2470 2471 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2472 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2473 2474 validate_status_stopped(status, sigval); 2475 2476 DPRINTF("Read new AUXV from tracee (PID=%d) by tracer (PID=%d)\n", 2477 child, getpid()); 2478 SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1); 2479 2480 DPRINTF("Asserting that AUXV length (%zu) is > 0\n", io.piod_len); 2481 ATF_REQUIRE(io.piod_len > 0); 2482 2483 for (aip = ai; aip->a_type != AT_NULL; aip++) 2484 DPRINTF("a_type=%#llx a_v=%#llx\n", 2485 (long long int)aip->a_type, (long long int)aip->a_v); 2486 2487 DPRINTF("Before resuming the child process where it left off and " 2488 "without signal to be sent\n"); 2489 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 2490 2491 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2492 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2493 2494 validate_status_exited(status, exitval); 2495 2496 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2497 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 2498 } 2499 2500 ATF_TC(read_d1); 2501 ATF_TC_HEAD(read_d1, tc) 2502 { 2503 atf_tc_set_md_var(tc, "descr", 2504 "Verify PT_READ_D called once"); 2505 } 2506 2507 ATF_TC_BODY(read_d1, tc) 2508 { 2509 const int exitval = 5; 2510 const int sigval = SIGSTOP; 2511 pid_t child, wpid; 2512 int lookup_me = 0; 2513 const int magic = (int)random(); 2514 #if defined(TWAIT_HAVE_STATUS) 2515 int status; 2516 #endif 2517 2518 DPRINTF("Before forking process PID=%d\n", getpid()); 2519 SYSCALL_REQUIRE((child = fork()) != -1); 2520 if (child == 0) { 2521 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 2522 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 2523 2524 lookup_me = magic; 2525 2526 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 2527 FORKEE_ASSERT(raise(sigval) == 0); 2528 2529 DPRINTF("Before exiting of the child process\n"); 2530 _exit(exitval); 2531 } 2532 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 2533 2534 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2535 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2536 2537 validate_status_stopped(status, sigval); 2538 2539 DPRINTF("Read new lookup_me from tracee (PID=%d) by tracer (PID=%d)\n", 2540 child, getpid()); 2541 errno = 0; 2542 lookup_me = ptrace(PT_READ_D, child, &lookup_me, 0); 2543 SYSCALL_REQUIRE_ERRNO(errno, 0); 2544 2545 ATF_REQUIRE_EQ_MSG(lookup_me, magic, 2546 "got value %#x != expected %#x", lookup_me, magic); 2547 2548 DPRINTF("Before resuming the child process where it left off and " 2549 "without signal to be sent\n"); 2550 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 2551 2552 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2553 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2554 2555 validate_status_exited(status, exitval); 2556 2557 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2558 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 2559 } 2560 2561 ATF_TC(read_d2); 2562 ATF_TC_HEAD(read_d2, tc) 2563 { 2564 atf_tc_set_md_var(tc, "descr", 2565 "Verify PT_READ_D called twice"); 2566 } 2567 2568 ATF_TC_BODY(read_d2, tc) 2569 { 2570 const int exitval = 5; 2571 const int sigval = SIGSTOP; 2572 pid_t child, wpid; 2573 int lookup_me1 = 0; 2574 int lookup_me2 = 0; 2575 const int magic1 = (int)random(); 2576 const int magic2 = (int)random(); 2577 #if defined(TWAIT_HAVE_STATUS) 2578 int status; 2579 #endif 2580 2581 DPRINTF("Before forking process PID=%d\n", getpid()); 2582 SYSCALL_REQUIRE((child = fork()) != -1); 2583 if (child == 0) { 2584 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 2585 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 2586 2587 lookup_me1 = magic1; 2588 lookup_me2 = magic2; 2589 2590 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 2591 FORKEE_ASSERT(raise(sigval) == 0); 2592 2593 DPRINTF("Before exiting of the child process\n"); 2594 _exit(exitval); 2595 } 2596 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 2597 2598 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2599 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2600 2601 validate_status_stopped(status, sigval); 2602 2603 DPRINTF("Read new lookup_me1 from tracee (PID=%d) by tracer (PID=%d)\n", 2604 child, getpid()); 2605 errno = 0; 2606 lookup_me1 = ptrace(PT_READ_D, child, &lookup_me1, 0); 2607 SYSCALL_REQUIRE_ERRNO(errno, 0); 2608 2609 ATF_REQUIRE_EQ_MSG(lookup_me1, magic1, 2610 "got value %#x != expected %#x", lookup_me1, magic1); 2611 2612 DPRINTF("Read new lookup_me2 from tracee (PID=%d) by tracer (PID=%d)\n", 2613 child, getpid()); 2614 errno = 0; 2615 lookup_me2 = ptrace(PT_READ_D, child, &lookup_me2, 0); 2616 SYSCALL_REQUIRE_ERRNO(errno, 0); 2617 2618 ATF_REQUIRE_EQ_MSG(lookup_me2, magic2, 2619 "got value %#x != expected %#x", lookup_me2, magic2); 2620 2621 DPRINTF("Before resuming the child process where it left off and " 2622 "without signal to be sent\n"); 2623 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 2624 2625 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2626 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2627 2628 validate_status_exited(status, exitval); 2629 2630 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2631 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 2632 } 2633 2634 ATF_TC(read_d3); 2635 ATF_TC_HEAD(read_d3, tc) 2636 { 2637 atf_tc_set_md_var(tc, "descr", 2638 "Verify PT_READ_D called three times"); 2639 } 2640 2641 ATF_TC_BODY(read_d3, tc) 2642 { 2643 const int exitval = 5; 2644 const int sigval = SIGSTOP; 2645 pid_t child, wpid; 2646 int lookup_me1 = 0; 2647 int lookup_me2 = 0; 2648 int lookup_me3 = 0; 2649 const int magic1 = (int)random(); 2650 const int magic2 = (int)random(); 2651 const int magic3 = (int)random(); 2652 #if defined(TWAIT_HAVE_STATUS) 2653 int status; 2654 #endif 2655 2656 DPRINTF("Before forking process PID=%d\n", getpid()); 2657 SYSCALL_REQUIRE((child = fork()) != -1); 2658 if (child == 0) { 2659 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 2660 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 2661 2662 lookup_me1 = magic1; 2663 lookup_me2 = magic2; 2664 lookup_me3 = magic3; 2665 2666 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 2667 FORKEE_ASSERT(raise(sigval) == 0); 2668 2669 DPRINTF("Before exiting of the child process\n"); 2670 _exit(exitval); 2671 } 2672 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 2673 2674 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2675 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2676 2677 validate_status_stopped(status, sigval); 2678 2679 DPRINTF("Read new lookup_me1 from tracee (PID=%d) by tracer (PID=%d)\n", 2680 child, getpid()); 2681 errno = 0; 2682 lookup_me1 = ptrace(PT_READ_D, child, &lookup_me1, 0); 2683 SYSCALL_REQUIRE_ERRNO(errno, 0); 2684 2685 ATF_REQUIRE_EQ_MSG(lookup_me1, magic1, 2686 "got value %#x != expected %#x", lookup_me1, magic1); 2687 2688 DPRINTF("Read new lookup_me2 from tracee (PID=%d) by tracer (PID=%d)\n", 2689 child, getpid()); 2690 errno = 0; 2691 lookup_me2 = ptrace(PT_READ_D, child, &lookup_me2, 0); 2692 SYSCALL_REQUIRE_ERRNO(errno, 0); 2693 2694 ATF_REQUIRE_EQ_MSG(lookup_me2, magic2, 2695 "got value %#x != expected %#x", lookup_me2, magic2); 2696 2697 DPRINTF("Read new lookup_me3 from tracee (PID=%d) by tracer (PID=%d)\n", 2698 child, getpid()); 2699 errno = 0; 2700 lookup_me3 = ptrace(PT_READ_D, child, &lookup_me3, 0); 2701 SYSCALL_REQUIRE_ERRNO(errno, 0); 2702 2703 ATF_REQUIRE_EQ_MSG(lookup_me3, magic3, 2704 "got value %#x != expected %#x", lookup_me3, magic3); 2705 2706 DPRINTF("Before resuming the child process where it left off and " 2707 "without signal to be sent\n"); 2708 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 2709 2710 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2711 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2712 2713 validate_status_exited(status, exitval); 2714 2715 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2716 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 2717 } 2718 2719 ATF_TC(read_d4); 2720 ATF_TC_HEAD(read_d4, tc) 2721 { 2722 atf_tc_set_md_var(tc, "descr", 2723 "Verify PT_READ_D called four times"); 2724 } 2725 2726 ATF_TC_BODY(read_d4, tc) 2727 { 2728 const int exitval = 5; 2729 const int sigval = SIGSTOP; 2730 pid_t child, wpid; 2731 int lookup_me1 = 0; 2732 int lookup_me2 = 0; 2733 int lookup_me3 = 0; 2734 int lookup_me4 = 0; 2735 const int magic1 = (int)random(); 2736 const int magic2 = (int)random(); 2737 const int magic3 = (int)random(); 2738 const int magic4 = (int)random(); 2739 #if defined(TWAIT_HAVE_STATUS) 2740 int status; 2741 #endif 2742 2743 DPRINTF("Before forking process PID=%d\n", getpid()); 2744 SYSCALL_REQUIRE((child = fork()) != -1); 2745 if (child == 0) { 2746 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 2747 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 2748 2749 lookup_me1 = magic1; 2750 lookup_me2 = magic2; 2751 lookup_me3 = magic3; 2752 lookup_me4 = magic4; 2753 2754 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 2755 FORKEE_ASSERT(raise(sigval) == 0); 2756 2757 DPRINTF("Before exiting of the child process\n"); 2758 _exit(exitval); 2759 } 2760 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 2761 2762 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2763 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2764 2765 validate_status_stopped(status, sigval); 2766 2767 DPRINTF("Read new lookup_me1 from tracee (PID=%d) by tracer (PID=%d)\n", 2768 child, getpid()); 2769 errno = 0; 2770 lookup_me1 = ptrace(PT_READ_D, child, &lookup_me1, 0); 2771 SYSCALL_REQUIRE_ERRNO(errno, 0); 2772 2773 ATF_REQUIRE_EQ_MSG(lookup_me1, magic1, 2774 "got value %#x != expected %#x", lookup_me1, magic1); 2775 2776 DPRINTF("Read new lookup_me2 from tracee (PID=%d) by tracer (PID=%d)\n", 2777 child, getpid()); 2778 errno = 0; 2779 lookup_me2 = ptrace(PT_READ_D, child, &lookup_me2, 0); 2780 SYSCALL_REQUIRE_ERRNO(errno, 0); 2781 2782 ATF_REQUIRE_EQ_MSG(lookup_me2, magic2, 2783 "got value %#x != expected %#x", lookup_me2, magic2); 2784 2785 DPRINTF("Read new lookup_me3 from tracee (PID=%d) by tracer (PID=%d)\n", 2786 child, getpid()); 2787 errno = 0; 2788 lookup_me3 = ptrace(PT_READ_D, child, &lookup_me3, 0); 2789 SYSCALL_REQUIRE_ERRNO(errno, 0); 2790 2791 ATF_REQUIRE_EQ_MSG(lookup_me3, magic3, 2792 "got value %#x != expected %#x", lookup_me3, magic3); 2793 2794 DPRINTF("Read new lookup_me4 from tracee (PID=%d) by tracer (PID=%d)\n", 2795 child, getpid()); 2796 errno = 0; 2797 lookup_me4 = ptrace(PT_READ_D, child, &lookup_me4, 0); 2798 SYSCALL_REQUIRE_ERRNO(errno, 0); 2799 2800 ATF_REQUIRE_EQ_MSG(lookup_me4, magic4, 2801 "got value %#x != expected %#x", lookup_me4, magic4); 2802 2803 DPRINTF("Before resuming the child process where it left off and " 2804 "without signal to be sent\n"); 2805 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 2806 2807 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2808 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2809 2810 validate_status_exited(status, exitval); 2811 2812 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2813 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 2814 } 2815 2816 ATF_TC(write_d1); 2817 ATF_TC_HEAD(write_d1, tc) 2818 { 2819 atf_tc_set_md_var(tc, "descr", 2820 "Verify PT_WRITE_D called once"); 2821 } 2822 2823 ATF_TC_BODY(write_d1, tc) 2824 { 2825 const int exitval = 5; 2826 const int sigval = SIGSTOP; 2827 pid_t child, wpid; 2828 int lookup_me = 0; 2829 const int magic = (int)random(); 2830 #if defined(TWAIT_HAVE_STATUS) 2831 int status; 2832 #endif 2833 2834 DPRINTF("Before forking process PID=%d\n", getpid()); 2835 SYSCALL_REQUIRE((child = fork()) != -1); 2836 if (child == 0) { 2837 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 2838 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 2839 2840 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 2841 FORKEE_ASSERT(raise(sigval) == 0); 2842 2843 FORKEE_ASSERT_EQ(lookup_me, magic); 2844 2845 DPRINTF("Before exiting of the child process\n"); 2846 _exit(exitval); 2847 } 2848 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 2849 2850 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2851 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2852 2853 validate_status_stopped(status, sigval); 2854 2855 DPRINTF("Write new lookup_me to tracee (PID=%d) from tracer (PID=%d)\n", 2856 child, getpid()); 2857 SYSCALL_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me, magic) != -1); 2858 2859 DPRINTF("Before resuming the child process where it left off and " 2860 "without signal to be sent\n"); 2861 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 2862 2863 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2864 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2865 2866 validate_status_exited(status, exitval); 2867 2868 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2869 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 2870 } 2871 2872 ATF_TC(write_d2); 2873 ATF_TC_HEAD(write_d2, tc) 2874 { 2875 atf_tc_set_md_var(tc, "descr", 2876 "Verify PT_WRITE_D called twice"); 2877 } 2878 2879 ATF_TC_BODY(write_d2, tc) 2880 { 2881 const int exitval = 5; 2882 const int sigval = SIGSTOP; 2883 pid_t child, wpid; 2884 int lookup_me1 = 0; 2885 int lookup_me2 = 0; 2886 const int magic1 = (int)random(); 2887 const int magic2 = (int)random(); 2888 #if defined(TWAIT_HAVE_STATUS) 2889 int status; 2890 #endif 2891 2892 DPRINTF("Before forking process PID=%d\n", getpid()); 2893 SYSCALL_REQUIRE((child = fork()) != -1); 2894 if (child == 0) { 2895 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 2896 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 2897 2898 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 2899 FORKEE_ASSERT(raise(sigval) == 0); 2900 2901 FORKEE_ASSERT_EQ(lookup_me1, magic1); 2902 FORKEE_ASSERT_EQ(lookup_me2, magic2); 2903 2904 DPRINTF("Before exiting of the child process\n"); 2905 _exit(exitval); 2906 } 2907 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 2908 2909 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2910 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2911 2912 validate_status_stopped(status, sigval); 2913 2914 DPRINTF("Write new lookup_me1 to tracee (PID=%d) from tracer (PID=%d)\n", 2915 child, getpid()); 2916 SYSCALL_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me1, magic1) != -1); 2917 2918 DPRINTF("Write new lookup_me2 to tracee (PID=%d) from tracer (PID=%d)\n", 2919 child, getpid()); 2920 SYSCALL_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me2, magic2) != -1); 2921 2922 DPRINTF("Before resuming the child process where it left off and " 2923 "without signal to be sent\n"); 2924 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 2925 2926 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2927 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2928 2929 validate_status_exited(status, exitval); 2930 2931 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2932 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 2933 } 2934 2935 ATF_TC(write_d3); 2936 ATF_TC_HEAD(write_d3, tc) 2937 { 2938 atf_tc_set_md_var(tc, "descr", 2939 "Verify PT_WRITE_D called three times"); 2940 } 2941 2942 ATF_TC_BODY(write_d3, tc) 2943 { 2944 const int exitval = 5; 2945 const int sigval = SIGSTOP; 2946 pid_t child, wpid; 2947 int lookup_me1 = 0; 2948 int lookup_me2 = 0; 2949 int lookup_me3 = 0; 2950 const int magic1 = (int)random(); 2951 const int magic2 = (int)random(); 2952 const int magic3 = (int)random(); 2953 #if defined(TWAIT_HAVE_STATUS) 2954 int status; 2955 #endif 2956 2957 DPRINTF("Before forking process PID=%d\n", getpid()); 2958 SYSCALL_REQUIRE((child = fork()) != -1); 2959 if (child == 0) { 2960 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 2961 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 2962 2963 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 2964 FORKEE_ASSERT(raise(sigval) == 0); 2965 2966 FORKEE_ASSERT_EQ(lookup_me1, magic1); 2967 FORKEE_ASSERT_EQ(lookup_me2, magic2); 2968 FORKEE_ASSERT_EQ(lookup_me3, magic3); 2969 2970 DPRINTF("Before exiting of the child process\n"); 2971 _exit(exitval); 2972 } 2973 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 2974 2975 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2976 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2977 2978 validate_status_stopped(status, sigval); 2979 2980 DPRINTF("Write new lookup_me1 to tracee (PID=%d) from tracer (PID=%d)\n", 2981 child, getpid()); 2982 SYSCALL_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me1, magic1) != -1); 2983 2984 DPRINTF("Write new lookup_me2 to tracee (PID=%d) from tracer (PID=%d)\n", 2985 child, getpid()); 2986 SYSCALL_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me2, magic2) != -1); 2987 2988 DPRINTF("Write new lookup_me3 to tracee (PID=%d) from tracer (PID=%d)\n", 2989 child, getpid()); 2990 SYSCALL_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me3, magic3) != -1); 2991 2992 DPRINTF("Before resuming the child process where it left off and " 2993 "without signal to be sent\n"); 2994 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 2995 2996 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 2997 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 2998 2999 validate_status_exited(status, exitval); 3000 3001 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3002 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 3003 } 3004 3005 ATF_TC(write_d4); 3006 ATF_TC_HEAD(write_d4, tc) 3007 { 3008 atf_tc_set_md_var(tc, "descr", 3009 "Verify PT_WRITE_D called four times"); 3010 } 3011 3012 ATF_TC_BODY(write_d4, tc) 3013 { 3014 const int exitval = 5; 3015 const int sigval = SIGSTOP; 3016 pid_t child, wpid; 3017 int lookup_me1 = 0; 3018 int lookup_me2 = 0; 3019 int lookup_me3 = 0; 3020 int lookup_me4 = 0; 3021 const int magic1 = (int)random(); 3022 const int magic2 = (int)random(); 3023 const int magic3 = (int)random(); 3024 const int magic4 = (int)random(); 3025 #if defined(TWAIT_HAVE_STATUS) 3026 int status; 3027 #endif 3028 3029 DPRINTF("Before forking process PID=%d\n", getpid()); 3030 SYSCALL_REQUIRE((child = fork()) != -1); 3031 if (child == 0) { 3032 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 3033 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 3034 3035 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 3036 FORKEE_ASSERT(raise(sigval) == 0); 3037 3038 FORKEE_ASSERT_EQ(lookup_me1, magic1); 3039 FORKEE_ASSERT_EQ(lookup_me2, magic2); 3040 FORKEE_ASSERT_EQ(lookup_me3, magic3); 3041 FORKEE_ASSERT_EQ(lookup_me4, magic4); 3042 3043 DPRINTF("Before exiting of the child process\n"); 3044 _exit(exitval); 3045 } 3046 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 3047 3048 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3049 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 3050 3051 validate_status_stopped(status, sigval); 3052 3053 DPRINTF("Write new lookup_me1 to tracee (PID=%d) from tracer (PID=%d)\n", 3054 child, getpid()); 3055 SYSCALL_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me1, magic1) != -1); 3056 3057 DPRINTF("Write new lookup_me2 to tracee (PID=%d) from tracer (PID=%d)\n", 3058 child, getpid()); 3059 SYSCALL_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me2, magic2) != -1); 3060 3061 DPRINTF("Write new lookup_me3 to tracee (PID=%d) from tracer (PID=%d)\n", 3062 child, getpid()); 3063 SYSCALL_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me3, magic3) != -1); 3064 3065 DPRINTF("Write new lookup_me4 to tracee (PID=%d) from tracer (PID=%d)\n", 3066 child, getpid()); 3067 SYSCALL_REQUIRE(ptrace(PT_WRITE_D, child, &lookup_me4, magic4) != -1); 3068 3069 DPRINTF("Before resuming the child process where it left off and " 3070 "without signal to be sent\n"); 3071 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 3072 3073 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3074 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 3075 3076 validate_status_exited(status, exitval); 3077 3078 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3079 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 3080 } 3081 3082 ATF_TC(io_read_d_write_d_handshake1); 3083 ATF_TC_HEAD(io_read_d_write_d_handshake1, tc) 3084 { 3085 atf_tc_set_md_var(tc, "descr", 3086 "Verify PT_IO with PIOD_READ_D and PIOD_WRITE_D handshake"); 3087 } 3088 3089 ATF_TC_BODY(io_read_d_write_d_handshake1, tc) 3090 { 3091 const int exitval = 5; 3092 const int sigval = SIGSTOP; 3093 pid_t child, wpid; 3094 uint8_t lookup_me_fromtracee = 0; 3095 const uint8_t magic_fromtracee = (uint8_t)random(); 3096 uint8_t lookup_me_totracee = 0; 3097 const uint8_t magic_totracee = (uint8_t)random(); 3098 struct ptrace_io_desc io_fromtracee = { 3099 .piod_op = PIOD_READ_D, 3100 .piod_offs = &lookup_me_fromtracee, 3101 .piod_addr = &lookup_me_fromtracee, 3102 .piod_len = sizeof(lookup_me_fromtracee) 3103 }; 3104 struct ptrace_io_desc io_totracee = { 3105 .piod_op = PIOD_WRITE_D, 3106 .piod_offs = &lookup_me_totracee, 3107 .piod_addr = &lookup_me_totracee, 3108 .piod_len = sizeof(lookup_me_totracee) 3109 }; 3110 #if defined(TWAIT_HAVE_STATUS) 3111 int status; 3112 #endif 3113 3114 DPRINTF("Before forking process PID=%d\n", getpid()); 3115 SYSCALL_REQUIRE((child = fork()) != -1); 3116 if (child == 0) { 3117 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 3118 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 3119 3120 lookup_me_fromtracee = magic_fromtracee; 3121 3122 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 3123 FORKEE_ASSERT(raise(sigval) == 0); 3124 3125 FORKEE_ASSERT_EQ(lookup_me_totracee, magic_totracee); 3126 3127 DPRINTF("Before exiting of the child process\n"); 3128 _exit(exitval); 3129 } 3130 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 3131 3132 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3133 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 3134 3135 validate_status_stopped(status, sigval); 3136 3137 DPRINTF("Read lookup_me_fromtracee PID=%d by tracer (PID=%d)\n", 3138 child, getpid()); 3139 SYSCALL_REQUIRE(ptrace(PT_IO, child, &io_fromtracee, 0) != -1); 3140 3141 ATF_REQUIRE_EQ_MSG(lookup_me_fromtracee, magic_fromtracee, 3142 "got value %" PRIx8 " != expected %" PRIx8, lookup_me_fromtracee, 3143 magic_fromtracee); 3144 3145 lookup_me_totracee = magic_totracee; 3146 3147 DPRINTF("Write lookup_me_totracee to PID=%d by tracer (PID=%d)\n", 3148 child, getpid()); 3149 SYSCALL_REQUIRE(ptrace(PT_IO, child, &io_totracee, 0) != -1); 3150 3151 ATF_REQUIRE_EQ_MSG(lookup_me_totracee, magic_totracee, 3152 "got value %" PRIx8 " != expected %" PRIx8, lookup_me_totracee, 3153 magic_totracee); 3154 3155 DPRINTF("Before resuming the child process where it left off and " 3156 "without signal to be sent\n"); 3157 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 3158 3159 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3160 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 3161 3162 validate_status_exited(status, exitval); 3163 3164 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3165 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 3166 } 3167 3168 ATF_TC(io_read_d_write_d_handshake2); 3169 ATF_TC_HEAD(io_read_d_write_d_handshake2, tc) 3170 { 3171 atf_tc_set_md_var(tc, "descr", 3172 "Verify PT_IO with PIOD_WRITE_D and PIOD_READ_D handshake"); 3173 } 3174 3175 ATF_TC_BODY(io_read_d_write_d_handshake2, tc) 3176 { 3177 const int exitval = 5; 3178 const int sigval = SIGSTOP; 3179 pid_t child, wpid; 3180 uint8_t lookup_me_fromtracee = 0; 3181 const uint8_t magic_fromtracee = (uint8_t)random(); 3182 uint8_t lookup_me_totracee = 0; 3183 const uint8_t magic_totracee = (uint8_t)random(); 3184 struct ptrace_io_desc io_fromtracee = { 3185 .piod_op = PIOD_READ_D, 3186 .piod_offs = &lookup_me_fromtracee, 3187 .piod_addr = &lookup_me_fromtracee, 3188 .piod_len = sizeof(lookup_me_fromtracee) 3189 }; 3190 struct ptrace_io_desc io_totracee = { 3191 .piod_op = PIOD_WRITE_D, 3192 .piod_offs = &lookup_me_totracee, 3193 .piod_addr = &lookup_me_totracee, 3194 .piod_len = sizeof(lookup_me_totracee) 3195 }; 3196 #if defined(TWAIT_HAVE_STATUS) 3197 int status; 3198 #endif 3199 3200 DPRINTF("Before forking process PID=%d\n", getpid()); 3201 SYSCALL_REQUIRE((child = fork()) != -1); 3202 if (child == 0) { 3203 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 3204 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 3205 3206 lookup_me_fromtracee = magic_fromtracee; 3207 3208 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 3209 FORKEE_ASSERT(raise(sigval) == 0); 3210 3211 FORKEE_ASSERT_EQ(lookup_me_totracee, magic_totracee); 3212 3213 DPRINTF("Before exiting of the child process\n"); 3214 _exit(exitval); 3215 } 3216 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 3217 3218 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3219 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 3220 3221 validate_status_stopped(status, sigval); 3222 3223 lookup_me_totracee = magic_totracee; 3224 3225 DPRINTF("Write lookup_me_totracee to PID=%d by tracer (PID=%d)\n", 3226 child, getpid()); 3227 SYSCALL_REQUIRE(ptrace(PT_IO, child, &io_totracee, 0) != -1); 3228 3229 ATF_REQUIRE_EQ_MSG(lookup_me_totracee, magic_totracee, 3230 "got value %" PRIx8 " != expected %" PRIx8, lookup_me_totracee, 3231 magic_totracee); 3232 3233 DPRINTF("Read lookup_me_fromtracee PID=%d by tracer (PID=%d)\n", 3234 child, getpid()); 3235 SYSCALL_REQUIRE(ptrace(PT_IO, child, &io_fromtracee, 0) != -1); 3236 3237 ATF_REQUIRE_EQ_MSG(lookup_me_fromtracee, magic_fromtracee, 3238 "got value %" PRIx8 " != expected %" PRIx8, lookup_me_fromtracee, 3239 magic_fromtracee); 3240 3241 DPRINTF("Before resuming the child process where it left off and " 3242 "without signal to be sent\n"); 3243 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 3244 3245 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3246 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 3247 3248 validate_status_exited(status, exitval); 3249 3250 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3251 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 3252 } 3253 3254 ATF_TC(read_d_write_d_handshake1); 3255 ATF_TC_HEAD(read_d_write_d_handshake1, tc) 3256 { 3257 atf_tc_set_md_var(tc, "descr", 3258 "Verify PT_READ_D with PT_WRITE_D handshake"); 3259 } 3260 3261 ATF_TC_BODY(read_d_write_d_handshake1, tc) 3262 { 3263 const int exitval = 5; 3264 const int sigval = SIGSTOP; 3265 pid_t child, wpid; 3266 int lookup_me_fromtracee = 0; 3267 const int magic_fromtracee = (int)random(); 3268 int lookup_me_totracee = 0; 3269 const int magic_totracee = (int)random(); 3270 #if defined(TWAIT_HAVE_STATUS) 3271 int status; 3272 #endif 3273 3274 DPRINTF("Before forking process PID=%d\n", getpid()); 3275 SYSCALL_REQUIRE((child = fork()) != -1); 3276 if (child == 0) { 3277 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 3278 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 3279 3280 lookup_me_fromtracee = magic_fromtracee; 3281 3282 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 3283 FORKEE_ASSERT(raise(sigval) == 0); 3284 3285 FORKEE_ASSERT_EQ(lookup_me_totracee, magic_totracee); 3286 3287 DPRINTF("Before exiting of the child process\n"); 3288 _exit(exitval); 3289 } 3290 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 3291 3292 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3293 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 3294 3295 validate_status_stopped(status, sigval); 3296 3297 DPRINTF("Read new lookup_me_fromtracee PID=%d by tracer (PID=%d)\n", 3298 child, getpid()); 3299 errno = 0; 3300 lookup_me_fromtracee = 3301 ptrace(PT_READ_D, child, &lookup_me_fromtracee, 0); 3302 SYSCALL_REQUIRE_ERRNO(errno, 0); 3303 3304 ATF_REQUIRE_EQ_MSG(lookup_me_fromtracee, magic_fromtracee, 3305 "got value %#x != expected %#x", lookup_me_fromtracee, 3306 magic_fromtracee); 3307 3308 DPRINTF("Write new lookup_me_totracee to PID=%d from tracer (PID=%d)\n", 3309 child, getpid()); 3310 ATF_REQUIRE 3311 (ptrace(PT_WRITE_D, child, &lookup_me_totracee, magic_totracee) 3312 != -1); 3313 3314 DPRINTF("Before resuming the child process where it left off and " 3315 "without signal to be sent\n"); 3316 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 3317 3318 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3319 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 3320 3321 validate_status_exited(status, exitval); 3322 3323 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3324 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 3325 } 3326 3327 ATF_TC(read_d_write_d_handshake2); 3328 ATF_TC_HEAD(read_d_write_d_handshake2, tc) 3329 { 3330 atf_tc_set_md_var(tc, "descr", 3331 "Verify PT_WRITE_D with PT_READ_D handshake"); 3332 } 3333 3334 ATF_TC_BODY(read_d_write_d_handshake2, tc) 3335 { 3336 const int exitval = 5; 3337 const int sigval = SIGSTOP; 3338 pid_t child, wpid; 3339 int lookup_me_fromtracee = 0; 3340 const int magic_fromtracee = (int)random(); 3341 int lookup_me_totracee = 0; 3342 const int magic_totracee = (int)random(); 3343 #if defined(TWAIT_HAVE_STATUS) 3344 int status; 3345 #endif 3346 3347 DPRINTF("Before forking process PID=%d\n", getpid()); 3348 SYSCALL_REQUIRE((child = fork()) != -1); 3349 if (child == 0) { 3350 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 3351 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 3352 3353 lookup_me_fromtracee = magic_fromtracee; 3354 3355 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 3356 FORKEE_ASSERT(raise(sigval) == 0); 3357 3358 FORKEE_ASSERT_EQ(lookup_me_totracee, magic_totracee); 3359 3360 DPRINTF("Before exiting of the child process\n"); 3361 _exit(exitval); 3362 } 3363 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 3364 3365 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3366 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 3367 3368 validate_status_stopped(status, sigval); 3369 3370 DPRINTF("Write new lookup_me_totracee to PID=%d from tracer (PID=%d)\n", 3371 child, getpid()); 3372 ATF_REQUIRE 3373 (ptrace(PT_WRITE_D, child, &lookup_me_totracee, magic_totracee) 3374 != -1); 3375 3376 DPRINTF("Read new lookup_me_fromtracee PID=%d by tracer (PID=%d)\n", 3377 child, getpid()); 3378 errno = 0; 3379 lookup_me_fromtracee = 3380 ptrace(PT_READ_D, child, &lookup_me_fromtracee, 0); 3381 SYSCALL_REQUIRE_ERRNO(errno, 0); 3382 3383 ATF_REQUIRE_EQ_MSG(lookup_me_fromtracee, magic_fromtracee, 3384 "got value %#x != expected %#x", lookup_me_fromtracee, 3385 magic_fromtracee); 3386 3387 DPRINTF("Before resuming the child process where it left off and " 3388 "without signal to be sent\n"); 3389 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 3390 3391 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3392 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 3393 3394 validate_status_exited(status, exitval); 3395 3396 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3397 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 3398 } 3399 3400 /* These dummy functions are used to be copied with ptrace(2) calls */ 3401 static int __used 3402 dummy_fn1(int a, int b, int c, int d) 3403 { 3404 3405 a *= 1; 3406 b += 2; 3407 c -= 3; 3408 d /= 4; 3409 3410 return a + b * c - d; 3411 } 3412 3413 static int __used 3414 dummy_fn2(int a, int b, int c, int d) 3415 { 3416 3417 a *= 4; 3418 b += 3; 3419 c -= 2; 3420 d /= 1; 3421 3422 return a + b * c - d; 3423 } 3424 3425 static int __used 3426 dummy_fn3(int a, int b, int c, int d) 3427 { 3428 3429 a *= 10; 3430 b += 20; 3431 c -= 30; 3432 d /= 40; 3433 3434 return a + b * c - d; 3435 } 3436 3437 static int __used 3438 dummy_fn4(int a, int b, int c, int d) 3439 { 3440 3441 a *= 40; 3442 b += 30; 3443 c -= 20; 3444 d /= 10; 3445 3446 return a + b * c - d; 3447 } 3448 3449 ATF_TC(io_read_i1); 3450 ATF_TC_HEAD(io_read_i1, tc) 3451 { 3452 atf_tc_set_md_var(tc, "descr", 3453 "Verify PT_IO with PIOD_READ_I and len = sizeof(uint8_t)"); 3454 } 3455 3456 ATF_TC_BODY(io_read_i1, tc) 3457 { 3458 const int exitval = 5; 3459 const int sigval = SIGSTOP; 3460 pid_t child, wpid; 3461 uint8_t lookup_me = 0; 3462 uint8_t magic; 3463 memcpy(&magic, dummy_fn1, sizeof(magic)); 3464 struct ptrace_io_desc io = { 3465 .piod_op = PIOD_READ_I, 3466 .piod_offs = dummy_fn1, 3467 .piod_addr = &lookup_me, 3468 .piod_len = sizeof(lookup_me) 3469 }; 3470 #if defined(TWAIT_HAVE_STATUS) 3471 int status; 3472 #endif 3473 3474 DPRINTF("Before forking process PID=%d\n", getpid()); 3475 SYSCALL_REQUIRE((child = fork()) != -1); 3476 if (child == 0) { 3477 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 3478 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 3479 3480 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 3481 FORKEE_ASSERT(raise(sigval) == 0); 3482 3483 DPRINTF("Before exiting of the child process\n"); 3484 _exit(exitval); 3485 } 3486 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 3487 3488 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3489 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 3490 3491 validate_status_stopped(status, sigval); 3492 3493 DPRINTF("Read lookup_me from tracee (PID=%d) by tracer (PID=%d)\n", 3494 child, getpid()); 3495 SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1); 3496 3497 ATF_REQUIRE_EQ_MSG(lookup_me, magic, 3498 "got value %" PRIx8 " != expected %" PRIx8, lookup_me, magic); 3499 3500 DPRINTF("Before resuming the child process where it left off and " 3501 "without signal to be sent\n"); 3502 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 3503 3504 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3505 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 3506 3507 validate_status_exited(status, exitval); 3508 3509 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3510 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 3511 } 3512 3513 ATF_TC(io_read_i2); 3514 ATF_TC_HEAD(io_read_i2, tc) 3515 { 3516 atf_tc_set_md_var(tc, "descr", 3517 "Verify PT_IO with PIOD_READ_I and len = sizeof(uint16_t)"); 3518 } 3519 3520 ATF_TC_BODY(io_read_i2, tc) 3521 { 3522 const int exitval = 5; 3523 const int sigval = SIGSTOP; 3524 pid_t child, wpid; 3525 uint16_t lookup_me = 0; 3526 uint16_t magic; 3527 memcpy(&magic, dummy_fn1, sizeof(magic)); 3528 struct ptrace_io_desc io = { 3529 .piod_op = PIOD_READ_I, 3530 .piod_offs = dummy_fn1, 3531 .piod_addr = &lookup_me, 3532 .piod_len = sizeof(lookup_me) 3533 }; 3534 #if defined(TWAIT_HAVE_STATUS) 3535 int status; 3536 #endif 3537 3538 DPRINTF("Before forking process PID=%d\n", getpid()); 3539 SYSCALL_REQUIRE((child = fork()) != -1); 3540 if (child == 0) { 3541 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 3542 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 3543 3544 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 3545 FORKEE_ASSERT(raise(sigval) == 0); 3546 3547 DPRINTF("Before exiting of the child process\n"); 3548 _exit(exitval); 3549 } 3550 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 3551 3552 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3553 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 3554 3555 validate_status_stopped(status, sigval); 3556 3557 DPRINTF("Read lookup_me from tracee (PID=%d) by tracer (PID=%d)\n", 3558 child, getpid()); 3559 SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1); 3560 3561 ATF_REQUIRE_EQ_MSG(lookup_me, magic, 3562 "got value %" PRIx16 " != expected %" PRIx16, lookup_me, magic); 3563 3564 DPRINTF("Before resuming the child process where it left off and " 3565 "without signal to be sent\n"); 3566 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 3567 3568 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3569 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 3570 3571 validate_status_exited(status, exitval); 3572 3573 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3574 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 3575 } 3576 3577 ATF_TC(io_read_i3); 3578 ATF_TC_HEAD(io_read_i3, tc) 3579 { 3580 atf_tc_set_md_var(tc, "descr", 3581 "Verify PT_IO with PIOD_READ_I and len = sizeof(uint32_t)"); 3582 } 3583 3584 ATF_TC_BODY(io_read_i3, tc) 3585 { 3586 const int exitval = 5; 3587 const int sigval = SIGSTOP; 3588 pid_t child, wpid; 3589 uint32_t lookup_me = 0; 3590 uint32_t magic; 3591 memcpy(&magic, dummy_fn1, sizeof(magic)); 3592 struct ptrace_io_desc io = { 3593 .piod_op = PIOD_READ_I, 3594 .piod_offs = dummy_fn1, 3595 .piod_addr = &lookup_me, 3596 .piod_len = sizeof(lookup_me) 3597 }; 3598 #if defined(TWAIT_HAVE_STATUS) 3599 int status; 3600 #endif 3601 3602 DPRINTF("Before forking process PID=%d\n", getpid()); 3603 SYSCALL_REQUIRE((child = fork()) != -1); 3604 if (child == 0) { 3605 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 3606 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 3607 3608 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 3609 FORKEE_ASSERT(raise(sigval) == 0); 3610 3611 DPRINTF("Before exiting of the child process\n"); 3612 _exit(exitval); 3613 } 3614 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 3615 3616 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3617 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 3618 3619 validate_status_stopped(status, sigval); 3620 3621 DPRINTF("Read lookup_me from tracee (PID=%d) by tracer (PID=%d)\n", 3622 child, getpid()); 3623 SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1); 3624 3625 ATF_REQUIRE_EQ_MSG(lookup_me, magic, 3626 "got value %" PRIx32 " != expected %" PRIx32, lookup_me, magic); 3627 3628 DPRINTF("Before resuming the child process where it left off and " 3629 "without signal to be sent\n"); 3630 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 3631 3632 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3633 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 3634 3635 validate_status_exited(status, exitval); 3636 3637 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3638 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 3639 } 3640 3641 ATF_TC(io_read_i4); 3642 ATF_TC_HEAD(io_read_i4, tc) 3643 { 3644 atf_tc_set_md_var(tc, "descr", 3645 "Verify PT_IO with PIOD_READ_I and len = sizeof(uint64_t)"); 3646 } 3647 3648 ATF_TC_BODY(io_read_i4, tc) 3649 { 3650 const int exitval = 5; 3651 const int sigval = SIGSTOP; 3652 pid_t child, wpid; 3653 uint64_t lookup_me = 0; 3654 uint64_t magic; 3655 memcpy(&magic, dummy_fn1, sizeof(magic)); 3656 struct ptrace_io_desc io = { 3657 .piod_op = PIOD_READ_I, 3658 .piod_offs = dummy_fn1, 3659 .piod_addr = &lookup_me, 3660 .piod_len = sizeof(lookup_me) 3661 }; 3662 #if defined(TWAIT_HAVE_STATUS) 3663 int status; 3664 #endif 3665 3666 DPRINTF("Before forking process PID=%d\n", getpid()); 3667 SYSCALL_REQUIRE((child = fork()) != -1); 3668 if (child == 0) { 3669 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 3670 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 3671 3672 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 3673 FORKEE_ASSERT(raise(sigval) == 0); 3674 3675 DPRINTF("Before exiting of the child process\n"); 3676 _exit(exitval); 3677 } 3678 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 3679 3680 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3681 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 3682 3683 validate_status_stopped(status, sigval); 3684 3685 DPRINTF("Read lookup_me from tracee (PID=%d) by tracer (PID=%d)\n", 3686 child, getpid()); 3687 SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1); 3688 3689 ATF_REQUIRE_EQ_MSG(lookup_me, magic, 3690 "got value %" PRIx64 " != expected %" PRIx64, lookup_me, magic); 3691 3692 DPRINTF("Before resuming the child process where it left off and " 3693 "without signal to be sent\n"); 3694 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 3695 3696 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3697 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 3698 3699 validate_status_exited(status, exitval); 3700 3701 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3702 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 3703 } 3704 3705 ATF_TC(read_i1); 3706 ATF_TC_HEAD(read_i1, tc) 3707 { 3708 atf_tc_set_md_var(tc, "descr", 3709 "Verify PT_READ_I called once"); 3710 } 3711 3712 ATF_TC_BODY(read_i1, tc) 3713 { 3714 const int exitval = 5; 3715 const int sigval = SIGSTOP; 3716 pid_t child, wpid; 3717 int lookup_me = 0; 3718 int magic; 3719 memcpy(&magic, dummy_fn1, sizeof(magic)); 3720 #if defined(TWAIT_HAVE_STATUS) 3721 int status; 3722 #endif 3723 3724 DPRINTF("Before forking process PID=%d\n", getpid()); 3725 SYSCALL_REQUIRE((child = fork()) != -1); 3726 if (child == 0) { 3727 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 3728 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 3729 3730 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 3731 FORKEE_ASSERT(raise(sigval) == 0); 3732 3733 DPRINTF("Before exiting of the child process\n"); 3734 _exit(exitval); 3735 } 3736 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 3737 3738 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3739 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 3740 3741 validate_status_stopped(status, sigval); 3742 3743 DPRINTF("Read new lookup_me from tracee (PID=%d) by tracer (PID=%d)\n", 3744 child, getpid()); 3745 errno = 0; 3746 lookup_me = ptrace(PT_READ_I, child, dummy_fn1, 0); 3747 SYSCALL_REQUIRE_ERRNO(errno, 0); 3748 3749 ATF_REQUIRE_EQ_MSG(lookup_me, magic, 3750 "got value %#x != expected %#x", lookup_me, magic); 3751 3752 DPRINTF("Before resuming the child process where it left off and " 3753 "without signal to be sent\n"); 3754 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 3755 3756 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3757 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 3758 3759 validate_status_exited(status, exitval); 3760 3761 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3762 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 3763 } 3764 3765 ATF_TC(read_i2); 3766 ATF_TC_HEAD(read_i2, tc) 3767 { 3768 atf_tc_set_md_var(tc, "descr", 3769 "Verify PT_READ_I called twice"); 3770 } 3771 3772 ATF_TC_BODY(read_i2, tc) 3773 { 3774 const int exitval = 5; 3775 const int sigval = SIGSTOP; 3776 pid_t child, wpid; 3777 int lookup_me1 = 0; 3778 int lookup_me2 = 0; 3779 int magic1; 3780 int magic2; 3781 memcpy(&magic1, dummy_fn1, sizeof(magic1)); 3782 memcpy(&magic2, dummy_fn2, sizeof(magic2)); 3783 #if defined(TWAIT_HAVE_STATUS) 3784 int status; 3785 #endif 3786 3787 DPRINTF("Before forking process PID=%d\n", getpid()); 3788 SYSCALL_REQUIRE((child = fork()) != -1); 3789 if (child == 0) { 3790 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 3791 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 3792 3793 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 3794 FORKEE_ASSERT(raise(sigval) == 0); 3795 3796 DPRINTF("Before exiting of the child process\n"); 3797 _exit(exitval); 3798 } 3799 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 3800 3801 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3802 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 3803 3804 validate_status_stopped(status, sigval); 3805 3806 DPRINTF("Read new lookup_me1 from tracee (PID=%d) by tracer (PID=%d)\n", 3807 child, getpid()); 3808 errno = 0; 3809 lookup_me1 = ptrace(PT_READ_I, child, dummy_fn1, 0); 3810 SYSCALL_REQUIRE_ERRNO(errno, 0); 3811 3812 ATF_REQUIRE_EQ_MSG(lookup_me1, magic1, 3813 "got value %#x != expected %#x", lookup_me1, magic1); 3814 3815 DPRINTF("Read new lookup_me2 from tracee (PID=%d) by tracer (PID=%d)\n", 3816 child, getpid()); 3817 errno = 0; 3818 lookup_me2 = ptrace(PT_READ_I, child, dummy_fn2, 0); 3819 SYSCALL_REQUIRE_ERRNO(errno, 0); 3820 3821 ATF_REQUIRE_EQ_MSG(lookup_me2, magic2, 3822 "got value %#x != expected %#x", lookup_me2, magic2); 3823 3824 DPRINTF("Before resuming the child process where it left off and " 3825 "without signal to be sent\n"); 3826 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 3827 3828 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3829 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 3830 3831 validate_status_exited(status, exitval); 3832 3833 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3834 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 3835 } 3836 3837 ATF_TC(read_i3); 3838 ATF_TC_HEAD(read_i3, tc) 3839 { 3840 atf_tc_set_md_var(tc, "descr", 3841 "Verify PT_READ_I called three times"); 3842 } 3843 3844 ATF_TC_BODY(read_i3, tc) 3845 { 3846 const int exitval = 5; 3847 const int sigval = SIGSTOP; 3848 pid_t child, wpid; 3849 int lookup_me1 = 0; 3850 int lookup_me2 = 0; 3851 int lookup_me3 = 0; 3852 int magic1; 3853 int magic2; 3854 int magic3; 3855 memcpy(&magic1, dummy_fn1, sizeof(magic1)); 3856 memcpy(&magic2, dummy_fn2, sizeof(magic2)); 3857 memcpy(&magic3, dummy_fn3, sizeof(magic3)); 3858 #if defined(TWAIT_HAVE_STATUS) 3859 int status; 3860 #endif 3861 3862 DPRINTF("Before forking process PID=%d\n", getpid()); 3863 SYSCALL_REQUIRE((child = fork()) != -1); 3864 if (child == 0) { 3865 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 3866 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 3867 3868 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 3869 FORKEE_ASSERT(raise(sigval) == 0); 3870 3871 DPRINTF("Before exiting of the child process\n"); 3872 _exit(exitval); 3873 } 3874 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 3875 3876 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3877 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 3878 3879 validate_status_stopped(status, sigval); 3880 3881 DPRINTF("Read new lookup_me1 from tracee (PID=%d) by tracer (PID=%d)\n", 3882 child, getpid()); 3883 errno = 0; 3884 lookup_me1 = ptrace(PT_READ_I, child, dummy_fn1, 0); 3885 SYSCALL_REQUIRE_ERRNO(errno, 0); 3886 3887 ATF_REQUIRE_EQ_MSG(lookup_me1, magic1, 3888 "got value %#x != expected %#x", lookup_me1, magic1); 3889 3890 DPRINTF("Read new lookup_me2 from tracee (PID=%d) by tracer (PID=%d)\n", 3891 child, getpid()); 3892 errno = 0; 3893 lookup_me2 = ptrace(PT_READ_I, child, dummy_fn2, 0); 3894 SYSCALL_REQUIRE_ERRNO(errno, 0); 3895 3896 ATF_REQUIRE_EQ_MSG(lookup_me2, magic2, 3897 "got value %#x != expected %#x", lookup_me2, magic2); 3898 3899 DPRINTF("Read new lookup_me3 from tracee (PID=%d) by tracer (PID=%d)\n", 3900 child, getpid()); 3901 errno = 0; 3902 lookup_me3 = ptrace(PT_READ_I, child, dummy_fn3, 0); 3903 SYSCALL_REQUIRE_ERRNO(errno, 0); 3904 3905 ATF_REQUIRE_EQ_MSG(lookup_me3, magic3, 3906 "got value %#x != expected %#x", lookup_me3, magic3); 3907 3908 DPRINTF("Before resuming the child process where it left off and " 3909 "without signal to be sent\n"); 3910 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 3911 3912 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3913 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 3914 3915 validate_status_exited(status, exitval); 3916 3917 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3918 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 3919 } 3920 3921 ATF_TC(read_i4); 3922 ATF_TC_HEAD(read_i4, tc) 3923 { 3924 atf_tc_set_md_var(tc, "descr", 3925 "Verify PT_READ_I called four times"); 3926 } 3927 3928 ATF_TC_BODY(read_i4, tc) 3929 { 3930 const int exitval = 5; 3931 const int sigval = SIGSTOP; 3932 pid_t child, wpid; 3933 int lookup_me1 = 0; 3934 int lookup_me2 = 0; 3935 int lookup_me3 = 0; 3936 int lookup_me4 = 0; 3937 int magic1; 3938 int magic2; 3939 int magic3; 3940 int magic4; 3941 memcpy(&magic1, dummy_fn1, sizeof(magic1)); 3942 memcpy(&magic2, dummy_fn2, sizeof(magic2)); 3943 memcpy(&magic3, dummy_fn3, sizeof(magic3)); 3944 memcpy(&magic4, dummy_fn4, sizeof(magic4)); 3945 #if defined(TWAIT_HAVE_STATUS) 3946 int status; 3947 #endif 3948 3949 DPRINTF("Before forking process PID=%d\n", getpid()); 3950 SYSCALL_REQUIRE((child = fork()) != -1); 3951 if (child == 0) { 3952 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 3953 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 3954 3955 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 3956 FORKEE_ASSERT(raise(sigval) == 0); 3957 3958 DPRINTF("Before exiting of the child process\n"); 3959 _exit(exitval); 3960 } 3961 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 3962 3963 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 3964 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 3965 3966 validate_status_stopped(status, sigval); 3967 3968 DPRINTF("Read new lookup_me1 from tracee (PID=%d) by tracer (PID=%d)\n", 3969 child, getpid()); 3970 errno = 0; 3971 lookup_me1 = ptrace(PT_READ_I, child, dummy_fn1, 0); 3972 SYSCALL_REQUIRE_ERRNO(errno, 0); 3973 3974 ATF_REQUIRE_EQ_MSG(lookup_me1, magic1, 3975 "got value %#x != expected %#x", lookup_me1, magic1); 3976 3977 DPRINTF("Read new lookup_me2 from tracee (PID=%d) by tracer (PID=%d)\n", 3978 child, getpid()); 3979 errno = 0; 3980 lookup_me2 = ptrace(PT_READ_I, child, dummy_fn2, 0); 3981 SYSCALL_REQUIRE_ERRNO(errno, 0); 3982 3983 ATF_REQUIRE_EQ_MSG(lookup_me2, magic2, 3984 "got value %#x != expected %#x", lookup_me2, magic2); 3985 3986 DPRINTF("Read new lookup_me3 from tracee (PID=%d) by tracer (PID=%d)\n", 3987 child, getpid()); 3988 errno = 0; 3989 lookup_me3 = ptrace(PT_READ_I, child, dummy_fn3, 0); 3990 SYSCALL_REQUIRE_ERRNO(errno, 0); 3991 3992 ATF_REQUIRE_EQ_MSG(lookup_me3, magic3, 3993 "got value %#x != expected %#x", lookup_me3, magic3); 3994 3995 DPRINTF("Read new lookup_me4 from tracee (PID=%d) by tracer (PID=%d)\n", 3996 child, getpid()); 3997 errno = 0; 3998 lookup_me4 = ptrace(PT_READ_I, child, dummy_fn4, 0); 3999 SYSCALL_REQUIRE_ERRNO(errno, 0); 4000 4001 ATF_REQUIRE_EQ_MSG(lookup_me4, magic4, 4002 "got value %#x != expected %#x", lookup_me4, magic4); 4003 4004 DPRINTF("Before resuming the child process where it left off and " 4005 "without signal to be sent\n"); 4006 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 4007 4008 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4009 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 4010 4011 validate_status_exited(status, exitval); 4012 4013 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4014 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 4015 } 4016 4017 #if defined(HAVE_GPREGS) 4018 ATF_TC(regs1); 4019 ATF_TC_HEAD(regs1, tc) 4020 { 4021 atf_tc_set_md_var(tc, "descr", 4022 "Verify plain PT_GETREGS call without further steps"); 4023 } 4024 4025 ATF_TC_BODY(regs1, tc) 4026 { 4027 const int exitval = 5; 4028 const int sigval = SIGSTOP; 4029 pid_t child, wpid; 4030 #if defined(TWAIT_HAVE_STATUS) 4031 int status; 4032 #endif 4033 struct reg r; 4034 4035 DPRINTF("Before forking process PID=%d\n", getpid()); 4036 SYSCALL_REQUIRE((child = fork()) != -1); 4037 if (child == 0) { 4038 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 4039 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 4040 4041 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 4042 FORKEE_ASSERT(raise(sigval) == 0); 4043 4044 DPRINTF("Before exiting of the child process\n"); 4045 _exit(exitval); 4046 } 4047 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 4048 4049 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4050 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 4051 4052 validate_status_stopped(status, sigval); 4053 4054 DPRINTF("Call GETREGS for the child process\n"); 4055 SYSCALL_REQUIRE(ptrace(PT_GETREGS, child, &r, 0) != -1); 4056 4057 DPRINTF("Before resuming the child process where it left off and " 4058 "without signal to be sent\n"); 4059 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 4060 4061 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4062 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 4063 4064 validate_status_exited(status, exitval); 4065 4066 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4067 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 4068 } 4069 #endif 4070 4071 #if defined(HAVE_GPREGS) 4072 ATF_TC(regs2); 4073 ATF_TC_HEAD(regs2, tc) 4074 { 4075 atf_tc_set_md_var(tc, "descr", 4076 "Verify plain PT_GETREGS call and retrieve PC"); 4077 } 4078 4079 ATF_TC_BODY(regs2, tc) 4080 { 4081 const int exitval = 5; 4082 const int sigval = SIGSTOP; 4083 pid_t child, wpid; 4084 #if defined(TWAIT_HAVE_STATUS) 4085 int status; 4086 #endif 4087 struct reg r; 4088 4089 DPRINTF("Before forking process PID=%d\n", getpid()); 4090 SYSCALL_REQUIRE((child = fork()) != -1); 4091 if (child == 0) { 4092 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 4093 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 4094 4095 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 4096 FORKEE_ASSERT(raise(sigval) == 0); 4097 4098 DPRINTF("Before exiting of the child process\n"); 4099 _exit(exitval); 4100 } 4101 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 4102 4103 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4104 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 4105 4106 validate_status_stopped(status, sigval); 4107 4108 DPRINTF("Call GETREGS for the child process\n"); 4109 SYSCALL_REQUIRE(ptrace(PT_GETREGS, child, &r, 0) != -1); 4110 4111 DPRINTF("Retrieved PC=%" PRIxREGISTER "\n", PTRACE_REG_PC(&r)); 4112 4113 DPRINTF("Before resuming the child process where it left off and " 4114 "without signal to be sent\n"); 4115 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 4116 4117 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4118 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 4119 4120 validate_status_exited(status, exitval); 4121 4122 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4123 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 4124 } 4125 #endif 4126 4127 #if defined(HAVE_GPREGS) 4128 ATF_TC(regs3); 4129 ATF_TC_HEAD(regs3, tc) 4130 { 4131 atf_tc_set_md_var(tc, "descr", 4132 "Verify plain PT_GETREGS call and retrieve SP"); 4133 } 4134 4135 ATF_TC_BODY(regs3, tc) 4136 { 4137 const int exitval = 5; 4138 const int sigval = SIGSTOP; 4139 pid_t child, wpid; 4140 #if defined(TWAIT_HAVE_STATUS) 4141 int status; 4142 #endif 4143 struct reg r; 4144 4145 DPRINTF("Before forking process PID=%d\n", getpid()); 4146 SYSCALL_REQUIRE((child = fork()) != -1); 4147 if (child == 0) { 4148 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 4149 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 4150 4151 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 4152 FORKEE_ASSERT(raise(sigval) == 0); 4153 4154 DPRINTF("Before exiting of the child process\n"); 4155 _exit(exitval); 4156 } 4157 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 4158 4159 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4160 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 4161 4162 validate_status_stopped(status, sigval); 4163 4164 DPRINTF("Call GETREGS for the child process\n"); 4165 SYSCALL_REQUIRE(ptrace(PT_GETREGS, child, &r, 0) != -1); 4166 4167 DPRINTF("Retrieved SP=%" PRIxREGISTER "\n", PTRACE_REG_SP(&r)); 4168 4169 DPRINTF("Before resuming the child process where it left off and " 4170 "without signal to be sent\n"); 4171 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 4172 4173 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4174 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 4175 4176 validate_status_exited(status, exitval); 4177 4178 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4179 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 4180 } 4181 #endif 4182 4183 #if defined(HAVE_GPREGS) 4184 ATF_TC(regs4); 4185 ATF_TC_HEAD(regs4, tc) 4186 { 4187 atf_tc_set_md_var(tc, "descr", 4188 "Verify plain PT_GETREGS call and retrieve INTRV"); 4189 } 4190 4191 ATF_TC_BODY(regs4, tc) 4192 { 4193 const int exitval = 5; 4194 const int sigval = SIGSTOP; 4195 pid_t child, wpid; 4196 #if defined(TWAIT_HAVE_STATUS) 4197 int status; 4198 #endif 4199 struct reg r; 4200 4201 DPRINTF("Before forking process PID=%d\n", getpid()); 4202 SYSCALL_REQUIRE((child = fork()) != -1); 4203 if (child == 0) { 4204 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 4205 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 4206 4207 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 4208 FORKEE_ASSERT(raise(sigval) == 0); 4209 4210 DPRINTF("Before exiting of the child process\n"); 4211 _exit(exitval); 4212 } 4213 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 4214 4215 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4216 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 4217 4218 validate_status_stopped(status, sigval); 4219 4220 DPRINTF("Call GETREGS for the child process\n"); 4221 SYSCALL_REQUIRE(ptrace(PT_GETREGS, child, &r, 0) != -1); 4222 4223 DPRINTF("Retrieved INTRV=%" PRIxREGISTER "\n", PTRACE_REG_INTRV(&r)); 4224 4225 DPRINTF("Before resuming the child process where it left off and " 4226 "without signal to be sent\n"); 4227 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 4228 4229 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4230 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 4231 4232 validate_status_exited(status, exitval); 4233 4234 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4235 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 4236 } 4237 #endif 4238 4239 #if defined(HAVE_GPREGS) 4240 ATF_TC(regs5); 4241 ATF_TC_HEAD(regs5, tc) 4242 { 4243 atf_tc_set_md_var(tc, "descr", 4244 "Verify PT_GETREGS and PT_SETREGS calls without changing regs"); 4245 } 4246 4247 ATF_TC_BODY(regs5, tc) 4248 { 4249 const int exitval = 5; 4250 const int sigval = SIGSTOP; 4251 pid_t child, wpid; 4252 #if defined(TWAIT_HAVE_STATUS) 4253 int status; 4254 #endif 4255 struct reg r; 4256 4257 DPRINTF("Before forking process PID=%d\n", getpid()); 4258 SYSCALL_REQUIRE((child = fork()) != -1); 4259 if (child == 0) { 4260 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 4261 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 4262 4263 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 4264 FORKEE_ASSERT(raise(sigval) == 0); 4265 4266 DPRINTF("Before exiting of the child process\n"); 4267 _exit(exitval); 4268 } 4269 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 4270 4271 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4272 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 4273 4274 validate_status_stopped(status, sigval); 4275 4276 DPRINTF("Call GETREGS for the child process\n"); 4277 SYSCALL_REQUIRE(ptrace(PT_GETREGS, child, &r, 0) != -1); 4278 4279 DPRINTF("Call SETREGS for the child process (without changed regs)\n"); 4280 SYSCALL_REQUIRE(ptrace(PT_GETREGS, child, &r, 0) != -1); 4281 4282 DPRINTF("Before resuming the child process where it left off and " 4283 "without signal to be sent\n"); 4284 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 4285 4286 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4287 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 4288 4289 validate_status_exited(status, exitval); 4290 4291 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4292 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 4293 } 4294 #endif 4295 4296 #if defined(HAVE_FPREGS) 4297 ATF_TC(fpregs1); 4298 ATF_TC_HEAD(fpregs1, tc) 4299 { 4300 atf_tc_set_md_var(tc, "descr", 4301 "Verify plain PT_GETFPREGS call without further steps"); 4302 } 4303 4304 ATF_TC_BODY(fpregs1, tc) 4305 { 4306 const int exitval = 5; 4307 const int sigval = SIGSTOP; 4308 pid_t child, wpid; 4309 #if defined(TWAIT_HAVE_STATUS) 4310 int status; 4311 #endif 4312 struct fpreg r; 4313 4314 DPRINTF("Before forking process PID=%d\n", getpid()); 4315 SYSCALL_REQUIRE((child = fork()) != -1); 4316 if (child == 0) { 4317 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 4318 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 4319 4320 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 4321 FORKEE_ASSERT(raise(sigval) == 0); 4322 4323 DPRINTF("Before exiting of the child process\n"); 4324 _exit(exitval); 4325 } 4326 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 4327 4328 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4329 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 4330 4331 validate_status_stopped(status, sigval); 4332 4333 DPRINTF("Call GETFPREGS for the child process\n"); 4334 SYSCALL_REQUIRE(ptrace(PT_GETFPREGS, child, &r, 0) != -1); 4335 4336 DPRINTF("Before resuming the child process where it left off and " 4337 "without signal to be sent\n"); 4338 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 4339 4340 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4341 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 4342 4343 validate_status_exited(status, exitval); 4344 4345 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4346 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 4347 } 4348 #endif 4349 4350 #if defined(HAVE_FPREGS) 4351 ATF_TC(fpregs2); 4352 ATF_TC_HEAD(fpregs2, tc) 4353 { 4354 atf_tc_set_md_var(tc, "descr", 4355 "Verify PT_GETFPREGS and PT_SETFPREGS calls without changing " 4356 "regs"); 4357 } 4358 4359 ATF_TC_BODY(fpregs2, tc) 4360 { 4361 const int exitval = 5; 4362 const int sigval = SIGSTOP; 4363 pid_t child, wpid; 4364 #if defined(TWAIT_HAVE_STATUS) 4365 int status; 4366 #endif 4367 struct fpreg r; 4368 4369 DPRINTF("Before forking process PID=%d\n", getpid()); 4370 SYSCALL_REQUIRE((child = fork()) != -1); 4371 if (child == 0) { 4372 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 4373 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 4374 4375 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 4376 FORKEE_ASSERT(raise(sigval) == 0); 4377 4378 DPRINTF("Before exiting of the child process\n"); 4379 _exit(exitval); 4380 } 4381 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 4382 4383 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4384 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 4385 4386 validate_status_stopped(status, sigval); 4387 4388 DPRINTF("Call GETFPREGS for the child process\n"); 4389 SYSCALL_REQUIRE(ptrace(PT_GETFPREGS, child, &r, 0) != -1); 4390 4391 DPRINTF("Call SETFPREGS for the child (without changed regs)\n"); 4392 SYSCALL_REQUIRE(ptrace(PT_SETFPREGS, child, &r, 0) != -1); 4393 4394 DPRINTF("Before resuming the child process where it left off and " 4395 "without signal to be sent\n"); 4396 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 4397 4398 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4399 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 4400 4401 validate_status_exited(status, exitval); 4402 4403 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4404 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 4405 } 4406 #endif 4407 4408 #if defined(PT_STEP) 4409 static void 4410 ptrace_step(int N, int setstep) 4411 { 4412 const int exitval = 5; 4413 const int sigval = SIGSTOP; 4414 pid_t child, wpid; 4415 #if defined(TWAIT_HAVE_STATUS) 4416 int status; 4417 #endif 4418 int happy; 4419 4420 #if defined(__arm__) 4421 /* PT_STEP not supported on arm 32-bit */ 4422 atf_tc_expect_fail("PR kern/52119"); 4423 #endif 4424 4425 DPRINTF("Before forking process PID=%d\n", getpid()); 4426 SYSCALL_REQUIRE((child = fork()) != -1); 4427 if (child == 0) { 4428 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 4429 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 4430 4431 happy = check_happy(999); 4432 4433 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 4434 FORKEE_ASSERT(raise(sigval) == 0); 4435 4436 FORKEE_ASSERT_EQ(happy, check_happy(999)); 4437 4438 DPRINTF("Before exiting of the child process\n"); 4439 _exit(exitval); 4440 } 4441 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 4442 4443 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4444 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 4445 4446 validate_status_stopped(status, sigval); 4447 4448 while (N --> 0) { 4449 if (setstep) { 4450 DPRINTF("Before resuming the child process where it " 4451 "left off and without signal to be sent (use " 4452 "PT_SETSTEP and PT_CONTINUE)\n"); 4453 SYSCALL_REQUIRE(ptrace(PT_SETSTEP, child, 0, 0) != -1); 4454 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) 4455 != -1); 4456 } else { 4457 DPRINTF("Before resuming the child process where it " 4458 "left off and without signal to be sent (use " 4459 "PT_STEP)\n"); 4460 SYSCALL_REQUIRE(ptrace(PT_STEP, child, (void *)1, 0) 4461 != -1); 4462 } 4463 4464 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4465 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), 4466 child); 4467 4468 validate_status_stopped(status, SIGTRAP); 4469 4470 if (setstep) { 4471 SYSCALL_REQUIRE(ptrace(PT_CLEARSTEP, child, 0, 0) != -1); 4472 } 4473 } 4474 4475 DPRINTF("Before resuming the child process where it left off and " 4476 "without signal to be sent\n"); 4477 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 4478 4479 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4480 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 4481 4482 validate_status_exited(status, exitval); 4483 4484 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4485 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 4486 } 4487 #endif 4488 4489 #if defined(PT_STEP) 4490 ATF_TC(step1); 4491 ATF_TC_HEAD(step1, tc) 4492 { 4493 atf_tc_set_md_var(tc, "descr", 4494 "Verify single PT_STEP call"); 4495 } 4496 4497 ATF_TC_BODY(step1, tc) 4498 { 4499 ptrace_step(1, 0); 4500 } 4501 #endif 4502 4503 #if defined(PT_STEP) 4504 ATF_TC(step2); 4505 ATF_TC_HEAD(step2, tc) 4506 { 4507 atf_tc_set_md_var(tc, "descr", 4508 "Verify PT_STEP called twice"); 4509 } 4510 4511 ATF_TC_BODY(step2, tc) 4512 { 4513 ptrace_step(2, 0); 4514 } 4515 #endif 4516 4517 #if defined(PT_STEP) 4518 ATF_TC(step3); 4519 ATF_TC_HEAD(step3, tc) 4520 { 4521 atf_tc_set_md_var(tc, "descr", 4522 "Verify PT_STEP called three times"); 4523 } 4524 4525 ATF_TC_BODY(step3, tc) 4526 { 4527 ptrace_step(3, 0); 4528 } 4529 #endif 4530 4531 #if defined(PT_STEP) 4532 ATF_TC(step4); 4533 ATF_TC_HEAD(step4, tc) 4534 { 4535 atf_tc_set_md_var(tc, "descr", 4536 "Verify PT_STEP called four times"); 4537 } 4538 4539 ATF_TC_BODY(step4, tc) 4540 { 4541 ptrace_step(4, 0); 4542 } 4543 #endif 4544 4545 #if defined(PT_STEP) 4546 ATF_TC(setstep1); 4547 ATF_TC_HEAD(setstep1, tc) 4548 { 4549 atf_tc_set_md_var(tc, "descr", 4550 "Verify single PT_SETSTEP call"); 4551 } 4552 4553 ATF_TC_BODY(setstep1, tc) 4554 { 4555 ptrace_step(1, 1); 4556 } 4557 #endif 4558 4559 #if defined(PT_STEP) 4560 ATF_TC(setstep2); 4561 ATF_TC_HEAD(setstep2, tc) 4562 { 4563 atf_tc_set_md_var(tc, "descr", 4564 "Verify PT_SETSTEP called twice"); 4565 } 4566 4567 ATF_TC_BODY(setstep2, tc) 4568 { 4569 ptrace_step(2, 1); 4570 } 4571 #endif 4572 4573 #if defined(PT_STEP) 4574 ATF_TC(setstep3); 4575 ATF_TC_HEAD(setstep3, tc) 4576 { 4577 atf_tc_set_md_var(tc, "descr", 4578 "Verify PT_SETSTEP called three times"); 4579 } 4580 4581 ATF_TC_BODY(setstep3, tc) 4582 { 4583 ptrace_step(3, 1); 4584 } 4585 #endif 4586 4587 #if defined(PT_STEP) 4588 ATF_TC(setstep4); 4589 ATF_TC_HEAD(setstep4, tc) 4590 { 4591 atf_tc_set_md_var(tc, "descr", 4592 "Verify PT_SETSTEP called four times"); 4593 } 4594 4595 ATF_TC_BODY(setstep4, tc) 4596 { 4597 ptrace_step(4, 1); 4598 } 4599 #endif 4600 4601 ATF_TC(kill1); 4602 ATF_TC_HEAD(kill1, tc) 4603 { 4604 atf_tc_set_md_var(tc, "descr", 4605 "Verify that PT_CONTINUE with SIGKILL terminates child"); 4606 } 4607 4608 ATF_TC_BODY(kill1, tc) 4609 { 4610 const int sigval = SIGSTOP, sigsent = SIGKILL; 4611 pid_t child, wpid; 4612 #if defined(TWAIT_HAVE_STATUS) 4613 int status; 4614 #endif 4615 4616 DPRINTF("Before forking process PID=%d\n", getpid()); 4617 SYSCALL_REQUIRE((child = fork()) != -1); 4618 if (child == 0) { 4619 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 4620 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 4621 4622 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 4623 FORKEE_ASSERT(raise(sigval) == 0); 4624 4625 /* NOTREACHED */ 4626 FORKEE_ASSERTX(0 && 4627 "Child should be terminated by a signal from its parent"); 4628 } 4629 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 4630 4631 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4632 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 4633 4634 validate_status_stopped(status, sigval); 4635 4636 DPRINTF("Before resuming the child process where it left off and " 4637 "without signal to be sent\n"); 4638 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, sigsent) != -1); 4639 4640 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4641 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 4642 4643 validate_status_signaled(status, sigsent, 0); 4644 4645 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4646 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 4647 } 4648 4649 ATF_TC(kill2); 4650 ATF_TC_HEAD(kill2, tc) 4651 { 4652 atf_tc_set_md_var(tc, "descr", 4653 "Verify that PT_KILL terminates child"); 4654 } 4655 4656 ATF_TC_BODY(kill2, tc) 4657 { 4658 const int sigval = SIGSTOP; 4659 pid_t child, wpid; 4660 #if defined(TWAIT_HAVE_STATUS) 4661 int status; 4662 #endif 4663 4664 DPRINTF("Before forking process PID=%d\n", getpid()); 4665 SYSCALL_REQUIRE((child = fork()) != -1); 4666 if (child == 0) { 4667 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 4668 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 4669 4670 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 4671 FORKEE_ASSERT(raise(sigval) == 0); 4672 4673 /* NOTREACHED */ 4674 FORKEE_ASSERTX(0 && 4675 "Child should be terminated by a signal from its parent"); 4676 } 4677 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 4678 4679 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4680 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 4681 4682 validate_status_stopped(status, sigval); 4683 4684 DPRINTF("Before resuming the child process where it left off and " 4685 "without signal to be sent\n"); 4686 SYSCALL_REQUIRE(ptrace(PT_KILL, child, (void*)1, 0) != -1); 4687 4688 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4689 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 4690 4691 validate_status_signaled(status, SIGKILL, 0); 4692 4693 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4694 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 4695 } 4696 4697 ATF_TC(lwpinfo1); 4698 ATF_TC_HEAD(lwpinfo1, tc) 4699 { 4700 atf_tc_set_md_var(tc, "descr", 4701 "Verify basic LWPINFO call for single thread (PT_TRACE_ME)"); 4702 } 4703 4704 ATF_TC_BODY(lwpinfo1, tc) 4705 { 4706 const int exitval = 5; 4707 const int sigval = SIGSTOP; 4708 pid_t child, wpid; 4709 #if defined(TWAIT_HAVE_STATUS) 4710 int status; 4711 #endif 4712 struct ptrace_lwpinfo info = {0, 0}; 4713 4714 DPRINTF("Before forking process PID=%d\n", getpid()); 4715 SYSCALL_REQUIRE((child = fork()) != -1); 4716 if (child == 0) { 4717 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 4718 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 4719 4720 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 4721 FORKEE_ASSERT(raise(sigval) == 0); 4722 4723 DPRINTF("Before exiting of the child process\n"); 4724 _exit(exitval); 4725 } 4726 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 4727 4728 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4729 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 4730 4731 validate_status_stopped(status, sigval); 4732 4733 DPRINTF("Before calling ptrace(2) with PT_LWPINFO for child\n"); 4734 SYSCALL_REQUIRE(ptrace(PT_LWPINFO, child, &info, sizeof(info)) != -1); 4735 4736 DPRINTF("Assert that there exists a thread\n"); 4737 ATF_REQUIRE(info.pl_lwpid > 0); 4738 4739 DPRINTF("Assert that lwp thread %d received event PL_EVENT_SIGNAL\n", 4740 info.pl_lwpid); 4741 ATF_REQUIRE_EQ_MSG(info.pl_event, PL_EVENT_SIGNAL, 4742 "Received event %d != expected event %d", 4743 info.pl_event, PL_EVENT_SIGNAL); 4744 4745 DPRINTF("Before calling ptrace(2) with PT_LWPINFO for child\n"); 4746 SYSCALL_REQUIRE(ptrace(PT_LWPINFO, child, &info, sizeof(info)) != -1); 4747 4748 DPRINTF("Assert that there are no more lwp threads in child\n"); 4749 ATF_REQUIRE_EQ(info.pl_lwpid, 0); 4750 4751 DPRINTF("Before resuming the child process where it left off and " 4752 "without signal to be sent\n"); 4753 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 4754 4755 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4756 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 4757 4758 validate_status_exited(status, exitval); 4759 4760 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4761 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 4762 } 4763 4764 #if defined(TWAIT_HAVE_PID) 4765 ATF_TC(lwpinfo2); 4766 ATF_TC_HEAD(lwpinfo2, tc) 4767 { 4768 atf_tc_set_md_var(tc, "descr", 4769 "Verify basic LWPINFO call for single thread (PT_ATTACH from " 4770 "tracer)"); 4771 } 4772 4773 ATF_TC_BODY(lwpinfo2, tc) 4774 { 4775 struct msg_fds parent_tracee, parent_tracer; 4776 const int exitval_tracee = 5; 4777 const int exitval_tracer = 10; 4778 pid_t tracee, tracer, wpid; 4779 uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */ 4780 #if defined(TWAIT_HAVE_STATUS) 4781 int status; 4782 #endif 4783 struct ptrace_lwpinfo info = {0, 0}; 4784 4785 DPRINTF("Spawn tracee\n"); 4786 SYSCALL_REQUIRE(msg_open(&parent_tracee) == 0); 4787 SYSCALL_REQUIRE(msg_open(&parent_tracer) == 0); 4788 tracee = atf_utils_fork(); 4789 if (tracee == 0) { 4790 4791 /* Wait for message from the parent */ 4792 CHILD_TO_PARENT("tracee ready", parent_tracee, msg); 4793 CHILD_FROM_PARENT("tracee exit", parent_tracee, msg); 4794 4795 _exit(exitval_tracee); 4796 } 4797 PARENT_FROM_CHILD("tracee ready", parent_tracee, msg); 4798 4799 DPRINTF("Spawn debugger\n"); 4800 tracer = atf_utils_fork(); 4801 if (tracer == 0) { 4802 /* No IPC to communicate with the child */ 4803 DPRINTF("Before calling PT_ATTACH from tracee %d\n", getpid()); 4804 FORKEE_ASSERT(ptrace(PT_ATTACH, tracee, NULL, 0) != -1); 4805 4806 /* Wait for tracee and assert that it was stopped w/ SIGSTOP */ 4807 FORKEE_REQUIRE_SUCCESS( 4808 wpid = TWAIT_GENERIC(tracee, &status, 0), tracee); 4809 4810 forkee_status_stopped(status, SIGSTOP); 4811 4812 DPRINTF("Before calling ptrace(2) with PT_LWPINFO for child\n"); 4813 FORKEE_ASSERT(ptrace(PT_LWPINFO, tracee, &info, sizeof(info)) 4814 != -1); 4815 4816 DPRINTF("Assert that there exists a thread\n"); 4817 FORKEE_ASSERTX(info.pl_lwpid > 0); 4818 4819 DPRINTF("Assert that lwp thread %d received event " 4820 "PL_EVENT_SIGNAL\n", info.pl_lwpid); 4821 FORKEE_ASSERT_EQ(info.pl_event, PL_EVENT_SIGNAL); 4822 4823 DPRINTF("Before calling ptrace(2) with PT_LWPINFO for child\n"); 4824 FORKEE_ASSERT(ptrace(PT_LWPINFO, tracee, &info, sizeof(info)) 4825 != -1); 4826 4827 DPRINTF("Assert that there are no more lwp threads in child\n"); 4828 FORKEE_ASSERTX(info.pl_lwpid == 0); 4829 4830 /* Resume tracee with PT_CONTINUE */ 4831 FORKEE_ASSERT(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1); 4832 4833 /* Inform parent that tracer has attached to tracee */ 4834 CHILD_TO_PARENT("tracer ready", parent_tracer, msg); 4835 /* Wait for parent */ 4836 CHILD_FROM_PARENT("tracer wait", parent_tracer, msg); 4837 4838 /* Wait for tracee and assert that it exited */ 4839 FORKEE_REQUIRE_SUCCESS( 4840 wpid = TWAIT_GENERIC(tracee, &status, 0), tracee); 4841 4842 forkee_status_exited(status, exitval_tracee); 4843 4844 DPRINTF("Before exiting of the tracer process\n"); 4845 _exit(exitval_tracer); 4846 } 4847 4848 DPRINTF("Wait for the tracer to attach to the tracee\n"); 4849 PARENT_FROM_CHILD("tracer ready", parent_tracer, msg); 4850 4851 DPRINTF("Resume the tracee and let it exit\n"); 4852 PARENT_TO_CHILD("tracee exit", parent_tracee, msg); 4853 4854 DPRINTF("Detect that tracee is zombie\n"); 4855 await_zombie(tracee); 4856 4857 DPRINTF("Assert that there is no status about tracee - " 4858 "Tracer must detect zombie first - calling %s()\n", TWAIT_FNAME); 4859 TWAIT_REQUIRE_SUCCESS( 4860 wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 0); 4861 4862 DPRINTF("Resume the tracer and let it detect exited tracee\n"); 4863 PARENT_TO_CHILD("tracer wait", parent_tracer, msg); 4864 4865 DPRINTF("Wait for tracer to finish its job and exit - calling %s()\n", 4866 TWAIT_FNAME); 4867 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracer, &status, 0), 4868 tracer); 4869 4870 validate_status_exited(status, exitval_tracer); 4871 4872 DPRINTF("Wait for tracee to finish its job and exit - calling %s()\n", 4873 TWAIT_FNAME); 4874 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 4875 tracee); 4876 4877 validate_status_exited(status, exitval_tracee); 4878 4879 msg_close(&parent_tracer); 4880 msg_close(&parent_tracee); 4881 } 4882 #endif 4883 4884 ATF_TC(siginfo1); 4885 ATF_TC_HEAD(siginfo1, tc) 4886 { 4887 atf_tc_set_md_var(tc, "descr", 4888 "Verify basic PT_GET_SIGINFO call for SIGTRAP from tracee"); 4889 } 4890 4891 ATF_TC_BODY(siginfo1, tc) 4892 { 4893 const int exitval = 5; 4894 const int sigval = SIGTRAP; 4895 pid_t child, wpid; 4896 #if defined(TWAIT_HAVE_STATUS) 4897 int status; 4898 #endif 4899 struct ptrace_siginfo info; 4900 memset(&info, 0, sizeof(info)); 4901 4902 DPRINTF("Before forking process PID=%d\n", getpid()); 4903 SYSCALL_REQUIRE((child = fork()) != -1); 4904 if (child == 0) { 4905 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 4906 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 4907 4908 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 4909 FORKEE_ASSERT(raise(sigval) == 0); 4910 4911 DPRINTF("Before exiting of the child process\n"); 4912 _exit(exitval); 4913 } 4914 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 4915 4916 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4917 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 4918 4919 validate_status_stopped(status, sigval); 4920 4921 DPRINTF("Before calling ptrace(2) with PT_GET_SIGINFO for child\n"); 4922 SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1); 4923 4924 DPRINTF("Signal traced to lwpid=%d\n", info.psi_lwpid); 4925 DPRINTF("Signal properties: si_signo=%#x si_code=%#x si_errno=%#x\n", 4926 info.psi_siginfo.si_signo, info.psi_siginfo.si_code, 4927 info.psi_siginfo.si_errno); 4928 4929 DPRINTF("Before resuming the child process where it left off and " 4930 "without signal to be sent\n"); 4931 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 4932 4933 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4934 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 4935 4936 validate_status_exited(status, exitval); 4937 4938 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4939 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 4940 } 4941 4942 ATF_TC(siginfo2); 4943 ATF_TC_HEAD(siginfo2, tc) 4944 { 4945 atf_tc_set_md_var(tc, "descr", 4946 "Verify basic PT_GET_SIGINFO and PT_SET_SIGINFO calls without " 4947 "modification of SIGINT from tracee"); 4948 } 4949 4950 static int siginfo2_caught = 0; 4951 4952 static void 4953 siginfo2_sighandler(int sig) 4954 { 4955 FORKEE_ASSERT_EQ(sig, SIGINT); 4956 4957 ++siginfo2_caught; 4958 } 4959 4960 ATF_TC_BODY(siginfo2, tc) 4961 { 4962 const int exitval = 5; 4963 const int sigval = SIGINT; 4964 pid_t child, wpid; 4965 struct sigaction sa; 4966 #if defined(TWAIT_HAVE_STATUS) 4967 int status; 4968 #endif 4969 struct ptrace_siginfo info; 4970 memset(&info, 0, sizeof(info)); 4971 4972 DPRINTF("Before forking process PID=%d\n", getpid()); 4973 SYSCALL_REQUIRE((child = fork()) != -1); 4974 if (child == 0) { 4975 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 4976 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 4977 4978 sa.sa_handler = siginfo2_sighandler; 4979 sa.sa_flags = SA_SIGINFO; 4980 sigemptyset(&sa.sa_mask); 4981 4982 FORKEE_ASSERT(sigaction(sigval, &sa, NULL) != -1); 4983 4984 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 4985 FORKEE_ASSERT(raise(sigval) == 0); 4986 4987 FORKEE_ASSERT_EQ(siginfo2_caught, 1); 4988 4989 DPRINTF("Before exiting of the child process\n"); 4990 _exit(exitval); 4991 } 4992 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 4993 4994 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 4995 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 4996 4997 validate_status_stopped(status, sigval); 4998 4999 DPRINTF("Before calling ptrace(2) with PT_GET_SIGINFO for child\n"); 5000 SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1); 5001 5002 DPRINTF("Signal traced to lwpid=%d\n", info.psi_lwpid); 5003 DPRINTF("Signal properties: si_signo=%#x si_code=%#x si_errno=%#x\n", 5004 info.psi_siginfo.si_signo, info.psi_siginfo.si_code, 5005 info.psi_siginfo.si_errno); 5006 5007 DPRINTF("Before calling ptrace(2) with PT_SET_SIGINFO for child\n"); 5008 SYSCALL_REQUIRE(ptrace(PT_SET_SIGINFO, child, &info, sizeof(info)) != -1); 5009 5010 DPRINTF("Before resuming the child process where it left off and " 5011 "without signal to be sent\n"); 5012 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, sigval) != -1); 5013 5014 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5015 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5016 5017 validate_status_exited(status, exitval); 5018 5019 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5020 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 5021 } 5022 5023 ATF_TC(siginfo3); 5024 ATF_TC_HEAD(siginfo3, tc) 5025 { 5026 atf_tc_set_md_var(tc, "descr", 5027 "Verify basic PT_GET_SIGINFO and PT_SET_SIGINFO calls with " 5028 "setting signal to new value"); 5029 } 5030 5031 static int siginfo3_caught = 0; 5032 5033 static void 5034 siginfo3_sigaction(int sig, siginfo_t *info, void *ctx) 5035 { 5036 FORKEE_ASSERT_EQ(sig, SIGTRAP); 5037 5038 FORKEE_ASSERT_EQ(info->si_signo, SIGTRAP); 5039 FORKEE_ASSERT_EQ(info->si_code, TRAP_BRKPT); 5040 5041 ++siginfo3_caught; 5042 } 5043 5044 ATF_TC_BODY(siginfo3, tc) 5045 { 5046 const int exitval = 5; 5047 const int sigval = SIGINT; 5048 const int sigfaked = SIGTRAP; 5049 const int sicodefaked = TRAP_BRKPT; 5050 pid_t child, wpid; 5051 struct sigaction sa; 5052 #if defined(TWAIT_HAVE_STATUS) 5053 int status; 5054 #endif 5055 struct ptrace_siginfo info; 5056 memset(&info, 0, sizeof(info)); 5057 5058 DPRINTF("Before forking process PID=%d\n", getpid()); 5059 SYSCALL_REQUIRE((child = fork()) != -1); 5060 if (child == 0) { 5061 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 5062 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 5063 5064 sa.sa_sigaction = siginfo3_sigaction; 5065 sa.sa_flags = SA_SIGINFO; 5066 sigemptyset(&sa.sa_mask); 5067 5068 FORKEE_ASSERT(sigaction(sigfaked, &sa, NULL) != -1); 5069 5070 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 5071 FORKEE_ASSERT(raise(sigval) == 0); 5072 5073 FORKEE_ASSERT_EQ(siginfo3_caught, 1); 5074 5075 DPRINTF("Before exiting of the child process\n"); 5076 _exit(exitval); 5077 } 5078 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 5079 5080 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5081 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5082 5083 validate_status_stopped(status, sigval); 5084 5085 DPRINTF("Before calling ptrace(2) with PT_GET_SIGINFO for child\n"); 5086 SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1); 5087 5088 DPRINTF("Signal traced to lwpid=%d\n", info.psi_lwpid); 5089 DPRINTF("Signal properties: si_signo=%#x si_code=%#x si_errno=%#x\n", 5090 info.psi_siginfo.si_signo, info.psi_siginfo.si_code, 5091 info.psi_siginfo.si_errno); 5092 5093 DPRINTF("Before setting new faked signal to signo=%d si_code=%d\n", 5094 sigfaked, sicodefaked); 5095 info.psi_siginfo.si_signo = sigfaked; 5096 info.psi_siginfo.si_code = sicodefaked; 5097 5098 DPRINTF("Before calling ptrace(2) with PT_SET_SIGINFO for child\n"); 5099 SYSCALL_REQUIRE(ptrace(PT_SET_SIGINFO, child, &info, sizeof(info)) != -1); 5100 5101 DPRINTF("Before calling ptrace(2) with PT_GET_SIGINFO for child\n"); 5102 SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1); 5103 5104 DPRINTF("Before checking siginfo_t\n"); 5105 ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sigfaked); 5106 ATF_REQUIRE_EQ(info.psi_siginfo.si_code, sicodefaked); 5107 5108 DPRINTF("Before resuming the child process where it left off and " 5109 "without signal to be sent\n"); 5110 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, sigfaked) != -1); 5111 5112 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5113 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5114 5115 validate_status_exited(status, exitval); 5116 5117 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5118 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 5119 } 5120 5121 ATF_TC(siginfo4); 5122 ATF_TC_HEAD(siginfo4, tc) 5123 { 5124 atf_tc_set_md_var(tc, "descr", 5125 "Detect SIGTRAP TRAP_EXEC from tracee"); 5126 } 5127 5128 ATF_TC_BODY(siginfo4, tc) 5129 { 5130 const int sigval = SIGTRAP; 5131 pid_t child, wpid; 5132 #if defined(TWAIT_HAVE_STATUS) 5133 int status; 5134 #endif 5135 5136 struct ptrace_siginfo info; 5137 memset(&info, 0, sizeof(info)); 5138 5139 DPRINTF("Before forking process PID=%d\n", getpid()); 5140 SYSCALL_REQUIRE((child = fork()) != -1); 5141 if (child == 0) { 5142 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 5143 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 5144 5145 DPRINTF("Before calling execve(2) from child\n"); 5146 execlp("/bin/echo", "/bin/echo", NULL); 5147 5148 FORKEE_ASSERT(0 && "Not reached"); 5149 } 5150 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 5151 5152 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5153 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5154 5155 validate_status_stopped(status, sigval); 5156 5157 DPRINTF("Before calling ptrace(2) with PT_GET_SIGINFO for child\n"); 5158 SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1); 5159 5160 DPRINTF("Signal traced to lwpid=%d\n", info.psi_lwpid); 5161 DPRINTF("Signal properties: si_signo=%#x si_code=%#x si_errno=%#x\n", 5162 info.psi_siginfo.si_signo, info.psi_siginfo.si_code, 5163 info.psi_siginfo.si_errno); 5164 5165 ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sigval); 5166 ATF_REQUIRE_EQ(info.psi_siginfo.si_code, TRAP_EXEC); 5167 5168 DPRINTF("Before resuming the child process where it left off and " 5169 "without signal to be sent\n"); 5170 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 5171 5172 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5173 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5174 5175 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5176 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 5177 } 5178 5179 #if defined(TWAIT_HAVE_PID) 5180 ATF_TC(siginfo5); 5181 ATF_TC_HEAD(siginfo5, tc) 5182 { 5183 atf_tc_set_md_var(tc, "descr", 5184 "Verify that fork(2) is intercepted by ptrace(2) with EVENT_MASK " 5185 "set to PTRACE_FORK and reports correct signal information"); 5186 } 5187 5188 ATF_TC_BODY(siginfo5, tc) 5189 { 5190 const int exitval = 5; 5191 const int exitval2 = 15; 5192 const int sigval = SIGSTOP; 5193 pid_t child, child2, wpid; 5194 #if defined(TWAIT_HAVE_STATUS) 5195 int status; 5196 #endif 5197 ptrace_state_t state; 5198 const int slen = sizeof(state); 5199 ptrace_event_t event; 5200 const int elen = sizeof(event); 5201 struct ptrace_siginfo info; 5202 5203 memset(&info, 0, sizeof(info)); 5204 5205 DPRINTF("Before forking process PID=%d\n", getpid()); 5206 SYSCALL_REQUIRE((child = fork()) != -1); 5207 if (child == 0) { 5208 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 5209 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 5210 5211 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 5212 FORKEE_ASSERT(raise(sigval) == 0); 5213 5214 FORKEE_ASSERT((child2 = fork()) != -1); 5215 5216 if (child2 == 0) 5217 _exit(exitval2); 5218 5219 FORKEE_REQUIRE_SUCCESS 5220 (wpid = TWAIT_GENERIC(child2, &status, 0), child2); 5221 5222 forkee_status_exited(status, exitval2); 5223 5224 DPRINTF("Before exiting of the child process\n"); 5225 _exit(exitval); 5226 } 5227 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 5228 5229 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5230 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5231 5232 validate_status_stopped(status, sigval); 5233 5234 DPRINTF("Before calling ptrace(2) with PT_GET_SIGINFO for child\n"); 5235 SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1); 5236 5237 DPRINTF("Before checking siginfo_t\n"); 5238 ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sigval); 5239 ATF_REQUIRE_EQ(info.psi_siginfo.si_code, SI_LWP); 5240 5241 DPRINTF("Enable PTRACE_FORK in EVENT_MASK for the child %d\n", child); 5242 event.pe_set_event = PTRACE_FORK; 5243 SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1); 5244 5245 DPRINTF("Before resuming the child process where it left off and " 5246 "without signal to be sent\n"); 5247 DPRINTF("We expect two SIGTRAP events, for child %d (TRAP_CHLD, " 5248 "pe_report_event=PTRACE_FORK, state.pe_other_pid=child2) and " 5249 "for child2 (TRAP_CHLD, pe_report_event=PTRACE_FORK, " 5250 "state.pe_other_pid=child)\n", child); 5251 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 5252 5253 DPRINTF("Before calling %s() for the child %d\n", TWAIT_FNAME, child); 5254 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5255 5256 validate_status_stopped(status, SIGTRAP); 5257 5258 DPRINTF("Before calling ptrace(2) with PT_GET_SIGINFO for child\n"); 5259 SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1); 5260 5261 DPRINTF("Before checking siginfo_t\n"); 5262 ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, SIGTRAP); 5263 ATF_REQUIRE_EQ(info.psi_siginfo.si_code, TRAP_CHLD); 5264 5265 SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child, &state, slen) != -1); 5266 ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_FORK); 5267 5268 child2 = state.pe_other_pid; 5269 DPRINTF("Reported PTRACE_FORK event with forkee %d\n", child2); 5270 5271 DPRINTF("Before calling %s() for the forkee %d of the child %d\n", 5272 TWAIT_FNAME, child2, child); 5273 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child2, &status, 0), 5274 child2); 5275 5276 validate_status_stopped(status, SIGTRAP); 5277 5278 DPRINTF("Before calling ptrace(2) with PT_GET_SIGINFO for child\n"); 5279 SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1); 5280 5281 DPRINTF("Before checking siginfo_t\n"); 5282 ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, SIGTRAP); 5283 ATF_REQUIRE_EQ(info.psi_siginfo.si_code, TRAP_CHLD); 5284 5285 SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child2, &state, slen) != -1); 5286 ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_FORK); 5287 ATF_REQUIRE_EQ(state.pe_other_pid, child); 5288 5289 DPRINTF("Before resuming the forkee process where it left off and " 5290 "without signal to be sent\n"); 5291 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child2, (void *)1, 0) != -1); 5292 5293 DPRINTF("Before resuming the child process where it left off and " 5294 "without signal to be sent\n"); 5295 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 5296 5297 DPRINTF("Before calling %s() for the forkee - expected exited\n", 5298 TWAIT_FNAME); 5299 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child2, &status, 0), 5300 child2); 5301 5302 validate_status_exited(status, exitval2); 5303 5304 DPRINTF("Before calling %s() for the forkee - expected no process\n", 5305 TWAIT_FNAME); 5306 TWAIT_REQUIRE_FAILURE(ECHILD, 5307 wpid = TWAIT_GENERIC(child2, &status, 0)); 5308 5309 DPRINTF("Before calling %s() for the child - expected stopped " 5310 "SIGCHLD\n", TWAIT_FNAME); 5311 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5312 5313 validate_status_stopped(status, SIGCHLD); 5314 5315 DPRINTF("Before calling ptrace(2) with PT_GET_SIGINFO for child\n"); 5316 SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1); 5317 5318 DPRINTF("Before checking siginfo_t\n"); 5319 ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, SIGCHLD); 5320 ATF_REQUIRE_EQ(info.psi_siginfo.si_code, CLD_EXITED); 5321 5322 DPRINTF("Before resuming the child process where it left off and " 5323 "without signal to be sent\n"); 5324 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 5325 5326 DPRINTF("Before calling %s() for the child - expected exited\n", 5327 TWAIT_FNAME); 5328 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5329 5330 validate_status_exited(status, exitval); 5331 5332 DPRINTF("Before calling %s() for the child - expected no process\n", 5333 TWAIT_FNAME); 5334 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 5335 } 5336 #endif 5337 5338 #if defined(PT_STEP) 5339 ATF_TC(siginfo6); 5340 ATF_TC_HEAD(siginfo6, tc) 5341 { 5342 atf_tc_set_md_var(tc, "descr", 5343 "Verify single PT_STEP call with signal information check"); 5344 } 5345 5346 ATF_TC_BODY(siginfo6, tc) 5347 { 5348 const int exitval = 5; 5349 const int sigval = SIGSTOP; 5350 pid_t child, wpid; 5351 #if defined(TWAIT_HAVE_STATUS) 5352 int status; 5353 #endif 5354 int happy; 5355 struct ptrace_siginfo info; 5356 5357 #if defined(__arm__) 5358 /* PT_STEP not supported on arm 32-bit */ 5359 atf_tc_expect_fail("PR kern/52119"); 5360 #endif 5361 5362 memset(&info, 0, sizeof(info)); 5363 5364 DPRINTF("Before forking process PID=%d\n", getpid()); 5365 SYSCALL_REQUIRE((child = fork()) != -1); 5366 if (child == 0) { 5367 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 5368 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 5369 5370 happy = check_happy(100); 5371 5372 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 5373 FORKEE_ASSERT(raise(sigval) == 0); 5374 5375 FORKEE_ASSERT_EQ(happy, check_happy(100)); 5376 5377 DPRINTF("Before exiting of the child process\n"); 5378 _exit(exitval); 5379 } 5380 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 5381 5382 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5383 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5384 5385 validate_status_stopped(status, sigval); 5386 5387 DPRINTF("Before calling ptrace(2) with PT_GET_SIGINFO for child\n"); 5388 SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1); 5389 5390 DPRINTF("Before checking siginfo_t\n"); 5391 ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sigval); 5392 ATF_REQUIRE_EQ(info.psi_siginfo.si_code, SI_LWP); 5393 5394 DPRINTF("Before resuming the child process where it left off and " 5395 "without signal to be sent (use PT_STEP)\n"); 5396 SYSCALL_REQUIRE(ptrace(PT_STEP, child, (void *)1, 0) != -1); 5397 5398 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5399 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5400 5401 validate_status_stopped(status, SIGTRAP); 5402 5403 DPRINTF("Before calling ptrace(2) with PT_GET_SIGINFO for child\n"); 5404 SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1); 5405 5406 DPRINTF("Before checking siginfo_t\n"); 5407 ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, SIGTRAP); 5408 ATF_REQUIRE_EQ(info.psi_siginfo.si_code, TRAP_TRACE); 5409 5410 DPRINTF("Before resuming the child process where it left off and " 5411 "without signal to be sent\n"); 5412 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 5413 5414 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5415 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5416 5417 validate_status_exited(status, exitval); 5418 5419 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5420 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 5421 } 5422 #endif 5423 5424 volatile lwpid_t the_lwp_id = 0; 5425 5426 static void 5427 lwp_main_func(void *arg) 5428 { 5429 the_lwp_id = _lwp_self(); 5430 _lwp_exit(); 5431 } 5432 5433 ATF_TC(lwp_create1); 5434 ATF_TC_HEAD(lwp_create1, tc) 5435 { 5436 atf_tc_set_md_var(tc, "descr", 5437 "Verify that 1 LWP creation is intercepted by ptrace(2) with " 5438 "EVENT_MASK set to PTRACE_LWP_CREATE"); 5439 } 5440 5441 ATF_TC_BODY(lwp_create1, tc) 5442 { 5443 const int exitval = 5; 5444 const int sigval = SIGSTOP; 5445 pid_t child, wpid; 5446 #if defined(TWAIT_HAVE_STATUS) 5447 int status; 5448 #endif 5449 ptrace_state_t state; 5450 const int slen = sizeof(state); 5451 ptrace_event_t event; 5452 const int elen = sizeof(event); 5453 ucontext_t uc; 5454 lwpid_t lid; 5455 static const size_t ssize = 16*1024; 5456 void *stack; 5457 5458 DPRINTF("Before forking process PID=%d\n", getpid()); 5459 SYSCALL_REQUIRE((child = fork()) != -1); 5460 if (child == 0) { 5461 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 5462 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 5463 5464 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 5465 FORKEE_ASSERT(raise(sigval) == 0); 5466 5467 DPRINTF("Before allocating memory for stack in child\n"); 5468 FORKEE_ASSERT((stack = malloc(ssize)) != NULL); 5469 5470 DPRINTF("Before making context for new lwp in child\n"); 5471 _lwp_makecontext(&uc, lwp_main_func, NULL, NULL, stack, ssize); 5472 5473 DPRINTF("Before creating new in child\n"); 5474 FORKEE_ASSERT(_lwp_create(&uc, 0, &lid) == 0); 5475 5476 DPRINTF("Before waiting for lwp %d to exit\n", lid); 5477 FORKEE_ASSERT(_lwp_wait(lid, NULL) == 0); 5478 5479 DPRINTF("Before verifying that reported %d and running lid %d " 5480 "are the same\n", lid, the_lwp_id); 5481 FORKEE_ASSERT_EQ(lid, the_lwp_id); 5482 5483 DPRINTF("Before exiting of the child process\n"); 5484 _exit(exitval); 5485 } 5486 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 5487 5488 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5489 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5490 5491 validate_status_stopped(status, sigval); 5492 5493 DPRINTF("Set empty EVENT_MASK for the child %d\n", child); 5494 event.pe_set_event = PTRACE_LWP_CREATE; 5495 SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1); 5496 5497 DPRINTF("Before resuming the child process where it left off and " 5498 "without signal to be sent\n"); 5499 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 5500 5501 DPRINTF("Before calling %s() for the child - expected stopped " 5502 "SIGTRAP\n", TWAIT_FNAME); 5503 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5504 5505 validate_status_stopped(status, SIGTRAP); 5506 5507 SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child, &state, slen) != -1); 5508 5509 ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_LWP_CREATE); 5510 5511 lid = state.pe_lwp; 5512 DPRINTF("Reported PTRACE_LWP_CREATE event with lid %d\n", lid); 5513 5514 DPRINTF("Before resuming the child process where it left off and " 5515 "without signal to be sent\n"); 5516 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 5517 5518 DPRINTF("Before calling %s() for the child - expected exited\n", 5519 TWAIT_FNAME); 5520 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5521 5522 validate_status_exited(status, exitval); 5523 5524 DPRINTF("Before calling %s() for the child - expected no process\n", 5525 TWAIT_FNAME); 5526 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 5527 } 5528 5529 ATF_TC(lwp_exit1); 5530 ATF_TC_HEAD(lwp_exit1, tc) 5531 { 5532 atf_tc_set_md_var(tc, "descr", 5533 "Verify that 1 LWP creation is intercepted by ptrace(2) with " 5534 "EVENT_MASK set to PTRACE_LWP_EXIT"); 5535 } 5536 5537 ATF_TC_BODY(lwp_exit1, tc) 5538 { 5539 const int exitval = 5; 5540 const int sigval = SIGSTOP; 5541 pid_t child, wpid; 5542 #if defined(TWAIT_HAVE_STATUS) 5543 int status; 5544 #endif 5545 ptrace_state_t state; 5546 const int slen = sizeof(state); 5547 ptrace_event_t event; 5548 const int elen = sizeof(event); 5549 ucontext_t uc; 5550 lwpid_t lid; 5551 static const size_t ssize = 16*1024; 5552 void *stack; 5553 5554 DPRINTF("Before forking process PID=%d\n", getpid()); 5555 SYSCALL_REQUIRE((child = fork()) != -1); 5556 if (child == 0) { 5557 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 5558 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 5559 5560 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 5561 FORKEE_ASSERT(raise(sigval) == 0); 5562 5563 DPRINTF("Before allocating memory for stack in child\n"); 5564 FORKEE_ASSERT((stack = malloc(ssize)) != NULL); 5565 5566 DPRINTF("Before making context for new lwp in child\n"); 5567 _lwp_makecontext(&uc, lwp_main_func, NULL, NULL, stack, ssize); 5568 5569 DPRINTF("Before creating new in child\n"); 5570 FORKEE_ASSERT(_lwp_create(&uc, 0, &lid) == 0); 5571 5572 DPRINTF("Before waiting for lwp %d to exit\n", lid); 5573 FORKEE_ASSERT(_lwp_wait(lid, NULL) == 0); 5574 5575 DPRINTF("Before verifying that reported %d and running lid %d " 5576 "are the same\n", lid, the_lwp_id); 5577 FORKEE_ASSERT_EQ(lid, the_lwp_id); 5578 5579 DPRINTF("Before exiting of the child process\n"); 5580 _exit(exitval); 5581 } 5582 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 5583 5584 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5585 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5586 5587 validate_status_stopped(status, sigval); 5588 5589 DPRINTF("Set empty EVENT_MASK for the child %d\n", child); 5590 event.pe_set_event = PTRACE_LWP_EXIT; 5591 SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1); 5592 5593 DPRINTF("Before resuming the child process where it left off and " 5594 "without signal to be sent\n"); 5595 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 5596 5597 DPRINTF("Before calling %s() for the child - expected stopped " 5598 "SIGTRAP\n", TWAIT_FNAME); 5599 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5600 5601 validate_status_stopped(status, SIGTRAP); 5602 5603 SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child, &state, slen) != -1); 5604 5605 ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_LWP_EXIT); 5606 5607 lid = state.pe_lwp; 5608 DPRINTF("Reported PTRACE_LWP_EXIT event with lid %d\n", lid); 5609 5610 DPRINTF("Before resuming the child process where it left off and " 5611 "without signal to be sent\n"); 5612 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 5613 5614 DPRINTF("Before calling %s() for the child - expected exited\n", 5615 TWAIT_FNAME); 5616 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5617 5618 validate_status_exited(status, exitval); 5619 5620 DPRINTF("Before calling %s() for the child - expected no process\n", 5621 TWAIT_FNAME); 5622 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 5623 } 5624 5625 ATF_TC(signal1); 5626 ATF_TC_HEAD(signal1, tc) 5627 { 5628 atf_tc_set_md_var(tc, "descr", 5629 "Verify that masking single unrelated signal does not stop tracer " 5630 "from catching other signals"); 5631 } 5632 5633 ATF_TC_BODY(signal1, tc) 5634 { 5635 const int exitval = 5; 5636 const int sigval = SIGSTOP; 5637 const int sigmasked = SIGTRAP; 5638 const int signotmasked = SIGINT; 5639 pid_t child, wpid; 5640 #if defined(TWAIT_HAVE_STATUS) 5641 int status; 5642 #endif 5643 sigset_t intmask; 5644 5645 DPRINTF("Before forking process PID=%d\n", getpid()); 5646 SYSCALL_REQUIRE((child = fork()) != -1); 5647 if (child == 0) { 5648 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 5649 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 5650 5651 sigemptyset(&intmask); 5652 sigaddset(&intmask, sigmasked); 5653 sigprocmask(SIG_BLOCK, &intmask, NULL); 5654 5655 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 5656 FORKEE_ASSERT(raise(sigval) == 0); 5657 5658 DPRINTF("Before raising %s from child\n", 5659 strsignal(signotmasked)); 5660 FORKEE_ASSERT(raise(signotmasked) == 0); 5661 5662 DPRINTF("Before exiting of the child process\n"); 5663 _exit(exitval); 5664 } 5665 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 5666 5667 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5668 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5669 5670 validate_status_stopped(status, sigval); 5671 5672 DPRINTF("Before resuming the child process where it left off and " 5673 "without signal to be sent\n"); 5674 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 5675 5676 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5677 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5678 5679 validate_status_stopped(status, signotmasked); 5680 5681 DPRINTF("Before resuming the child process where it left off and " 5682 "without signal to be sent\n"); 5683 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 5684 5685 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5686 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5687 5688 validate_status_exited(status, exitval); 5689 5690 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5691 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 5692 } 5693 5694 ATF_TC(signal2); 5695 ATF_TC_HEAD(signal2, tc) 5696 { 5697 atf_tc_set_md_var(tc, "descr", 5698 "Verify that masking SIGTRAP in tracee stops tracer from " 5699 "catching this raised signal"); 5700 } 5701 5702 ATF_TC_BODY(signal2, tc) 5703 { 5704 const int exitval = 5; 5705 const int sigval = SIGSTOP; 5706 const int sigmasked = SIGTRAP; 5707 pid_t child, wpid; 5708 #if defined(TWAIT_HAVE_STATUS) 5709 int status; 5710 #endif 5711 sigset_t intmask; 5712 5713 DPRINTF("Before forking process PID=%d\n", getpid()); 5714 SYSCALL_REQUIRE((child = fork()) != -1); 5715 if (child == 0) { 5716 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 5717 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 5718 5719 sigemptyset(&intmask); 5720 sigaddset(&intmask, sigmasked); 5721 sigprocmask(SIG_BLOCK, &intmask, NULL); 5722 5723 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 5724 FORKEE_ASSERT(raise(sigval) == 0); 5725 5726 DPRINTF("Before raising %s breakpoint from child\n", 5727 strsignal(sigmasked)); 5728 FORKEE_ASSERT(raise(sigmasked) == 0); 5729 5730 DPRINTF("Before exiting of the child process\n"); 5731 _exit(exitval); 5732 } 5733 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 5734 5735 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5736 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5737 5738 validate_status_stopped(status, sigval); 5739 5740 DPRINTF("Before resuming the child process where it left off and " 5741 "without signal to be sent\n"); 5742 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 5743 5744 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5745 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5746 5747 validate_status_exited(status, exitval); 5748 5749 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5750 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 5751 } 5752 5753 ATF_TC(signal3); 5754 ATF_TC_HEAD(signal3, tc) 5755 { 5756 atf_tc_set_md_var(tc, "timeout", "5"); 5757 atf_tc_set_md_var(tc, "descr", 5758 "Verify that masking SIGTRAP in tracee does not stop tracer from " 5759 "catching software breakpoints"); 5760 } 5761 5762 ATF_TC_BODY(signal3, tc) 5763 { 5764 const int exitval = 5; 5765 const int sigval = SIGSTOP; 5766 const int sigmasked = SIGTRAP; 5767 pid_t child, wpid; 5768 #if defined(TWAIT_HAVE_STATUS) 5769 int status; 5770 #endif 5771 sigset_t intmask; 5772 5773 atf_tc_expect_fail("PR kern/51918"); 5774 5775 // This test breaks now on some ports, temporarily disable it 5776 ATF_REQUIRE(0 && "In order to get reliable failure, abort"); 5777 5778 #if defined(__sparc__) 5779 atf_tc_expect_timeout("PR kern/52167"); 5780 5781 // timeout wins, failure still valid 5782 // atf_tc_expect_fail("PR kern/51918"); 5783 #endif 5784 5785 DPRINTF("Before forking process PID=%d\n", getpid()); 5786 SYSCALL_REQUIRE((child = fork()) != -1); 5787 if (child == 0) { 5788 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 5789 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 5790 5791 sigemptyset(&intmask); 5792 sigaddset(&intmask, sigmasked); 5793 sigprocmask(SIG_BLOCK, &intmask, NULL); 5794 5795 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 5796 FORKEE_ASSERT(raise(sigval) == 0); 5797 5798 DPRINTF("Before raising software breakpoint from child\n"); 5799 5800 #ifdef PTRACE_BREAKPOINT_ASM 5801 PTRACE_BREAKPOINT_ASM; 5802 #else 5803 /* port me */ 5804 #endif 5805 5806 DPRINTF("Before exiting of the child process\n"); 5807 _exit(exitval); 5808 } 5809 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 5810 5811 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5812 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5813 5814 validate_status_stopped(status, sigval); 5815 5816 DPRINTF("Before resuming the child process where it left off and " 5817 "without signal to be sent\n"); 5818 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 5819 5820 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5821 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5822 5823 validate_status_stopped(status, sigmasked); 5824 5825 DPRINTF("Before resuming the child process where it left off and " 5826 "without signal to be sent\n"); 5827 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 5828 5829 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5830 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5831 5832 validate_status_exited(status, exitval); 5833 5834 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5835 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 5836 } 5837 5838 #if defined(PT_STEP) 5839 ATF_TC(signal4); 5840 ATF_TC_HEAD(signal4, tc) 5841 { 5842 atf_tc_set_md_var(tc, "descr", 5843 "Verify that masking SIGTRAP in tracee does not stop tracer from " 5844 "catching single step trap"); 5845 } 5846 5847 ATF_TC_BODY(signal4, tc) 5848 { 5849 const int exitval = 5; 5850 const int sigval = SIGSTOP; 5851 const int sigmasked = SIGTRAP; 5852 pid_t child, wpid; 5853 #if defined(TWAIT_HAVE_STATUS) 5854 int status; 5855 #endif 5856 sigset_t intmask; 5857 int happy; 5858 5859 #if defined(__arm__) 5860 /* PT_STEP not supported on arm 32-bit */ 5861 atf_tc_expect_fail("PR kern/51918 PR kern/52119"); 5862 #endif 5863 5864 DPRINTF("Before forking process PID=%d\n", getpid()); 5865 SYSCALL_REQUIRE((child = fork()) != -1); 5866 if (child == 0) { 5867 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 5868 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 5869 5870 happy = check_happy(100); 5871 5872 sigemptyset(&intmask); 5873 sigaddset(&intmask, sigmasked); 5874 sigprocmask(SIG_BLOCK, &intmask, NULL); 5875 5876 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 5877 FORKEE_ASSERT(raise(sigval) == 0); 5878 5879 FORKEE_ASSERT_EQ(happy, check_happy(100)); 5880 5881 DPRINTF("Before exiting of the child process\n"); 5882 _exit(exitval); 5883 } 5884 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 5885 5886 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5887 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5888 5889 validate_status_stopped(status, sigval); 5890 5891 DPRINTF("Before resuming the child process where it left off and " 5892 "without signal to be sent\n"); 5893 SYSCALL_REQUIRE(ptrace(PT_STEP, child, (void *)1, 0) != -1); 5894 5895 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5896 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5897 5898 validate_status_stopped(status, sigmasked); 5899 5900 DPRINTF("Before resuming the child process where it left off and " 5901 "without signal to be sent\n"); 5902 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 5903 5904 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5905 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5906 5907 validate_status_exited(status, exitval); 5908 5909 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5910 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 5911 } 5912 #endif 5913 5914 ATF_TC(signal5); 5915 ATF_TC_HEAD(signal5, tc) 5916 { 5917 atf_tc_set_md_var(tc, "descr", 5918 "Verify that masking SIGTRAP in tracee does not stop tracer from " 5919 "catching exec() breakpoint"); 5920 } 5921 5922 ATF_TC_BODY(signal5, tc) 5923 { 5924 const int exitval = 5; 5925 const int sigval = SIGSTOP; 5926 const int sigmasked = SIGTRAP; 5927 pid_t child, wpid; 5928 #if defined(TWAIT_HAVE_STATUS) 5929 int status; 5930 #endif 5931 sigset_t intmask; 5932 5933 atf_tc_expect_fail("wrong signal"); 5934 5935 DPRINTF("Before forking process PID=%d\n", getpid()); 5936 SYSCALL_REQUIRE((child = fork()) != -1); 5937 if (child == 0) { 5938 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 5939 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 5940 5941 sigemptyset(&intmask); 5942 sigaddset(&intmask, sigmasked); 5943 sigprocmask(SIG_BLOCK, &intmask, NULL); 5944 5945 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 5946 FORKEE_ASSERT(raise(sigval) == 0); 5947 5948 DPRINTF("Before calling execve(2) from child\n"); 5949 execlp("/bin/echo", "/bin/echo", NULL); 5950 5951 DPRINTF("Before exiting of the child process\n"); 5952 _exit(exitval); 5953 } 5954 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 5955 5956 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5957 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5958 5959 validate_status_stopped(status, sigval); 5960 5961 DPRINTF("Before resuming the child process where it left off and " 5962 "without signal to be sent\n"); 5963 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 5964 5965 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5966 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5967 5968 validate_status_stopped(status, sigmasked); 5969 5970 DPRINTF("Before resuming the child process where it left off and " 5971 "without signal to be sent\n"); 5972 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 5973 5974 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5975 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 5976 5977 validate_status_exited(status, exitval); 5978 5979 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 5980 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 5981 } 5982 5983 #if defined(TWAIT_HAVE_PID) 5984 ATF_TC(signal6); 5985 ATF_TC_HEAD(signal6, tc) 5986 { 5987 atf_tc_set_md_var(tc, "timeout", "5"); 5988 atf_tc_set_md_var(tc, "descr", 5989 "Verify that masking SIGTRAP in tracee does not stop tracer from " 5990 "catching PTRACE_FORK breakpoint"); 5991 } 5992 5993 ATF_TC_BODY(signal6, tc) 5994 { 5995 const int exitval = 5; 5996 const int exitval2 = 15; 5997 const int sigval = SIGSTOP; 5998 const int sigmasked = SIGTRAP; 5999 pid_t child, child2, wpid; 6000 #if defined(TWAIT_HAVE_STATUS) 6001 int status; 6002 #endif 6003 sigset_t intmask; 6004 ptrace_state_t state; 6005 const int slen = sizeof(state); 6006 ptrace_event_t event; 6007 const int elen = sizeof(event); 6008 6009 atf_tc_expect_timeout("PR kern/51918"); 6010 6011 DPRINTF("Before forking process PID=%d\n", getpid()); 6012 SYSCALL_REQUIRE((child = fork()) != -1); 6013 if (child == 0) { 6014 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 6015 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 6016 6017 sigemptyset(&intmask); 6018 sigaddset(&intmask, sigmasked); 6019 sigprocmask(SIG_BLOCK, &intmask, NULL); 6020 6021 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 6022 FORKEE_ASSERT(raise(sigval) == 0); 6023 6024 FORKEE_ASSERT((child2 = fork()) != -1); 6025 6026 if (child2 == 0) 6027 _exit(exitval2); 6028 6029 FORKEE_REQUIRE_SUCCESS 6030 (wpid = TWAIT_GENERIC(child2, &status, 0), child2); 6031 6032 forkee_status_exited(status, exitval2); 6033 6034 DPRINTF("Before exiting of the child process\n"); 6035 _exit(exitval); 6036 } 6037 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 6038 6039 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6040 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6041 6042 validate_status_stopped(status, sigval); 6043 6044 DPRINTF("Enable PTRACE_FORK in EVENT_MASK for the child %d\n", child); 6045 event.pe_set_event = PTRACE_FORK; 6046 SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1); 6047 6048 DPRINTF("Before resuming the child process where it left off and " 6049 "without signal to be sent\n"); 6050 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 6051 6052 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6053 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6054 6055 validate_status_stopped(status, sigmasked); 6056 6057 SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child, &state, slen) != -1); 6058 ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_FORK); 6059 6060 child2 = state.pe_other_pid; 6061 DPRINTF("Reported PTRACE_FORK event with forkee %d\n", child2); 6062 6063 DPRINTF("Before calling %s() for the child2\n", TWAIT_FNAME); 6064 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child2, &status, 0), 6065 child2); 6066 6067 validate_status_stopped(status, SIGTRAP); 6068 6069 SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child2, &state, slen) != -1); 6070 ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_FORK); 6071 ATF_REQUIRE_EQ(state.pe_other_pid, child); 6072 6073 DPRINTF("Before resuming the forkee process where it left off and " 6074 "without signal to be sent\n"); 6075 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child2, (void *)1, 0) != -1); 6076 6077 DPRINTF("Before resuming the child process where it left off and " 6078 "without signal to be sent\n"); 6079 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 6080 6081 DPRINTF("Before calling %s() for the forkee - expected exited\n", 6082 TWAIT_FNAME); 6083 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child2, &status, 0), 6084 child2); 6085 6086 validate_status_exited(status, exitval2); 6087 6088 DPRINTF("Before calling %s() for the forkee - expected no process\n", 6089 TWAIT_FNAME); 6090 TWAIT_REQUIRE_FAILURE(ECHILD, 6091 wpid = TWAIT_GENERIC(child2, &status, 0)); 6092 6093 DPRINTF("Before calling %s() for the child - expected stopped " 6094 "SIGCHLD\n", TWAIT_FNAME); 6095 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6096 6097 validate_status_stopped(status, SIGCHLD); 6098 6099 DPRINTF("Before resuming the child process where it left off and " 6100 "without signal to be sent\n"); 6101 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 6102 6103 DPRINTF("Before calling %s() for the child - expected exited\n", 6104 TWAIT_FNAME); 6105 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6106 6107 validate_status_exited(status, exitval); 6108 6109 DPRINTF("Before calling %s() for the child - expected no process\n", 6110 TWAIT_FNAME); 6111 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 6112 } 6113 #endif 6114 6115 #if defined(TWAIT_HAVE_PID) 6116 ATF_TC(signal7); 6117 ATF_TC_HEAD(signal7, tc) 6118 { 6119 atf_tc_set_md_var(tc, "descr", 6120 "Verify that masking SIGTRAP in tracee does not stop tracer from " 6121 "catching PTRACE_VFORK breakpoint"); 6122 } 6123 6124 ATF_TC_BODY(signal7, tc) 6125 { 6126 const int exitval = 5; 6127 const int exitval2 = 15; 6128 const int sigval = SIGSTOP; 6129 const int sigmasked = SIGTRAP; 6130 pid_t child, child2, wpid; 6131 #if defined(TWAIT_HAVE_STATUS) 6132 int status; 6133 #endif 6134 sigset_t intmask; 6135 ptrace_state_t state; 6136 const int slen = sizeof(state); 6137 ptrace_event_t event; 6138 const int elen = sizeof(event); 6139 6140 atf_tc_expect_fail("PR kern/51918 PR kern/51630"); 6141 6142 DPRINTF("Before forking process PID=%d\n", getpid()); 6143 SYSCALL_REQUIRE((child = fork()) != -1); 6144 if (child == 0) { 6145 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 6146 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 6147 6148 sigemptyset(&intmask); 6149 sigaddset(&intmask, sigmasked); 6150 sigprocmask(SIG_BLOCK, &intmask, NULL); 6151 6152 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 6153 FORKEE_ASSERT(raise(sigval) == 0); 6154 6155 FORKEE_ASSERT((child2 = fork()) != -1); 6156 6157 if (child2 == 0) 6158 _exit(exitval2); 6159 6160 FORKEE_REQUIRE_SUCCESS 6161 (wpid = TWAIT_GENERIC(child2, &status, 0), child2); 6162 6163 forkee_status_exited(status, exitval2); 6164 6165 DPRINTF("Before exiting of the child process\n"); 6166 _exit(exitval); 6167 } 6168 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 6169 6170 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6171 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6172 6173 validate_status_stopped(status, sigval); 6174 6175 DPRINTF("Enable PTRACE_VFORK in EVENT_MASK for the child %d\n", child); 6176 event.pe_set_event = PTRACE_VFORK; 6177 SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1 || errno == ENOTSUP); 6178 6179 DPRINTF("Before resuming the child process where it left off and " 6180 "without signal to be sent\n"); 6181 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 6182 6183 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6184 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6185 6186 validate_status_stopped(status, sigmasked); 6187 6188 SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child, &state, slen) != -1); 6189 ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_VFORK); 6190 6191 child2 = state.pe_other_pid; 6192 DPRINTF("Reported PTRACE_VFORK event with forkee %d\n", child2); 6193 6194 DPRINTF("Before calling %s() for the child2\n", TWAIT_FNAME); 6195 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child2, &status, 0), 6196 child2); 6197 6198 validate_status_stopped(status, SIGTRAP); 6199 6200 SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child2, &state, slen) != -1); 6201 ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_VFORK); 6202 ATF_REQUIRE_EQ(state.pe_other_pid, child); 6203 6204 DPRINTF("Before resuming the forkee process where it left off and " 6205 "without signal to be sent\n"); 6206 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child2, (void *)1, 0) != -1); 6207 6208 DPRINTF("Before resuming the child process where it left off and " 6209 "without signal to be sent\n"); 6210 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 6211 6212 DPRINTF("Before calling %s() for the forkee - expected exited\n", 6213 TWAIT_FNAME); 6214 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child2, &status, 0), 6215 child2); 6216 6217 validate_status_exited(status, exitval2); 6218 6219 DPRINTF("Before calling %s() for the forkee - expected no process\n", 6220 TWAIT_FNAME); 6221 TWAIT_REQUIRE_FAILURE(ECHILD, 6222 wpid = TWAIT_GENERIC(child2, &status, 0)); 6223 6224 DPRINTF("Before calling %s() for the child - expected stopped " 6225 "SIGCHLD\n", TWAIT_FNAME); 6226 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6227 6228 validate_status_stopped(status, SIGCHLD); 6229 6230 DPRINTF("Before resuming the child process where it left off and " 6231 "without signal to be sent\n"); 6232 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 6233 6234 DPRINTF("Before calling %s() for the child - expected exited\n", 6235 TWAIT_FNAME); 6236 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6237 6238 validate_status_exited(status, exitval); 6239 6240 DPRINTF("Before calling %s() for the child - expected no process\n", 6241 TWAIT_FNAME); 6242 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 6243 } 6244 #endif 6245 6246 ATF_TC(signal8); 6247 ATF_TC_HEAD(signal8, tc) 6248 { 6249 atf_tc_set_md_var(tc, "descr", 6250 "Verify that masking SIGTRAP in tracee does not stop tracer from " 6251 "catching PTRACE_VFORK_DONE breakpoint"); 6252 } 6253 6254 ATF_TC_BODY(signal8, tc) 6255 { 6256 const int exitval = 5; 6257 const int exitval2 = 15; 6258 const int sigval = SIGSTOP; 6259 const int sigmasked = SIGTRAP; 6260 pid_t child, child2, wpid; 6261 #if defined(TWAIT_HAVE_STATUS) 6262 int status; 6263 #endif 6264 sigset_t intmask; 6265 ptrace_state_t state; 6266 const int slen = sizeof(state); 6267 ptrace_event_t event; 6268 const int elen = sizeof(event); 6269 6270 atf_tc_expect_fail("PR kern/51918"); 6271 6272 DPRINTF("Before forking process PID=%d\n", getpid()); 6273 SYSCALL_REQUIRE((child = fork()) != -1); 6274 if (child == 0) { 6275 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 6276 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 6277 6278 sigemptyset(&intmask); 6279 sigaddset(&intmask, sigmasked); 6280 sigprocmask(SIG_BLOCK, &intmask, NULL); 6281 6282 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 6283 FORKEE_ASSERT(raise(sigval) == 0); 6284 6285 FORKEE_ASSERT((child2 = vfork()) != -1); 6286 6287 if (child2 == 0) 6288 _exit(exitval2); 6289 6290 FORKEE_REQUIRE_SUCCESS 6291 (wpid = TWAIT_GENERIC(child2, &status, 0), child2); 6292 6293 forkee_status_exited(status, exitval2); 6294 6295 DPRINTF("Before exiting of the child process\n"); 6296 _exit(exitval); 6297 } 6298 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 6299 6300 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6301 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6302 6303 validate_status_stopped(status, sigval); 6304 6305 DPRINTF("Enable PTRACE_VFORK_DONE in EVENT_MASK for the child %d\n", 6306 child); 6307 event.pe_set_event = PTRACE_VFORK_DONE; 6308 SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1); 6309 6310 DPRINTF("Before resuming the child process where it left off and " 6311 "without signal to be sent\n"); 6312 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 6313 6314 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6315 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6316 6317 validate_status_stopped(status, sigmasked); 6318 6319 SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child, &state, slen) != -1); 6320 ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_VFORK_DONE); 6321 6322 child2 = state.pe_other_pid; 6323 DPRINTF("Reported PTRACE_VFORK_DONE event with forkee %d\n", child2); 6324 6325 DPRINTF("Before resuming the child process where it left off and " 6326 "without signal to be sent\n"); 6327 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 6328 6329 DPRINTF("Before calling %s() for the child - expected stopped " 6330 "SIGCHLD\n", TWAIT_FNAME); 6331 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6332 6333 validate_status_stopped(status, SIGCHLD); 6334 6335 DPRINTF("Before resuming the child process where it left off and " 6336 "without signal to be sent\n"); 6337 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 6338 6339 DPRINTF("Before calling %s() for the child - expected exited\n", 6340 TWAIT_FNAME); 6341 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6342 6343 validate_status_exited(status, exitval); 6344 6345 DPRINTF("Before calling %s() for the child - expected no process\n", 6346 TWAIT_FNAME); 6347 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 6348 } 6349 6350 ATF_TC(signal9); 6351 ATF_TC_HEAD(signal9, tc) 6352 { 6353 atf_tc_set_md_var(tc, "descr", 6354 "Verify that masking SIGTRAP in tracee does not stop tracer from " 6355 "catching PTRACE_LWP_CREATE breakpoint"); 6356 } 6357 6358 ATF_TC_BODY(signal9, tc) 6359 { 6360 const int exitval = 5; 6361 const int sigval = SIGSTOP; 6362 const int sigmasked = SIGTRAP; 6363 pid_t child, wpid; 6364 #if defined(TWAIT_HAVE_STATUS) 6365 int status; 6366 #endif 6367 sigset_t intmask; 6368 ptrace_state_t state; 6369 const int slen = sizeof(state); 6370 ptrace_event_t event; 6371 const int elen = sizeof(event); 6372 ucontext_t uc; 6373 lwpid_t lid; 6374 static const size_t ssize = 16*1024; 6375 void *stack; 6376 6377 atf_tc_expect_fail("PR kern/51918"); 6378 6379 DPRINTF("Before forking process PID=%d\n", getpid()); 6380 SYSCALL_REQUIRE((child = fork()) != -1); 6381 if (child == 0) { 6382 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 6383 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 6384 6385 sigemptyset(&intmask); 6386 sigaddset(&intmask, sigmasked); 6387 sigprocmask(SIG_BLOCK, &intmask, NULL); 6388 6389 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 6390 FORKEE_ASSERT(raise(sigval) == 0); 6391 6392 DPRINTF("Before allocating memory for stack in child\n"); 6393 FORKEE_ASSERT((stack = malloc(ssize)) != NULL); 6394 6395 DPRINTF("Before making context for new lwp in child\n"); 6396 _lwp_makecontext(&uc, lwp_main_func, NULL, NULL, stack, ssize); 6397 6398 DPRINTF("Before creating new in child\n"); 6399 FORKEE_ASSERT(_lwp_create(&uc, 0, &lid) == 0); 6400 6401 DPRINTF("Before waiting for lwp %d to exit\n", lid); 6402 FORKEE_ASSERT(_lwp_wait(lid, NULL) == 0); 6403 6404 DPRINTF("Before verifying that reported %d and running lid %d " 6405 "are the same\n", lid, the_lwp_id); 6406 FORKEE_ASSERT_EQ(lid, the_lwp_id); 6407 6408 DPRINTF("Before exiting of the child process\n"); 6409 _exit(exitval); 6410 } 6411 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 6412 6413 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6414 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6415 6416 validate_status_stopped(status, sigval); 6417 6418 DPRINTF("Set empty EVENT_MASK for the child %d\n", child); 6419 event.pe_set_event = PTRACE_LWP_CREATE; 6420 SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1); 6421 6422 DPRINTF("Before resuming the child process where it left off and " 6423 "without signal to be sent\n"); 6424 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 6425 6426 DPRINTF("Before calling %s() for the child - expected stopped " 6427 "SIGTRAP\n", TWAIT_FNAME); 6428 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6429 6430 validate_status_stopped(status, sigmasked); 6431 6432 SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child, &state, slen) != -1); 6433 6434 ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_LWP_CREATE); 6435 6436 lid = state.pe_lwp; 6437 DPRINTF("Reported PTRACE_LWP_CREATE event with lid %d\n", lid); 6438 6439 DPRINTF("Before resuming the child process where it left off and " 6440 "without signal to be sent\n"); 6441 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 6442 6443 DPRINTF("Before calling %s() for the child - expected exited\n", 6444 TWAIT_FNAME); 6445 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6446 6447 validate_status_exited(status, exitval); 6448 6449 DPRINTF("Before calling %s() for the child - expected no process\n", 6450 TWAIT_FNAME); 6451 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 6452 } 6453 6454 ATF_TC(signal10); 6455 ATF_TC_HEAD(signal10, tc) 6456 { 6457 atf_tc_set_md_var(tc, "descr", 6458 "Verify that masking SIGTRAP in tracee does not stop tracer from " 6459 "catching PTRACE_LWP_EXIT breakpoint"); 6460 } 6461 6462 ATF_TC_BODY(signal10, tc) 6463 { 6464 const int exitval = 5; 6465 const int sigval = SIGSTOP; 6466 const int sigmasked = SIGTRAP; 6467 pid_t child, wpid; 6468 #if defined(TWAIT_HAVE_STATUS) 6469 int status; 6470 #endif 6471 sigset_t intmask; 6472 ptrace_state_t state; 6473 const int slen = sizeof(state); 6474 ptrace_event_t event; 6475 const int elen = sizeof(event); 6476 ucontext_t uc; 6477 lwpid_t lid; 6478 static const size_t ssize = 16*1024; 6479 void *stack; 6480 6481 atf_tc_expect_fail("PR kern/51918"); 6482 6483 DPRINTF("Before forking process PID=%d\n", getpid()); 6484 SYSCALL_REQUIRE((child = fork()) != -1); 6485 if (child == 0) { 6486 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 6487 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 6488 6489 sigemptyset(&intmask); 6490 sigaddset(&intmask, sigmasked); 6491 sigprocmask(SIG_BLOCK, &intmask, NULL); 6492 6493 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 6494 FORKEE_ASSERT(raise(sigval) == 0); 6495 6496 DPRINTF("Before allocating memory for stack in child\n"); 6497 FORKEE_ASSERT((stack = malloc(ssize)) != NULL); 6498 6499 DPRINTF("Before making context for new lwp in child\n"); 6500 _lwp_makecontext(&uc, lwp_main_func, NULL, NULL, stack, ssize); 6501 6502 DPRINTF("Before creating new in child\n"); 6503 FORKEE_ASSERT(_lwp_create(&uc, 0, &lid) == 0); 6504 6505 DPRINTF("Before waiting for lwp %d to exit\n", lid); 6506 FORKEE_ASSERT(_lwp_wait(lid, NULL) == 0); 6507 6508 DPRINTF("Before verifying that reported %d and running lid %d " 6509 "are the same\n", lid, the_lwp_id); 6510 FORKEE_ASSERT_EQ(lid, the_lwp_id); 6511 6512 DPRINTF("Before exiting of the child process\n"); 6513 _exit(exitval); 6514 } 6515 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 6516 6517 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6518 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6519 6520 validate_status_stopped(status, sigval); 6521 6522 DPRINTF("Set empty EVENT_MASK for the child %d\n", child); 6523 event.pe_set_event = PTRACE_LWP_EXIT; 6524 SYSCALL_REQUIRE(ptrace(PT_SET_EVENT_MASK, child, &event, elen) != -1); 6525 6526 DPRINTF("Before resuming the child process where it left off and " 6527 "without signal to be sent\n"); 6528 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 6529 6530 DPRINTF("Before calling %s() for the child - expected stopped " 6531 "SIGTRAP\n", TWAIT_FNAME); 6532 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6533 6534 validate_status_stopped(status, sigmasked); 6535 6536 SYSCALL_REQUIRE(ptrace(PT_GET_PROCESS_STATE, child, &state, slen) != -1); 6537 6538 ATF_REQUIRE_EQ(state.pe_report_event, PTRACE_LWP_EXIT); 6539 6540 lid = state.pe_lwp; 6541 DPRINTF("Reported PTRACE_LWP_EXIT event with lid %d\n", lid); 6542 6543 DPRINTF("Before resuming the child process where it left off and " 6544 "without signal to be sent\n"); 6545 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 6546 6547 DPRINTF("Before calling %s() for the child - expected exited\n", 6548 TWAIT_FNAME); 6549 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6550 6551 validate_status_exited(status, exitval); 6552 6553 DPRINTF("Before calling %s() for the child - expected no process\n", 6554 TWAIT_FNAME); 6555 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 6556 } 6557 6558 ATF_TC(getsigmask1); 6559 ATF_TC_HEAD(getsigmask1, tc) 6560 { 6561 atf_tc_set_md_var(tc, "descr", 6562 "Verify that plain PT_SET_SIGMASK can be called"); 6563 } 6564 6565 ATF_TC_BODY(getsigmask1, tc) 6566 { 6567 const int exitval = 5; 6568 const int sigval = SIGSTOP; 6569 pid_t child, wpid; 6570 #if defined(TWAIT_HAVE_STATUS) 6571 int status; 6572 #endif 6573 sigset_t mask; 6574 6575 DPRINTF("Before forking process PID=%d\n", getpid()); 6576 SYSCALL_REQUIRE((child = fork()) != -1); 6577 if (child == 0) { 6578 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 6579 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 6580 6581 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 6582 FORKEE_ASSERT(raise(sigval) == 0); 6583 6584 DPRINTF("Before exiting of the child process\n"); 6585 _exit(exitval); 6586 } 6587 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 6588 6589 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6590 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6591 6592 validate_status_stopped(status, sigval); 6593 6594 DPRINTF("Before calling PT_GET_SIGMASK\n"); 6595 SYSCALL_REQUIRE(ptrace(PT_GET_SIGMASK, child, &mask, 0) != -1); 6596 6597 DPRINTF("Before resuming the child process where it left off and " 6598 "without signal to be sent\n"); 6599 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 6600 6601 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6602 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6603 6604 validate_status_exited(status, exitval); 6605 6606 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6607 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 6608 } 6609 6610 ATF_TC(getsigmask2); 6611 ATF_TC_HEAD(getsigmask2, tc) 6612 { 6613 atf_tc_set_md_var(tc, "descr", 6614 "Verify that PT_SET_SIGMASK reports correct mask from tracee"); 6615 } 6616 6617 ATF_TC_BODY(getsigmask2, tc) 6618 { 6619 const int exitval = 5; 6620 const int sigval = SIGSTOP; 6621 const int sigmasked = SIGTRAP; 6622 pid_t child, wpid; 6623 #if defined(TWAIT_HAVE_STATUS) 6624 int status; 6625 #endif 6626 sigset_t mask; 6627 sigset_t expected_mask; 6628 ATF_REQUIRE(sigemptyset(&mask) == 0); 6629 ATF_REQUIRE(sigemptyset(&expected_mask) == 0); 6630 ATF_REQUIRE(sigaddset(&expected_mask, sigmasked) == 0); 6631 6632 DPRINTF("Before forking process PID=%d\n", getpid()); 6633 SYSCALL_REQUIRE((child = fork()) != -1); 6634 if (child == 0) { 6635 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 6636 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 6637 6638 sigaddset(&mask, sigmasked); 6639 sigprocmask(SIG_BLOCK, &mask, NULL); 6640 6641 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 6642 FORKEE_ASSERT(raise(sigval) == 0); 6643 6644 DPRINTF("Before exiting of the child process\n"); 6645 _exit(exitval); 6646 } 6647 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 6648 6649 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6650 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6651 6652 validate_status_stopped(status, sigval); 6653 6654 DPRINTF("Before calling PT_GET_SIGMASK\n"); 6655 SYSCALL_REQUIRE(ptrace(PT_GET_SIGMASK, child, &mask, 0) != -1); 6656 6657 ATF_REQUIRE(memcmp(&mask, &expected_mask, sizeof(sigset_t)) == 0); 6658 6659 DPRINTF("Before resuming the child process where it left off and " 6660 "without signal to be sent\n"); 6661 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 6662 6663 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6664 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6665 6666 validate_status_exited(status, exitval); 6667 6668 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6669 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 6670 } 6671 6672 ATF_TC(setsigmask1); 6673 ATF_TC_HEAD(setsigmask1, tc) 6674 { 6675 atf_tc_set_md_var(tc, "descr", 6676 "Verify that plain PT_SET_SIGMASK can be called with empty mask"); 6677 } 6678 6679 ATF_TC_BODY(setsigmask1, tc) 6680 { 6681 const int exitval = 5; 6682 const int sigval = SIGSTOP; 6683 pid_t child, wpid; 6684 #if defined(TWAIT_HAVE_STATUS) 6685 int status; 6686 #endif 6687 sigset_t mask; 6688 ATF_REQUIRE(sigemptyset(&mask) == 0); 6689 6690 DPRINTF("Before forking process PID=%d\n", getpid()); 6691 SYSCALL_REQUIRE((child = fork()) != -1); 6692 if (child == 0) { 6693 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 6694 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 6695 6696 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 6697 FORKEE_ASSERT(raise(sigval) == 0); 6698 6699 DPRINTF("Before exiting of the child process\n"); 6700 _exit(exitval); 6701 } 6702 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 6703 6704 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6705 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6706 6707 validate_status_stopped(status, sigval); 6708 6709 DPRINTF("Before calling PT_SET_SIGMASK for empty mask\n"); 6710 SYSCALL_REQUIRE(ptrace(PT_SET_SIGMASK, child, &mask, 0) != -1); 6711 6712 DPRINTF("Before resuming the child process where it left off and " 6713 "without signal to be sent\n"); 6714 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 6715 6716 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6717 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6718 6719 validate_status_exited(status, exitval); 6720 6721 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6722 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 6723 } 6724 6725 ATF_TC(setsigmask2); 6726 ATF_TC_HEAD(setsigmask2, tc) 6727 { 6728 atf_tc_set_md_var(tc, "descr", 6729 "Verify that sigmask is preserved between PT_GET_SIGMASK and " 6730 "PT_SET_SIGMASK"); 6731 } 6732 6733 ATF_TC_BODY(setsigmask2, tc) 6734 { 6735 const int exitval = 5; 6736 const int sigval = SIGSTOP; 6737 pid_t child, wpid; 6738 #if defined(TWAIT_HAVE_STATUS) 6739 int status; 6740 #endif 6741 sigset_t new_mask; 6742 sigset_t mask; 6743 ATF_REQUIRE(sigemptyset(&new_mask) == 0); 6744 ATF_REQUIRE(sigemptyset(&mask) == 0); 6745 ATF_REQUIRE(sigaddset(&mask, SIGINT) == 0); 6746 6747 DPRINTF("Before forking process PID=%d\n", getpid()); 6748 SYSCALL_REQUIRE((child = fork()) != -1); 6749 if (child == 0) { 6750 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 6751 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 6752 6753 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 6754 FORKEE_ASSERT(raise(sigval) == 0); 6755 6756 DPRINTF("Before exiting of the child process\n"); 6757 _exit(exitval); 6758 } 6759 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 6760 6761 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6762 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6763 6764 validate_status_stopped(status, sigval); 6765 6766 DPRINTF("Before calling PT_SET_SIGMASK for new mask with SIGINT\n"); 6767 SYSCALL_REQUIRE(ptrace(PT_SET_SIGMASK, child, &mask, 0) != -1); 6768 6769 DPRINTF("Before calling PT_GET_SIGMASK to store it in new_mask\n"); 6770 SYSCALL_REQUIRE(ptrace(PT_GET_SIGMASK, child, &new_mask, 0) != -1); 6771 6772 ATF_REQUIRE(memcmp(&mask, &new_mask, sizeof(sigset_t)) == 0); 6773 6774 DPRINTF("Before resuming the child process where it left off and " 6775 "without signal to be sent\n"); 6776 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 6777 6778 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6779 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6780 6781 validate_status_exited(status, exitval); 6782 6783 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6784 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 6785 } 6786 6787 ATF_TC(setsigmask3); 6788 ATF_TC_HEAD(setsigmask3, tc) 6789 { 6790 atf_tc_set_md_var(tc, "descr", 6791 "Verify that sigmask is preserved between PT_GET_SIGMASK, process " 6792 "resumed and PT_SET_SIGMASK"); 6793 } 6794 6795 ATF_TC_BODY(setsigmask3, tc) 6796 { 6797 const int exitval = 5; 6798 const int sigval = SIGSTOP; 6799 pid_t child, wpid; 6800 #if defined(TWAIT_HAVE_STATUS) 6801 int status; 6802 #endif 6803 sigset_t new_mask; 6804 sigset_t mask; 6805 ATF_REQUIRE(sigemptyset(&new_mask) == 0); 6806 ATF_REQUIRE(sigemptyset(&mask) == 0); 6807 ATF_REQUIRE(sigaddset(&mask, SIGINT) == 0); 6808 6809 DPRINTF("Before forking process PID=%d\n", getpid()); 6810 SYSCALL_REQUIRE((child = fork()) != -1); 6811 if (child == 0) { 6812 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 6813 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 6814 6815 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 6816 FORKEE_ASSERT(raise(sigval) == 0); 6817 6818 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 6819 FORKEE_ASSERT(raise(sigval) == 0); 6820 6821 DPRINTF("Before exiting of the child process\n"); 6822 _exit(exitval); 6823 } 6824 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 6825 6826 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6827 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6828 6829 validate_status_stopped(status, sigval); 6830 6831 DPRINTF("Before calling PT_SET_SIGMASK for new mask with SIGINT\n"); 6832 SYSCALL_REQUIRE(ptrace(PT_SET_SIGMASK, child, &mask, 0) != -1); 6833 6834 DPRINTF("Before resuming the child process where it left off and " 6835 "without signal to be sent\n"); 6836 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 6837 6838 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6839 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6840 6841 validate_status_stopped(status, sigval); 6842 6843 DPRINTF("Before calling PT_GET_SIGMASK to store it in new_mask\n"); 6844 SYSCALL_REQUIRE(ptrace(PT_GET_SIGMASK, child, &new_mask, 0) != -1); 6845 6846 ATF_REQUIRE(memcmp(&mask, &new_mask, sizeof(sigset_t)) == 0); 6847 6848 DPRINTF("Before resuming the child process where it left off and " 6849 "without signal to be sent\n"); 6850 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 6851 6852 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6853 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6854 6855 validate_status_exited(status, exitval); 6856 6857 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6858 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 6859 } 6860 6861 ATF_TC(setsigmask4); 6862 ATF_TC_HEAD(setsigmask4, tc) 6863 { 6864 atf_tc_set_md_var(tc, "descr", 6865 "Verify that new sigmask is visible in tracee"); 6866 } 6867 6868 ATF_TC_BODY(setsigmask4, tc) 6869 { 6870 const int exitval = 5; 6871 const int sigval = SIGSTOP; 6872 pid_t child, wpid; 6873 #if defined(TWAIT_HAVE_STATUS) 6874 int status; 6875 #endif 6876 sigset_t mask; 6877 sigset_t expected_mask; 6878 ATF_REQUIRE(sigemptyset(&mask) == 0); 6879 ATF_REQUIRE(sigemptyset(&expected_mask) == 0); 6880 ATF_REQUIRE(sigaddset(&expected_mask, SIGINT) == 0); 6881 6882 DPRINTF("Before forking process PID=%d\n", getpid()); 6883 SYSCALL_REQUIRE((child = fork()) != -1); 6884 if (child == 0) { 6885 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 6886 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 6887 6888 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 6889 FORKEE_ASSERT(raise(sigval) == 0); 6890 6891 sigprocmask(0, NULL, &mask); 6892 6893 FORKEE_ASSERT 6894 (memcmp(&mask, &expected_mask, sizeof(sigset_t)) == 0); 6895 6896 DPRINTF("Before exiting of the child process\n"); 6897 _exit(exitval); 6898 } 6899 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 6900 6901 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6902 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6903 6904 validate_status_stopped(status, sigval); 6905 6906 DPRINTF("Before calling PT_SET_SIGMASK for new mask with SIGINT\n"); 6907 SYSCALL_REQUIRE(ptrace(PT_SET_SIGMASK, child, &expected_mask, 0) != -1); 6908 6909 DPRINTF("Before resuming the child process where it left off and " 6910 "without signal to be sent\n"); 6911 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 6912 6913 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6914 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6915 6916 validate_status_exited(status, exitval); 6917 6918 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6919 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 6920 } 6921 6922 ATF_TC(setsigmask5); 6923 ATF_TC_HEAD(setsigmask5, tc) 6924 { 6925 atf_tc_set_md_var(tc, "descr", 6926 "Verify that sigmask cannot be set to SIGKILL"); 6927 } 6928 6929 ATF_TC_BODY(setsigmask5, tc) 6930 { 6931 const int exitval = 5; 6932 const int sigval = SIGSTOP; 6933 pid_t child, wpid; 6934 #if defined(TWAIT_HAVE_STATUS) 6935 int status; 6936 #endif 6937 sigset_t new_mask; 6938 sigset_t mask; 6939 ATF_REQUIRE(sigemptyset(&new_mask) == 0); 6940 ATF_REQUIRE(sigemptyset(&mask) == 0); 6941 ATF_REQUIRE(sigaddset(&mask, SIGKILL) == 0); 6942 6943 DPRINTF("Before forking process PID=%d\n", getpid()); 6944 SYSCALL_REQUIRE((child = fork()) != -1); 6945 if (child == 0) { 6946 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 6947 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 6948 6949 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 6950 FORKEE_ASSERT(raise(sigval) == 0); 6951 6952 DPRINTF("Before exiting of the child process\n"); 6953 _exit(exitval); 6954 } 6955 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 6956 6957 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6958 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6959 6960 validate_status_stopped(status, sigval); 6961 6962 DPRINTF("Before calling PT_SET_SIGMASK for new mask with SIGINT\n"); 6963 SYSCALL_REQUIRE(ptrace(PT_SET_SIGMASK, child, &mask, 0) != -1); 6964 6965 DPRINTF("Before calling PT_GET_SIGMASK to store it in new_mask\n"); 6966 SYSCALL_REQUIRE(ptrace(PT_GET_SIGMASK, child, &new_mask, 0) != -1); 6967 6968 ATF_REQUIRE(memcmp(&mask, &new_mask, sizeof(sigset_t)) != 0); 6969 6970 DPRINTF("Before resuming the child process where it left off and " 6971 "without signal to be sent\n"); 6972 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 6973 6974 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6975 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 6976 6977 validate_status_exited(status, exitval); 6978 6979 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 6980 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 6981 } 6982 6983 ATF_TC(setsigmask6); 6984 ATF_TC_HEAD(setsigmask6, tc) 6985 { 6986 atf_tc_set_md_var(tc, "descr", 6987 "Verify that sigmask cannot be set to SIGSTOP"); 6988 } 6989 6990 ATF_TC_BODY(setsigmask6, tc) 6991 { 6992 const int exitval = 5; 6993 const int sigval = SIGSTOP; 6994 pid_t child, wpid; 6995 #if defined(TWAIT_HAVE_STATUS) 6996 int status; 6997 #endif 6998 sigset_t new_mask; 6999 sigset_t mask; 7000 ATF_REQUIRE(sigemptyset(&new_mask) == 0); 7001 ATF_REQUIRE(sigemptyset(&mask) == 0); 7002 ATF_REQUIRE(sigaddset(&mask, SIGSTOP) == 0); 7003 7004 DPRINTF("Before forking process PID=%d\n", getpid()); 7005 SYSCALL_REQUIRE((child = fork()) != -1); 7006 if (child == 0) { 7007 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 7008 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 7009 7010 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 7011 FORKEE_ASSERT(raise(sigval) == 0); 7012 7013 DPRINTF("Before exiting of the child process\n"); 7014 _exit(exitval); 7015 } 7016 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 7017 7018 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 7019 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 7020 7021 validate_status_stopped(status, sigval); 7022 7023 DPRINTF("Before calling PT_SET_SIGMASK for new mask with SIGINT\n"); 7024 SYSCALL_REQUIRE(ptrace(PT_SET_SIGMASK, child, &mask, 0) != -1); 7025 7026 DPRINTF("Before calling PT_GET_SIGMASK to store it in new_mask\n"); 7027 SYSCALL_REQUIRE(ptrace(PT_GET_SIGMASK, child, &new_mask, 0) != -1); 7028 7029 ATF_REQUIRE(memcmp(&mask, &new_mask, sizeof(sigset_t)) != 0); 7030 7031 DPRINTF("Before resuming the child process where it left off and " 7032 "without signal to be sent\n"); 7033 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 7034 7035 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 7036 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 7037 7038 validate_status_exited(status, exitval); 7039 7040 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 7041 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 7042 } 7043 7044 static void 7045 lwp_main_stop(void *arg) 7046 { 7047 the_lwp_id = _lwp_self(); 7048 7049 raise(SIGTRAP); 7050 7051 _lwp_exit(); 7052 } 7053 7054 ATF_TC(suspend1); 7055 ATF_TC_HEAD(suspend1, tc) 7056 { 7057 atf_tc_set_md_var(tc, "descr", 7058 "Verify that a thread can be suspended by a debugger and later " 7059 "resumed by a tracee"); 7060 } 7061 7062 ATF_TC_BODY(suspend1, tc) 7063 { 7064 const int exitval = 5; 7065 const int sigval = SIGSTOP; 7066 pid_t child, wpid; 7067 #if defined(TWAIT_HAVE_STATUS) 7068 int status; 7069 #endif 7070 ucontext_t uc; 7071 lwpid_t lid; 7072 static const size_t ssize = 16*1024; 7073 void *stack; 7074 struct ptrace_lwpinfo pl; 7075 struct ptrace_siginfo psi; 7076 volatile int go = 0; 7077 7078 // Feature pending for refactoring 7079 atf_tc_expect_fail("PR kern/51995"); 7080 7081 // Hangs with qemu 7082 ATF_REQUIRE(0 && "In order to get reliable failure, abort"); 7083 7084 DPRINTF("Before forking process PID=%d\n", getpid()); 7085 SYSCALL_REQUIRE((child = fork()) != -1); 7086 if (child == 0) { 7087 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 7088 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 7089 7090 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 7091 FORKEE_ASSERT(raise(sigval) == 0); 7092 7093 DPRINTF("Before allocating memory for stack in child\n"); 7094 FORKEE_ASSERT((stack = malloc(ssize)) != NULL); 7095 7096 DPRINTF("Before making context for new lwp in child\n"); 7097 _lwp_makecontext(&uc, lwp_main_stop, NULL, NULL, stack, ssize); 7098 7099 DPRINTF("Before creating new in child\n"); 7100 FORKEE_ASSERT(_lwp_create(&uc, 0, &lid) == 0); 7101 7102 while (go == 0) 7103 continue; 7104 7105 raise(SIGINT); 7106 7107 FORKEE_ASSERT(_lwp_continue(lid) == 0); 7108 7109 DPRINTF("Before waiting for lwp %d to exit\n", lid); 7110 FORKEE_ASSERT(_lwp_wait(lid, NULL) == 0); 7111 7112 DPRINTF("Before verifying that reported %d and running lid %d " 7113 "are the same\n", lid, the_lwp_id); 7114 FORKEE_ASSERT_EQ(lid, the_lwp_id); 7115 7116 DPRINTF("Before exiting of the child process\n"); 7117 _exit(exitval); 7118 } 7119 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 7120 7121 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 7122 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 7123 7124 validate_status_stopped(status, sigval); 7125 7126 DPRINTF("Before resuming the child process where it left off and " 7127 "without signal to be sent\n"); 7128 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 7129 7130 DPRINTF("Before calling %s() for the child - expected stopped " 7131 "SIGTRAP\n", TWAIT_FNAME); 7132 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 7133 7134 validate_status_stopped(status, SIGTRAP); 7135 7136 DPRINTF("Before reading siginfo and lwpid_t\n"); 7137 SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &psi, sizeof(psi)) != -1); 7138 7139 DPRINTF("Before suspending LWP %d\n", psi.psi_lwpid); 7140 SYSCALL_REQUIRE(ptrace(PT_SUSPEND, child, NULL, psi.psi_lwpid) != -1); 7141 7142 DPRINTF("Write new go to tracee (PID=%d) from tracer (PID=%d)\n", 7143 child, getpid()); 7144 SYSCALL_REQUIRE(ptrace(PT_WRITE_D, child, __UNVOLATILE(&go), 1) != -1); 7145 7146 DPRINTF("Before resuming the child process where it left off and " 7147 "without signal to be sent\n"); 7148 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 7149 7150 DPRINTF("Before calling %s() for the child - expected stopped " 7151 "SIGINT\n", TWAIT_FNAME); 7152 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 7153 7154 validate_status_stopped(status, SIGINT); 7155 7156 pl.pl_lwpid = 0; 7157 7158 SYSCALL_REQUIRE(ptrace(PT_LWPINFO, child, &pl, sizeof(pl)) != -1); 7159 while (pl.pl_lwpid != 0) { 7160 7161 SYSCALL_REQUIRE(ptrace(PT_LWPINFO, child, &pl, sizeof(pl)) != -1); 7162 switch (pl.pl_lwpid) { 7163 case 1: 7164 ATF_REQUIRE_EQ(pl.pl_event, PL_EVENT_SIGNAL); 7165 break; 7166 case 2: 7167 ATF_REQUIRE_EQ(pl.pl_event, PL_EVENT_SUSPENDED); 7168 break; 7169 } 7170 } 7171 7172 DPRINTF("Before resuming the child process where it left off and " 7173 "without signal to be sent\n"); 7174 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 7175 7176 DPRINTF("Before calling %s() for the child - expected exited\n", 7177 TWAIT_FNAME); 7178 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 7179 7180 validate_status_exited(status, exitval); 7181 7182 DPRINTF("Before calling %s() for the child - expected no process\n", 7183 TWAIT_FNAME); 7184 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 7185 } 7186 7187 ATF_TC(suspend2); 7188 ATF_TC_HEAD(suspend2, tc) 7189 { 7190 atf_tc_set_md_var(tc, "descr", 7191 "Verify that the while the only thread within a process is " 7192 "suspended, the whole process cannot be unstopped"); 7193 } 7194 7195 ATF_TC_BODY(suspend2, tc) 7196 { 7197 const int exitval = 5; 7198 const int sigval = SIGSTOP; 7199 pid_t child, wpid; 7200 #if defined(TWAIT_HAVE_STATUS) 7201 int status; 7202 #endif 7203 struct ptrace_siginfo psi; 7204 7205 // Feature pending for refactoring 7206 atf_tc_expect_fail("PR kern/51995"); 7207 7208 // Hangs with qemu 7209 ATF_REQUIRE(0 && "In order to get reliable failure, abort"); 7210 7211 DPRINTF("Before forking process PID=%d\n", getpid()); 7212 SYSCALL_REQUIRE((child = fork()) != -1); 7213 if (child == 0) { 7214 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 7215 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 7216 7217 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 7218 FORKEE_ASSERT(raise(sigval) == 0); 7219 7220 DPRINTF("Before exiting of the child process\n"); 7221 _exit(exitval); 7222 } 7223 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 7224 7225 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 7226 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 7227 7228 validate_status_stopped(status, sigval); 7229 7230 DPRINTF("Before reading siginfo and lwpid_t\n"); 7231 SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &psi, sizeof(psi)) != -1); 7232 7233 DPRINTF("Before suspending LWP %d\n", psi.psi_lwpid); 7234 SYSCALL_REQUIRE(ptrace(PT_SUSPEND, child, NULL, psi.psi_lwpid) != -1); 7235 7236 DPRINTF("Before resuming the child process where it left off and " 7237 "without signal to be sent\n"); 7238 ATF_REQUIRE_ERRNO(EDEADLK, 7239 ptrace(PT_CONTINUE, child, (void *)1, 0) == -1); 7240 7241 DPRINTF("Before resuming LWP %d\n", psi.psi_lwpid); 7242 SYSCALL_REQUIRE(ptrace(PT_RESUME, child, NULL, psi.psi_lwpid) != -1); 7243 7244 DPRINTF("Before resuming the child process where it left off and " 7245 "without signal to be sent\n"); 7246 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 7247 7248 DPRINTF("Before calling %s() for the child - expected exited\n", 7249 TWAIT_FNAME); 7250 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 7251 7252 validate_status_exited(status, exitval); 7253 7254 DPRINTF("Before calling %s() for the child - expected no process\n", 7255 TWAIT_FNAME); 7256 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 7257 } 7258 7259 ATF_TC(resume1); 7260 ATF_TC_HEAD(resume1, tc) 7261 { 7262 atf_tc_set_md_var(tc, "timeout", "5"); 7263 atf_tc_set_md_var(tc, "descr", 7264 "Verify that a thread can be suspended by a debugger and later " 7265 "resumed by the debugger"); 7266 } 7267 7268 ATF_TC_BODY(resume1, tc) 7269 { 7270 struct msg_fds fds; 7271 const int exitval = 5; 7272 const int sigval = SIGSTOP; 7273 pid_t child, wpid; 7274 uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */ 7275 #if defined(TWAIT_HAVE_STATUS) 7276 int status; 7277 #endif 7278 ucontext_t uc; 7279 lwpid_t lid; 7280 static const size_t ssize = 16*1024; 7281 void *stack; 7282 struct ptrace_lwpinfo pl; 7283 struct ptrace_siginfo psi; 7284 7285 // Feature pending for refactoring 7286 atf_tc_expect_fail("PR kern/51995"); 7287 7288 // Hangs with qemu 7289 ATF_REQUIRE(0 && "In order to get reliable failure, abort"); 7290 7291 SYSCALL_REQUIRE(msg_open(&fds) == 0); 7292 7293 DPRINTF("Before forking process PID=%d\n", getpid()); 7294 SYSCALL_REQUIRE((child = fork()) != -1); 7295 if (child == 0) { 7296 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 7297 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 7298 7299 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 7300 FORKEE_ASSERT(raise(sigval) == 0); 7301 7302 DPRINTF("Before allocating memory for stack in child\n"); 7303 FORKEE_ASSERT((stack = malloc(ssize)) != NULL); 7304 7305 DPRINTF("Before making context for new lwp in child\n"); 7306 _lwp_makecontext(&uc, lwp_main_stop, NULL, NULL, stack, ssize); 7307 7308 DPRINTF("Before creating new in child\n"); 7309 FORKEE_ASSERT(_lwp_create(&uc, 0, &lid) == 0); 7310 7311 CHILD_TO_PARENT("Message", fds, msg); 7312 7313 raise(SIGINT); 7314 7315 DPRINTF("Before waiting for lwp %d to exit\n", lid); 7316 FORKEE_ASSERT(_lwp_wait(lid, NULL) == 0); 7317 7318 DPRINTF("Before verifying that reported %d and running lid %d " 7319 "are the same\n", lid, the_lwp_id); 7320 FORKEE_ASSERT_EQ(lid, the_lwp_id); 7321 7322 DPRINTF("Before exiting of the child process\n"); 7323 _exit(exitval); 7324 } 7325 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 7326 7327 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 7328 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 7329 7330 validate_status_stopped(status, sigval); 7331 7332 DPRINTF("Before resuming the child process where it left off and " 7333 "without signal to be sent\n"); 7334 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 7335 7336 DPRINTF("Before calling %s() for the child - expected stopped " 7337 "SIGTRAP\n", TWAIT_FNAME); 7338 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 7339 7340 validate_status_stopped(status, SIGTRAP); 7341 7342 DPRINTF("Before reading siginfo and lwpid_t\n"); 7343 SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &psi, sizeof(psi)) != -1); 7344 7345 DPRINTF("Before suspending LWP %d\n", psi.psi_lwpid); 7346 SYSCALL_REQUIRE(ptrace(PT_SUSPEND, child, NULL, psi.psi_lwpid) != -1); 7347 7348 PARENT_FROM_CHILD("Message", fds, msg); 7349 7350 DPRINTF("Before resuming the child process where it left off and " 7351 "without signal to be sent\n"); 7352 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 7353 7354 DPRINTF("Before calling %s() for the child - expected stopped " 7355 "SIGINT\n", TWAIT_FNAME); 7356 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 7357 7358 validate_status_stopped(status, SIGINT); 7359 7360 pl.pl_lwpid = 0; 7361 7362 SYSCALL_REQUIRE(ptrace(PT_LWPINFO, child, &pl, sizeof(pl)) != -1); 7363 while (pl.pl_lwpid != 0) { 7364 SYSCALL_REQUIRE(ptrace(PT_LWPINFO, child, &pl, sizeof(pl)) != -1); 7365 switch (pl.pl_lwpid) { 7366 case 1: 7367 ATF_REQUIRE_EQ(pl.pl_event, PL_EVENT_SIGNAL); 7368 break; 7369 case 2: 7370 ATF_REQUIRE_EQ(pl.pl_event, PL_EVENT_SUSPENDED); 7371 break; 7372 } 7373 } 7374 7375 DPRINTF("Before resuming LWP %d\n", psi.psi_lwpid); 7376 SYSCALL_REQUIRE(ptrace(PT_RESUME, child, NULL, psi.psi_lwpid) != -1); 7377 7378 DPRINTF("Before resuming the child process where it left off and " 7379 "without signal to be sent\n"); 7380 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 7381 7382 DPRINTF("Before calling %s() for the child - expected exited\n", 7383 TWAIT_FNAME); 7384 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 7385 7386 validate_status_exited(status, exitval); 7387 7388 DPRINTF("Before calling %s() for the child - expected no process\n", 7389 TWAIT_FNAME); 7390 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 7391 7392 msg_close(&fds); 7393 7394 DPRINTF("XXX: Test worked this time but for consistency timeout it\n"); 7395 sleep(10); 7396 } 7397 7398 ATF_TC(syscall1); 7399 ATF_TC_HEAD(syscall1, tc) 7400 { 7401 atf_tc_set_md_var(tc, "descr", 7402 "Verify that getpid(2) can be traced with PT_SYSCALL"); 7403 } 7404 7405 ATF_TC_BODY(syscall1, tc) 7406 { 7407 const int exitval = 5; 7408 const int sigval = SIGSTOP; 7409 pid_t child, wpid; 7410 #if defined(TWAIT_HAVE_STATUS) 7411 int status; 7412 #endif 7413 struct ptrace_siginfo info; 7414 memset(&info, 0, sizeof(info)); 7415 7416 DPRINTF("Before forking process PID=%d\n", getpid()); 7417 SYSCALL_REQUIRE((child = fork()) != -1); 7418 if (child == 0) { 7419 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 7420 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 7421 7422 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 7423 FORKEE_ASSERT(raise(sigval) == 0); 7424 7425 syscall(SYS_getpid); 7426 7427 DPRINTF("Before exiting of the child process\n"); 7428 _exit(exitval); 7429 } 7430 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 7431 7432 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 7433 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 7434 7435 validate_status_stopped(status, sigval); 7436 7437 DPRINTF("Before resuming the child process where it left off and " 7438 "without signal to be sent\n"); 7439 SYSCALL_REQUIRE(ptrace(PT_SYSCALL, child, (void *)1, 0) != -1); 7440 7441 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 7442 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 7443 7444 validate_status_stopped(status, SIGTRAP); 7445 7446 DPRINTF("Before calling ptrace(2) with PT_GET_SIGINFO for child\n"); 7447 SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1); 7448 7449 ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, SIGTRAP); 7450 ATF_REQUIRE_EQ(info.psi_siginfo.si_code, TRAP_SCE); 7451 7452 DPRINTF("Before resuming the child process where it left off and " 7453 "without signal to be sent\n"); 7454 SYSCALL_REQUIRE(ptrace(PT_SYSCALL, child, (void *)1, 0) != -1); 7455 7456 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 7457 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 7458 7459 validate_status_stopped(status, SIGTRAP); 7460 7461 DPRINTF("Before calling ptrace(2) with PT_GET_SIGINFO for child\n"); 7462 SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1); 7463 7464 DPRINTF("Before checking siginfo_t\n"); 7465 ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, SIGTRAP); 7466 ATF_REQUIRE_EQ(info.psi_siginfo.si_code, TRAP_SCX); 7467 7468 DPRINTF("Before resuming the child process where it left off and " 7469 "without signal to be sent\n"); 7470 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 7471 7472 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 7473 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 7474 7475 validate_status_exited(status, exitval); 7476 7477 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 7478 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 7479 } 7480 7481 ATF_TC(syscallemu1); 7482 ATF_TC_HEAD(syscallemu1, tc) 7483 { 7484 atf_tc_set_md_var(tc, "descr", 7485 "Verify that exit(2) can be intercepted with PT_SYSCALLEMU"); 7486 } 7487 7488 ATF_TC_BODY(syscallemu1, tc) 7489 { 7490 const int exitval = 5; 7491 const int sigval = SIGSTOP; 7492 pid_t child, wpid; 7493 #if defined(TWAIT_HAVE_STATUS) 7494 int status; 7495 #endif 7496 7497 #if defined(__sparc__) && !defined(__sparc64__) 7498 /* syscallemu does not work on sparc (32-bit) */ 7499 atf_tc_expect_fail("PR kern/52166"); 7500 #endif 7501 7502 DPRINTF("Before forking process PID=%d\n", getpid()); 7503 SYSCALL_REQUIRE((child = fork()) != -1); 7504 if (child == 0) { 7505 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 7506 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 7507 7508 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 7509 FORKEE_ASSERT(raise(sigval) == 0); 7510 7511 syscall(SYS_exit, 100); 7512 7513 DPRINTF("Before exiting of the child process\n"); 7514 _exit(exitval); 7515 } 7516 DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); 7517 7518 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 7519 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 7520 7521 validate_status_stopped(status, sigval); 7522 7523 DPRINTF("Before resuming the child process where it left off and " 7524 "without signal to be sent\n"); 7525 SYSCALL_REQUIRE(ptrace(PT_SYSCALL, child, (void *)1, 0) != -1); 7526 7527 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 7528 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 7529 7530 validate_status_stopped(status, SIGTRAP); 7531 7532 DPRINTF("Set SYSCALLEMU for intercepted syscall\n"); 7533 SYSCALL_REQUIRE(ptrace(PT_SYSCALLEMU, child, (void *)1, 0) != -1); 7534 7535 DPRINTF("Before resuming the child process where it left off and " 7536 "without signal to be sent\n"); 7537 SYSCALL_REQUIRE(ptrace(PT_SYSCALL, child, (void *)1, 0) != -1); 7538 7539 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 7540 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 7541 7542 validate_status_stopped(status, SIGTRAP); 7543 7544 DPRINTF("Before resuming the child process where it left off and " 7545 "without signal to be sent\n"); 7546 SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); 7547 7548 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 7549 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 7550 7551 validate_status_exited(status, exitval); 7552 7553 DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); 7554 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 7555 } 7556 7557 #include "t_ptrace_amd64_wait.h" 7558 #include "t_ptrace_i386_wait.h" 7559 #include "t_ptrace_x86_wait.h" 7560 7561 ATF_TP_ADD_TCS(tp) 7562 { 7563 setvbuf(stdout, NULL, _IONBF, 0); 7564 setvbuf(stderr, NULL, _IONBF, 0); 7565 ATF_TP_ADD_TC(tp, traceme1); 7566 ATF_TP_ADD_TC(tp, traceme2); 7567 ATF_TP_ADD_TC(tp, traceme3); 7568 ATF_TP_ADD_TC(tp, traceme4); 7569 7570 ATF_TP_ADD_TC_HAVE_PID(tp, attach1); 7571 ATF_TP_ADD_TC_HAVE_PID(tp, attach2); 7572 ATF_TP_ADD_TC(tp, attach3); 7573 ATF_TP_ADD_TC(tp, attach4); 7574 ATF_TP_ADD_TC_HAVE_PID(tp, attach5); 7575 ATF_TP_ADD_TC_HAVE_PID(tp, attach6); 7576 ATF_TP_ADD_TC_HAVE_PID(tp, attach7); 7577 7578 ATF_TP_ADD_TC(tp, eventmask1); 7579 ATF_TP_ADD_TC(tp, eventmask2); 7580 ATF_TP_ADD_TC(tp, eventmask3); 7581 ATF_TP_ADD_TC(tp, eventmask4); 7582 ATF_TP_ADD_TC(tp, eventmask5); 7583 ATF_TP_ADD_TC(tp, eventmask6); 7584 7585 ATF_TP_ADD_TC_HAVE_PID(tp, fork1); 7586 ATF_TP_ADD_TC(tp, fork2); 7587 7588 ATF_TP_ADD_TC_HAVE_PID(tp, vfork1); 7589 ATF_TP_ADD_TC(tp, vfork2); 7590 7591 ATF_TP_ADD_TC(tp, vforkdone1); 7592 ATF_TP_ADD_TC(tp, vforkdone2); 7593 7594 ATF_TP_ADD_TC(tp, io_read_d1); 7595 ATF_TP_ADD_TC(tp, io_read_d2); 7596 ATF_TP_ADD_TC(tp, io_read_d3); 7597 ATF_TP_ADD_TC(tp, io_read_d4); 7598 7599 ATF_TP_ADD_TC(tp, io_write_d1); 7600 ATF_TP_ADD_TC(tp, io_write_d2); 7601 ATF_TP_ADD_TC(tp, io_write_d3); 7602 ATF_TP_ADD_TC(tp, io_write_d4); 7603 7604 ATF_TP_ADD_TC(tp, read_d1); 7605 ATF_TP_ADD_TC(tp, read_d2); 7606 ATF_TP_ADD_TC(tp, read_d3); 7607 ATF_TP_ADD_TC(tp, read_d4); 7608 7609 ATF_TP_ADD_TC(tp, write_d1); 7610 ATF_TP_ADD_TC(tp, write_d2); 7611 ATF_TP_ADD_TC(tp, write_d3); 7612 ATF_TP_ADD_TC(tp, write_d4); 7613 7614 ATF_TP_ADD_TC(tp, io_read_d_write_d_handshake1); 7615 ATF_TP_ADD_TC(tp, io_read_d_write_d_handshake2); 7616 7617 ATF_TP_ADD_TC(tp, read_d_write_d_handshake1); 7618 ATF_TP_ADD_TC(tp, read_d_write_d_handshake2); 7619 7620 ATF_TP_ADD_TC(tp, io_read_i1); 7621 ATF_TP_ADD_TC(tp, io_read_i2); 7622 ATF_TP_ADD_TC(tp, io_read_i3); 7623 ATF_TP_ADD_TC(tp, io_read_i4); 7624 7625 ATF_TP_ADD_TC(tp, read_i1); 7626 ATF_TP_ADD_TC(tp, read_i2); 7627 ATF_TP_ADD_TC(tp, read_i3); 7628 ATF_TP_ADD_TC(tp, read_i4); 7629 7630 ATF_TP_ADD_TC(tp, io_read_auxv1); 7631 7632 ATF_TP_ADD_TC_HAVE_GPREGS(tp, regs1); 7633 ATF_TP_ADD_TC_HAVE_GPREGS(tp, regs2); 7634 ATF_TP_ADD_TC_HAVE_GPREGS(tp, regs3); 7635 ATF_TP_ADD_TC_HAVE_GPREGS(tp, regs4); 7636 ATF_TP_ADD_TC_HAVE_GPREGS(tp, regs5); 7637 7638 ATF_TP_ADD_TC_HAVE_FPREGS(tp, fpregs1); 7639 ATF_TP_ADD_TC_HAVE_FPREGS(tp, fpregs2); 7640 7641 ATF_TP_ADD_TC_PT_STEP(tp, step1); 7642 ATF_TP_ADD_TC_PT_STEP(tp, step2); 7643 ATF_TP_ADD_TC_PT_STEP(tp, step3); 7644 ATF_TP_ADD_TC_PT_STEP(tp, step4); 7645 7646 ATF_TP_ADD_TC_PT_STEP(tp, setstep1); 7647 ATF_TP_ADD_TC_PT_STEP(tp, setstep2); 7648 ATF_TP_ADD_TC_PT_STEP(tp, setstep3); 7649 ATF_TP_ADD_TC_PT_STEP(tp, setstep4); 7650 7651 ATF_TP_ADD_TC(tp, kill1); 7652 ATF_TP_ADD_TC(tp, kill2); 7653 7654 ATF_TP_ADD_TC(tp, lwpinfo1); 7655 ATF_TP_ADD_TC_HAVE_PID(tp, lwpinfo2); 7656 7657 ATF_TP_ADD_TC(tp, siginfo1); 7658 ATF_TP_ADD_TC(tp, siginfo2); 7659 ATF_TP_ADD_TC(tp, siginfo3); 7660 ATF_TP_ADD_TC(tp, siginfo4); 7661 ATF_TP_ADD_TC_HAVE_PID(tp, siginfo5); 7662 ATF_TP_ADD_TC_PT_STEP(tp, siginfo6); 7663 7664 ATF_TP_ADD_TC(tp, lwp_create1); 7665 7666 ATF_TP_ADD_TC(tp, lwp_exit1); 7667 7668 ATF_TP_ADD_TC(tp, signal1); 7669 ATF_TP_ADD_TC(tp, signal2); 7670 ATF_TP_ADD_TC(tp, signal3); 7671 ATF_TP_ADD_TC_PT_STEP(tp, signal4); 7672 ATF_TP_ADD_TC(tp, signal5); 7673 ATF_TP_ADD_TC_HAVE_PID(tp, signal6); 7674 ATF_TP_ADD_TC_HAVE_PID(tp, signal7); 7675 ATF_TP_ADD_TC(tp, signal8); 7676 ATF_TP_ADD_TC(tp, signal9); 7677 ATF_TP_ADD_TC(tp, signal10); 7678 7679 ATF_TP_ADD_TC(tp, suspend1); 7680 ATF_TP_ADD_TC(tp, suspend2); 7681 7682 ATF_TP_ADD_TC(tp, resume1); 7683 7684 ATF_TP_ADD_TC(tp, getsigmask1); 7685 ATF_TP_ADD_TC(tp, getsigmask2); 7686 7687 ATF_TP_ADD_TC(tp, setsigmask1); 7688 ATF_TP_ADD_TC(tp, setsigmask2); 7689 ATF_TP_ADD_TC(tp, setsigmask3); 7690 ATF_TP_ADD_TC(tp, setsigmask4); 7691 ATF_TP_ADD_TC(tp, setsigmask5); 7692 ATF_TP_ADD_TC(tp, setsigmask6); 7693 7694 ATF_TP_ADD_TC(tp, syscall1); 7695 7696 ATF_TP_ADD_TC(tp, syscallemu1); 7697 7698 ATF_TP_ADD_TCS_PTRACE_WAIT_AMD64(); 7699 ATF_TP_ADD_TCS_PTRACE_WAIT_I386(); 7700 ATF_TP_ADD_TCS_PTRACE_WAIT_X86(); 7701 7702 return atf_no_error(); 7703 } 7704