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