Tue Jun 9 00:28:57 2020 UTC ()
Add fork/vfork/posix_spawn tests for processes within pgrp

New tests:
 - fork_setpgid
 - vfork_setpgid
 - posix_spawn_setpgid
 - unrelated_tracer_fork_setpgid
 - unrelated_tracer_vfork_setpgid
 - unrelated_tracer_posix_spawn_setpgid

These tests trigger a kernel assert for pg_jobc going negative.

The tests are temporarily skipped.


(kamil)
diff -r1.6 -r1.7 src/tests/lib/libc/sys/t_ptrace_fork_wait.h

cvs diff -r1.6 -r1.7 src/tests/lib/libc/sys/t_ptrace_fork_wait.h (expand / switch to unified diff)

--- src/tests/lib/libc/sys/t_ptrace_fork_wait.h 2020/05/16 23:10:26 1.6
+++ src/tests/lib/libc/sys/t_ptrace_fork_wait.h 2020/06/09 00:28:57 1.7
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: t_ptrace_fork_wait.h,v 1.6 2020/05/16 23:10:26 kamil Exp $ */ 1/* $NetBSD: t_ptrace_fork_wait.h,v 1.7 2020/06/09 00:28:57 kamil Exp $ */
2 2
3/*- 3/*-
4 * Copyright (c) 2016, 2017, 2018, 2020 The NetBSD Foundation, Inc. 4 * Copyright (c) 2016, 2017, 2018, 2020 The NetBSD Foundation, Inc.
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * Redistribution and use in source and binary forms, with or without 7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions 8 * modification, are permitted provided that the following conditions
9 * are met: 9 * are met:
10 * 1. Redistributions of source code must retain the above copyright 10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer. 11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright 12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the 13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution. 14 * documentation and/or other materials provided with the distribution.
@@ -19,46 +19,54 @@ @@ -19,46 +19,54 @@
19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE. 26 * POSSIBILITY OF SUCH DAMAGE.
27 */ 27 */
28 28
29 29
30static void 30static void
31fork_body(const char *fn, bool trackspawn, bool trackfork, bool trackvfork, 31fork_body(const char *fn, bool trackspawn, bool trackfork, bool trackvfork,
32 bool trackvforkdone) 32 bool trackvforkdone, bool newpgrp)
33{ 33{
34 const int exitval = 5; 34 const int exitval = 5;
35 const int exitval2 = 0; /* This matched exit status from /bin/echo */ 35 const int exitval2 = 0; /* This matched exit status from /bin/echo */
36 const int sigval = SIGSTOP; 36 const int sigval = SIGSTOP;
37 pid_t child, child2 = 0, wpid; 37 pid_t child, child2 = 0, wpid;
38#if defined(TWAIT_HAVE_STATUS) 38#if defined(TWAIT_HAVE_STATUS)
39 int status; 39 int status;
40#endif 40#endif
41 sigset_t set; 41 sigset_t set;
42 ptrace_state_t state; 42 ptrace_state_t state;
43 const int slen = sizeof(state); 43 const int slen = sizeof(state);
44 ptrace_event_t event; 44 ptrace_event_t event;
45 const int elen = sizeof(event); 45 const int elen = sizeof(event);
46 46
47 char * const arg[] = { __UNCONST("/bin/echo"), NULL }; 47 char * const arg[] = { __UNCONST("/bin/echo"), NULL };
48 48
 49 if (newpgrp)
 50 atf_tc_skip("kernel panic (pg_jobc going negative)");
 51
49 DPRINTF("Before forking process PID=%d\n", getpid()); 52 DPRINTF("Before forking process PID=%d\n", getpid());
50 SYSCALL_REQUIRE((child = fork()) != -1); 53 SYSCALL_REQUIRE((child = fork()) != -1);
51 if (child == 0) { 54 if (child == 0) {
 55 if (newpgrp) {
 56 DPRINTF("Before entering new process group");
 57 setpgid(0, 0);
 58 }
 59
52 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); 60 DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
53 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); 61 FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
54 62
55 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 63 DPRINTF("Before raising %s from child\n", strsignal(sigval));
56 FORKEE_ASSERT(raise(sigval) == 0); 64 FORKEE_ASSERT(raise(sigval) == 0);
57 65
58 if (strcmp(fn, "spawn") == 0) { 66 if (strcmp(fn, "spawn") == 0) {
59 FORKEE_ASSERT_EQ(posix_spawn(&child2, 67 FORKEE_ASSERT_EQ(posix_spawn(&child2,
60 arg[0], NULL, NULL, arg, NULL), 0); 68 arg[0], NULL, NULL, arg, NULL), 0);
61 } else { 69 } else {
62 if (strcmp(fn, "fork") == 0) { 70 if (strcmp(fn, "fork") == 0) {
63 FORKEE_ASSERT((child2 = fork()) != -1); 71 FORKEE_ASSERT((child2 = fork()) != -1);
64 } else if (strcmp(fn, "vfork") == 0) { 72 } else if (strcmp(fn, "vfork") == 0) {
@@ -222,144 +230,168 @@ fork_body(const char *fn, bool trackspaw @@ -222,144 +230,168 @@ fork_body(const char *fn, bool trackspaw
222#endif 230#endif
223 231
224 DPRINTF("Before calling %s() for the child - expected exited\n", 232 DPRINTF("Before calling %s() for the child - expected exited\n",
225 TWAIT_FNAME); 233 TWAIT_FNAME);
226 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); 234 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
227 235
228 validate_status_exited(status, exitval); 236 validate_status_exited(status, exitval);
229 237
230 DPRINTF("Before calling %s() for the child - expected no process\n", 238 DPRINTF("Before calling %s() for the child - expected no process\n",
231 TWAIT_FNAME); 239 TWAIT_FNAME);
232 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); 240 TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
233} 241}
234 242
235#define FORK_TEST(name,fun,tspawn,tfork,tvfork,tvforkdone) \ 243#define FORK_TEST2(name,fun,tspawn,tfork,tvfork,tvforkdone,newpgrp) \
236ATF_TC(name); \ 244ATF_TC(name); \
237ATF_TC_HEAD(name, tc) \ 245ATF_TC_HEAD(name, tc) \
238{ \ 246{ \
239 atf_tc_set_md_var(tc, "descr", "Verify " fun "() " \ 247 atf_tc_set_md_var(tc, "descr", "Verify " fun "() " \
240 "called with 0%s%s%s%s in EVENT_MASK", \ 248 "called with 0%s%s%s%s in EVENT_MASK%s", \
241 tspawn ? "|PTRACE_POSIX_SPAWN" : "", \ 249 tspawn ? "|PTRACE_POSIX_SPAWN" : "", \
242 tfork ? "|PTRACE_FORK" : "", \ 250 tfork ? "|PTRACE_FORK" : "", \
243 tvfork ? "|PTRACE_VFORK" : "", \ 251 tvfork ? "|PTRACE_VFORK" : "", \
244 tvforkdone ? "|PTRACE_VFORK_DONE" : ""); \ 252 tvforkdone ? "|PTRACE_VFORK_DONE" : "", \
 253 newpgrp ? " and the traced processes call setpgrp(0,0)":"");\
245} \ 254} \
246 \ 255 \
247ATF_TC_BODY(name, tc) \ 256ATF_TC_BODY(name, tc) \
248{ \ 257{ \
249 \ 258 \
250 fork_body(fun, tspawn, tfork, tvfork, tvforkdone); \ 259 fork_body(fun, tspawn, tfork, tvfork, tvforkdone, newpgrp); \
251} 260}
252 261
 262#define FORK_TEST(name,fun,tspawn,tfork,tvfork,tvforkdone) \
 263 FORK_TEST2(name,fun,tspawn,tfork,tvfork,tvforkdone,false)
 264
253FORK_TEST(fork1, "fork", false, false, false, false) 265FORK_TEST(fork1, "fork", false, false, false, false)
254#if defined(TWAIT_HAVE_PID) 266#if defined(TWAIT_HAVE_PID)
255FORK_TEST(fork2, "fork", false, true, false, false) 267FORK_TEST(fork2, "fork", false, true, false, false)
256FORK_TEST(fork3, "fork", false, false, true, false) 268FORK_TEST(fork3, "fork", false, false, true, false)
257FORK_TEST(fork4, "fork", false, true, true, false) 269FORK_TEST(fork4, "fork", false, true, true, false)
258#endif 270#endif
259FORK_TEST(fork5, "fork", false, false, false, true) 271FORK_TEST(fork5, "fork", false, false, false, true)
260#if defined(TWAIT_HAVE_PID) 272#if defined(TWAIT_HAVE_PID)
261FORK_TEST(fork6, "fork", false, true, false, true) 273FORK_TEST(fork6, "fork", false, true, false, true)
262FORK_TEST(fork7, "fork", false, false, true, true) 274FORK_TEST(fork7, "fork", false, false, true, true)
263FORK_TEST(fork8, "fork", false, true, true, true) 275FORK_TEST(fork8, "fork", false, true, true, true)
264#endif 276#endif
265FORK_TEST(fork9, "fork", true, false, false, false) 277FORK_TEST(fork9, "fork", true, false, false, false)
266#if defined(TWAIT_HAVE_PID) 278#if defined(TWAIT_HAVE_PID)
267FORK_TEST(fork10, "fork", true, true, false, false) 279FORK_TEST(fork10, "fork", true, true, false, false)
268FORK_TEST(fork11, "fork", true, false, true, false) 280FORK_TEST(fork11, "fork", true, false, true, false)
269FORK_TEST(fork12, "fork", true, true, true, false) 281FORK_TEST(fork12, "fork", true, true, true, false)
270#endif 282#endif
271FORK_TEST(fork13, "fork", true, false, false, true) 283FORK_TEST(fork13, "fork", true, false, false, true)
272#if defined(TWAIT_HAVE_PID) 284#if defined(TWAIT_HAVE_PID)
273FORK_TEST(fork14, "fork", true, true, false, true) 285FORK_TEST(fork14, "fork", true, true, false, true)
274FORK_TEST(fork15, "fork", true, false, true, true) 286FORK_TEST(fork15, "fork", true, false, true, true)
275FORK_TEST(fork16, "fork", true, true, true, true) 287FORK_TEST(fork16, "fork", true, true, true, true)
276#endif 288#endif
277 289
 290#if defined(TWAIT_HAVE_PID)
 291FORK_TEST2(fork_setpgid, "fork", true, true, true, true, true)
 292#endif
 293
278FORK_TEST(vfork1, "vfork", false, false, false, false) 294FORK_TEST(vfork1, "vfork", false, false, false, false)
279#if defined(TWAIT_HAVE_PID) 295#if defined(TWAIT_HAVE_PID)
280FORK_TEST(vfork2, "vfork", false, true, false, false) 296FORK_TEST(vfork2, "vfork", false, true, false, false)
281FORK_TEST(vfork3, "vfork", false, false, true, false) 297FORK_TEST(vfork3, "vfork", false, false, true, false)
282FORK_TEST(vfork4, "vfork", false, true, true, false) 298FORK_TEST(vfork4, "vfork", false, true, true, false)
283#endif 299#endif
284FORK_TEST(vfork5, "vfork", false, false, false, true) 300FORK_TEST(vfork5, "vfork", false, false, false, true)
285#if defined(TWAIT_HAVE_PID) 301#if defined(TWAIT_HAVE_PID)
286FORK_TEST(vfork6, "vfork", false, true, false, true) 302FORK_TEST(vfork6, "vfork", false, true, false, true)
287FORK_TEST(vfork7, "vfork", false, false, true, true) 303FORK_TEST(vfork7, "vfork", false, false, true, true)
288FORK_TEST(vfork8, "vfork", false, true, true, true) 304FORK_TEST(vfork8, "vfork", false, true, true, true)
289#endif 305#endif
290FORK_TEST(vfork9, "vfork", true, false, false, false) 306FORK_TEST(vfork9, "vfork", true, false, false, false)
291#if defined(TWAIT_HAVE_PID) 307#if defined(TWAIT_HAVE_PID)
292FORK_TEST(vfork10, "vfork", true, true, false, false) 308FORK_TEST(vfork10, "vfork", true, true, false, false)
293FORK_TEST(vfork11, "vfork", true, false, true, false) 309FORK_TEST(vfork11, "vfork", true, false, true, false)
294FORK_TEST(vfork12, "vfork", true, true, true, false) 310FORK_TEST(vfork12, "vfork", true, true, true, false)
295#endif 311#endif
296FORK_TEST(vfork13, "vfork", true, false, false, true) 312FORK_TEST(vfork13, "vfork", true, false, false, true)
297#if defined(TWAIT_HAVE_PID) 313#if defined(TWAIT_HAVE_PID)
298FORK_TEST(vfork14, "vfork", true, true, false, true) 314FORK_TEST(vfork14, "vfork", true, true, false, true)
299FORK_TEST(vfork15, "vfork", true, false, true, true) 315FORK_TEST(vfork15, "vfork", true, false, true, true)
300FORK_TEST(vfork16, "vfork", true, true, true, true) 316FORK_TEST(vfork16, "vfork", true, true, true, true)
301#endif 317#endif
302 318
 319#if defined(TWAIT_HAVE_PID)
 320FORK_TEST2(vfork_setpgid, "vfork", true, true, true, true, true)
 321#endif
 322
303FORK_TEST(posix_spawn1, "spawn", false, false, false, false) 323FORK_TEST(posix_spawn1, "spawn", false, false, false, false)
304FORK_TEST(posix_spawn2, "spawn", false, true, false, false) 324FORK_TEST(posix_spawn2, "spawn", false, true, false, false)
305FORK_TEST(posix_spawn3, "spawn", false, false, true, false) 325FORK_TEST(posix_spawn3, "spawn", false, false, true, false)
306FORK_TEST(posix_spawn4, "spawn", false, true, true, false) 326FORK_TEST(posix_spawn4, "spawn", false, true, true, false)
307FORK_TEST(posix_spawn5, "spawn", false, false, false, true) 327FORK_TEST(posix_spawn5, "spawn", false, false, false, true)
308FORK_TEST(posix_spawn6, "spawn", false, true, false, true) 328FORK_TEST(posix_spawn6, "spawn", false, true, false, true)
309FORK_TEST(posix_spawn7, "spawn", false, false, true, true) 329FORK_TEST(posix_spawn7, "spawn", false, false, true, true)
310FORK_TEST(posix_spawn8, "spawn", false, true, true, true) 330FORK_TEST(posix_spawn8, "spawn", false, true, true, true)
311#if defined(TWAIT_HAVE_PID) 331#if defined(TWAIT_HAVE_PID)
312FORK_TEST(posix_spawn9, "spawn", true, false, false, false) 332FORK_TEST(posix_spawn9, "spawn", true, false, false, false)
313FORK_TEST(posix_spawn10, "spawn", true, true, false, false) 333FORK_TEST(posix_spawn10, "spawn", true, true, false, false)
314FORK_TEST(posix_spawn11, "spawn", true, false, true, false) 334FORK_TEST(posix_spawn11, "spawn", true, false, true, false)
315FORK_TEST(posix_spawn12, "spawn", true, true, true, false) 335FORK_TEST(posix_spawn12, "spawn", true, true, true, false)
316FORK_TEST(posix_spawn13, "spawn", true, false, false, true) 336FORK_TEST(posix_spawn13, "spawn", true, false, false, true)
317FORK_TEST(posix_spawn14, "spawn", true, true, false, true) 337FORK_TEST(posix_spawn14, "spawn", true, true, false, true)
318FORK_TEST(posix_spawn15, "spawn", true, false, true, true) 338FORK_TEST(posix_spawn15, "spawn", true, false, true, true)
319FORK_TEST(posix_spawn16, "spawn", true, true, true, true) 339FORK_TEST(posix_spawn16, "spawn", true, true, true, true)
320#endif 340#endif
321 341
 342#if defined(TWAIT_HAVE_PID)
 343FORK_TEST2(posix_spawn_setpgid, "spawn", true, true, true, true, true)
 344#endif
 345
322/// ---------------------------------------------------------------------------- 346/// ----------------------------------------------------------------------------
323 347
324#if defined(TWAIT_HAVE_PID) 348#if defined(TWAIT_HAVE_PID)
325static void 349static void
326unrelated_tracer_fork_body(const char *fn, bool trackspawn, bool trackfork, 350unrelated_tracer_fork_body(const char *fn, bool trackspawn, bool trackfork,
327 bool trackvfork, bool trackvforkdone) 351 bool trackvfork, bool trackvforkdone, bool newpgrp)
328{ 352{
329 const int sigval = SIGSTOP; 353 const int sigval = SIGSTOP;
330 struct msg_fds parent_tracee, parent_tracer; 354 struct msg_fds parent_tracee, parent_tracer;
331 const int exitval = 10; 355 const int exitval = 10;
332 const int exitval2 = 0; /* This matched exit status from /bin/echo */ 356 const int exitval2 = 0; /* This matched exit status from /bin/echo */
333 pid_t tracee, tracer, wpid; 357 pid_t tracee, tracer, wpid;
334 pid_t tracee2 = 0; 358 pid_t tracee2 = 0;
335 uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */ 359 uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */
336#if defined(TWAIT_HAVE_STATUS) 360#if defined(TWAIT_HAVE_STATUS)
337 int status; 361 int status;
338#endif 362#endif
339 363
340 sigset_t set; 364 sigset_t set;
341 struct ptrace_siginfo info; 365 struct ptrace_siginfo info;
342 ptrace_state_t state; 366 ptrace_state_t state;
343 const int slen = sizeof(state); 367 const int slen = sizeof(state);
344 ptrace_event_t event; 368 ptrace_event_t event;
345 const int elen = sizeof(event); 369 const int elen = sizeof(event);
346 370
347 char * const arg[] = { __UNCONST("/bin/echo"), NULL }; 371 char * const arg[] = { __UNCONST("/bin/echo"), NULL };
348 372
 373 if (newpgrp)
 374 atf_tc_skip("kernel panic (pg_jobc going negative)");
 375
349 DPRINTF("Spawn tracee\n"); 376 DPRINTF("Spawn tracee\n");
350 SYSCALL_REQUIRE(msg_open(&parent_tracee) == 0); 377 SYSCALL_REQUIRE(msg_open(&parent_tracee) == 0);
351 tracee = atf_utils_fork(); 378 tracee = atf_utils_fork();
352 if (tracee == 0) { 379 if (tracee == 0) {
 380 if (newpgrp) {
 381 DPRINTF("Before entering new process group");
 382 setpgid(0, 0);
 383 }
 384
353 // Wait for parent to let us crash 385 // Wait for parent to let us crash
354 CHILD_FROM_PARENT("exit tracee", parent_tracee, msg); 386 CHILD_FROM_PARENT("exit tracee", parent_tracee, msg);
355 387
356 DPRINTF("Before raising %s from child\n", strsignal(sigval)); 388 DPRINTF("Before raising %s from child\n", strsignal(sigval));
357 FORKEE_ASSERT(raise(sigval) == 0); 389 FORKEE_ASSERT(raise(sigval) == 0);
358 390
359 if (strcmp(fn, "spawn") == 0) { 391 if (strcmp(fn, "spawn") == 0) {
360 FORKEE_ASSERT_EQ(posix_spawn(&tracee2, 392 FORKEE_ASSERT_EQ(posix_spawn(&tracee2,
361 arg[0], NULL, NULL, arg, NULL), 0); 393 arg[0], NULL, NULL, arg, NULL), 0);
362 } else { 394 } else {
363 if (strcmp(fn, "fork") == 0) { 395 if (strcmp(fn, "fork") == 0) {
364 FORKEE_ASSERT((tracee2 = fork()) != -1); 396 FORKEE_ASSERT((tracee2 = fork()) != -1);
365 } else if (strcmp(fn, "vfork") == 0) { 397 } else if (strcmp(fn, "vfork") == 0) {
@@ -612,95 +644,105 @@ unrelated_tracer_fork_body(const char *f @@ -612,95 +644,105 @@ unrelated_tracer_fork_body(const char *f
612 DPRINTF("Wait for tracee to finish its job and exit - calling %s()\n", 644 DPRINTF("Wait for tracee to finish its job and exit - calling %s()\n",
613 TWAIT_FNAME); 645 TWAIT_FNAME);
614 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracee, &status, 0), tracee); 646 TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
615 647
616 validate_status_exited(status, exitval); 648 validate_status_exited(status, exitval);
617 649
618 DPRINTF("Await normal exit of tracer\n"); 650 DPRINTF("Await normal exit of tracer\n");
619 PARENT_FROM_CHILD("tracer done", parent_tracer, msg); 651 PARENT_FROM_CHILD("tracer done", parent_tracer, msg);
620 652
621 msg_close(&parent_tracer); 653 msg_close(&parent_tracer);
622 msg_close(&parent_tracee); 654 msg_close(&parent_tracee);
623} 655}
624 656
625#define UNRELATED_TRACER_FORK_TEST(name,fun,tspawn,tfork,tvfork,tvforkdone)\ 657#define UNRELATED_TRACER_FORK_TEST2(name,fun,tspawn,tfork,tvfork,tvforkdone,newpgrp)\
626ATF_TC(name); \ 658ATF_TC(name); \
627ATF_TC_HEAD(name, tc) \ 659ATF_TC_HEAD(name, tc) \
628{ \ 660{ \
629 atf_tc_set_md_var(tc, "descr", "Verify " fun "() " \ 661 atf_tc_set_md_var(tc, "descr", "Verify " fun "() " \
630 "called with 0%s%s%s%s in EVENT_MASK", \ 662 "called with 0%s%s%s%s in EVENT_MASK%s", \
631 tspawn ? "|PTRACE_POSIX_SPAWN" : "", \ 663 tspawn ? "|PTRACE_POSIX_SPAWN" : "", \
632 tfork ? "|PTRACE_FORK" : "", \ 664 tfork ? "|PTRACE_FORK" : "", \
633 tvfork ? "|PTRACE_VFORK" : "", \ 665 tvfork ? "|PTRACE_VFORK" : "", \
634 tvforkdone ? "|PTRACE_VFORK_DONE" : ""); \ 666 tvforkdone ? "|PTRACE_VFORK_DONE" : "", \
 667 newpgrp ? " and the traced processes call setpgrp(0,0)":"");\
635} \ 668} \
636 \ 669 \
637ATF_TC_BODY(name, tc) \ 670ATF_TC_BODY(name, tc) \
638{ \ 671{ \
639 \ 672 \
640 unrelated_tracer_fork_body(fun, tspawn, tfork, tvfork, \ 673 unrelated_tracer_fork_body(fun, tspawn, tfork, tvfork, \
641 tvforkdone); \ 674 tvforkdone, newpgrp); \
642} 675}
643 676
 677#define UNRELATED_TRACER_FORK_TEST(name,fun,tspawn,tfork,tvfork,tvforkdone) \
 678 UNRELATED_TRACER_FORK_TEST2(name,fun,tspawn,tfork,tvfork,tvforkdone,false)
 679
644UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork1, "fork", false, false, false, false) 680UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork1, "fork", false, false, false, false)
645UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork2, "fork", false, true, false, false) 681UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork2, "fork", false, true, false, false)
646UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork3, "fork", false, false, true, false) 682UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork3, "fork", false, false, true, false)
647UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork4, "fork", false, true, true, false) 683UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork4, "fork", false, true, true, false)
648UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork5, "fork", false, false, false, true) 684UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork5, "fork", false, false, false, true)
649UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork6, "fork", false, true, false, true) 685UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork6, "fork", false, true, false, true)
650UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork7, "fork", false, false, true, true) 686UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork7, "fork", false, false, true, true)
651UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork8, "fork", false, true, true, true) 687UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork8, "fork", false, true, true, true)
652UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork9, "fork", true, false, false, false) 688UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork9, "fork", true, false, false, false)
653UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork10, "fork", true, true, false, false) 689UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork10, "fork", true, true, false, false)
654UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork11, "fork", true, false, true, false) 690UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork11, "fork", true, false, true, false)
655UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork12, "fork", true, true, true, false) 691UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork12, "fork", true, true, true, false)
656UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork13, "fork", true, false, false, true) 692UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork13, "fork", true, false, false, true)
657UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork14, "fork", true, true, false, true) 693UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork14, "fork", true, true, false, true)
658UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork15, "fork", true, false, true, true) 694UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork15, "fork", true, false, true, true)
659UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork16, "fork", true, true, true, true) 695UNRELATED_TRACER_FORK_TEST(unrelated_tracer_fork16, "fork", true, true, true, true)
660 696
 697UNRELATED_TRACER_FORK_TEST2(unrelated_tracer_fork_setpgid, "fork", true, true, true, true, true)
 698
661UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork1, "vfork", false, false, false, false) 699UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork1, "vfork", false, false, false, false)
662UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork2, "vfork", false, true, false, false) 700UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork2, "vfork", false, true, false, false)
663UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork3, "vfork", false, false, true, false) 701UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork3, "vfork", false, false, true, false)
664UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork4, "vfork", false, true, true, false) 702UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork4, "vfork", false, true, true, false)
665UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork5, "vfork", false, false, false, true) 703UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork5, "vfork", false, false, false, true)
666UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork6, "vfork", false, true, false, true) 704UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork6, "vfork", false, true, false, true)
667UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork7, "vfork", false, false, true, true) 705UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork7, "vfork", false, false, true, true)
668UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork8, "vfork", false, true, true, true) 706UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork8, "vfork", false, true, true, true)
669UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork9, "vfork", true, false, false, false) 707UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork9, "vfork", true, false, false, false)
670UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork10, "vfork", true, true, false, false) 708UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork10, "vfork", true, true, false, false)
671UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork11, "vfork", true, false, true, false) 709UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork11, "vfork", true, false, true, false)
672UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork12, "vfork", true, true, true, false) 710UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork12, "vfork", true, true, true, false)
673UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork13, "vfork", true, false, false, true) 711UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork13, "vfork", true, false, false, true)
674UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork14, "vfork", true, true, false, true) 712UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork14, "vfork", true, true, false, true)
675UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork15, "vfork", true, false, true, true) 713UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork15, "vfork", true, false, true, true)
676UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork16, "vfork", true, true, true, true) 714UNRELATED_TRACER_FORK_TEST(unrelated_tracer_vfork16, "vfork", true, true, true, true)
677 715
 716UNRELATED_TRACER_FORK_TEST2(unrelated_tracer_vfork_setpgid, "vfork", true, true, true, true, true)
 717
678UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn1, "spawn", false, false, false, false) 718UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn1, "spawn", false, false, false, false)
679UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn2, "spawn", false, true, false, false) 719UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn2, "spawn", false, true, false, false)
680UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn3, "spawn", false, false, true, false) 720UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn3, "spawn", false, false, true, false)
681UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn4, "spawn", false, true, true, false) 721UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn4, "spawn", false, true, true, false)
682UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn5, "spawn", false, false, false, true) 722UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn5, "spawn", false, false, false, true)
683UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn6, "spawn", false, true, false, true) 723UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn6, "spawn", false, true, false, true)
684UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn7, "spawn", false, false, true, true) 724UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn7, "spawn", false, false, true, true)
685UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn8, "spawn", false, true, true, true) 725UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn8, "spawn", false, true, true, true)
686UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn9, "spawn", true, false, false, false) 726UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn9, "spawn", true, false, false, false)
687UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn10, "spawn", true, true, false, false) 727UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn10, "spawn", true, true, false, false)
688UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn11, "spawn", true, false, true, false) 728UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn11, "spawn", true, false, true, false)
689UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn12, "spawn", true, true, true, false) 729UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn12, "spawn", true, true, true, false)
690UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn13, "spawn", true, false, false, true) 730UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn13, "spawn", true, false, false, true)
691UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn14, "spawn", true, true, false, true) 731UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn14, "spawn", true, true, false, true)
692UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn15, "spawn", true, false, true, true) 732UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn15, "spawn", true, false, true, true)
693UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn16, "spawn", true, true, true, true) 733UNRELATED_TRACER_FORK_TEST(unrelated_tracer_posix_spawn16, "spawn", true, true, true, true)
 734
 735UNRELATED_TRACER_FORK_TEST2(unrelated_tracer_posix_spawn_setpgid, "spawn", true, true, true, true, true)
694#endif 736#endif
695 737
696/// ---------------------------------------------------------------------------- 738/// ----------------------------------------------------------------------------
697 739
698#if defined(TWAIT_HAVE_PID) 740#if defined(TWAIT_HAVE_PID)
699static void 741static void
700fork_detach_forker_body(const char *fn, bool kill_process) 742fork_detach_forker_body(const char *fn, bool kill_process)
701{ 743{
702 const int exitval = 5; 744 const int exitval = 5;
703 const int exitval2 = 0; /* Matches exit value from /bin/echo */ 745 const int exitval2 = 0; /* Matches exit value from /bin/echo */
704 const int sigval = SIGSTOP; 746 const int sigval = SIGSTOP;
705 pid_t child, child2 = 0, wpid; 747 pid_t child, child2 = 0, wpid;
706#if defined(TWAIT_HAVE_STATUS) 748#if defined(TWAIT_HAVE_STATUS)
@@ -1623,106 +1665,112 @@ FORK2_TEST(vforkdone_signalignored, "vfo @@ -1623,106 +1665,112 @@ FORK2_TEST(vforkdone_signalignored, "vfo
1623 ATF_TP_ADD_TC_HAVE_PID(tp, fork4); \ 1665 ATF_TP_ADD_TC_HAVE_PID(tp, fork4); \
1624 ATF_TP_ADD_TC(tp, fork5); \ 1666 ATF_TP_ADD_TC(tp, fork5); \
1625 ATF_TP_ADD_TC_HAVE_PID(tp, fork6); \ 1667 ATF_TP_ADD_TC_HAVE_PID(tp, fork6); \
1626 ATF_TP_ADD_TC_HAVE_PID(tp, fork7); \ 1668 ATF_TP_ADD_TC_HAVE_PID(tp, fork7); \
1627 ATF_TP_ADD_TC_HAVE_PID(tp, fork8); \ 1669 ATF_TP_ADD_TC_HAVE_PID(tp, fork8); \
1628 ATF_TP_ADD_TC(tp, fork9); \ 1670 ATF_TP_ADD_TC(tp, fork9); \
1629 ATF_TP_ADD_TC_HAVE_PID(tp, fork10); \ 1671 ATF_TP_ADD_TC_HAVE_PID(tp, fork10); \
1630 ATF_TP_ADD_TC_HAVE_PID(tp, fork11); \ 1672 ATF_TP_ADD_TC_HAVE_PID(tp, fork11); \
1631 ATF_TP_ADD_TC_HAVE_PID(tp, fork12); \ 1673 ATF_TP_ADD_TC_HAVE_PID(tp, fork12); \
1632 ATF_TP_ADD_TC(tp, fork13); \ 1674 ATF_TP_ADD_TC(tp, fork13); \
1633 ATF_TP_ADD_TC_HAVE_PID(tp, fork14); \ 1675 ATF_TP_ADD_TC_HAVE_PID(tp, fork14); \
1634 ATF_TP_ADD_TC_HAVE_PID(tp, fork15); \ 1676 ATF_TP_ADD_TC_HAVE_PID(tp, fork15); \
1635 ATF_TP_ADD_TC_HAVE_PID(tp, fork16); \ 1677 ATF_TP_ADD_TC_HAVE_PID(tp, fork16); \
 1678 ATF_TP_ADD_TC_HAVE_PID(tp, fork_setpgid); \
1636 ATF_TP_ADD_TC(tp, vfork1); \ 1679 ATF_TP_ADD_TC(tp, vfork1); \
1637 ATF_TP_ADD_TC_HAVE_PID(tp, vfork2); \ 1680 ATF_TP_ADD_TC_HAVE_PID(tp, vfork2); \
1638 ATF_TP_ADD_TC_HAVE_PID(tp, vfork3); \ 1681 ATF_TP_ADD_TC_HAVE_PID(tp, vfork3); \
1639 ATF_TP_ADD_TC_HAVE_PID(tp, vfork4); \ 1682 ATF_TP_ADD_TC_HAVE_PID(tp, vfork4); \
1640 ATF_TP_ADD_TC(tp, vfork5); \ 1683 ATF_TP_ADD_TC(tp, vfork5); \
1641 ATF_TP_ADD_TC_HAVE_PID(tp, vfork6); \ 1684 ATF_TP_ADD_TC_HAVE_PID(tp, vfork6); \
1642 ATF_TP_ADD_TC_HAVE_PID(tp, vfork7); \ 1685 ATF_TP_ADD_TC_HAVE_PID(tp, vfork7); \
1643 ATF_TP_ADD_TC_HAVE_PID(tp, vfork8); \ 1686 ATF_TP_ADD_TC_HAVE_PID(tp, vfork8); \
1644 ATF_TP_ADD_TC(tp, vfork9); \ 1687 ATF_TP_ADD_TC(tp, vfork9); \
1645 ATF_TP_ADD_TC_HAVE_PID(tp, vfork10); \ 1688 ATF_TP_ADD_TC_HAVE_PID(tp, vfork10); \
1646 ATF_TP_ADD_TC_HAVE_PID(tp, vfork11); \ 1689 ATF_TP_ADD_TC_HAVE_PID(tp, vfork11); \
1647 ATF_TP_ADD_TC_HAVE_PID(tp, vfork12); \ 1690 ATF_TP_ADD_TC_HAVE_PID(tp, vfork12); \
1648 ATF_TP_ADD_TC(tp, vfork13); \ 1691 ATF_TP_ADD_TC(tp, vfork13); \
1649 ATF_TP_ADD_TC_HAVE_PID(tp, vfork14); \ 1692 ATF_TP_ADD_TC_HAVE_PID(tp, vfork14); \
1650 ATF_TP_ADD_TC_HAVE_PID(tp, vfork15); \ 1693 ATF_TP_ADD_TC_HAVE_PID(tp, vfork15); \
1651 ATF_TP_ADD_TC_HAVE_PID(tp, vfork16); \ 1694 ATF_TP_ADD_TC_HAVE_PID(tp, vfork16); \
 1695 ATF_TP_ADD_TC_HAVE_PID(tp, vfork_setpgid); \
1652 ATF_TP_ADD_TC(tp, posix_spawn1); \ 1696 ATF_TP_ADD_TC(tp, posix_spawn1); \
1653 ATF_TP_ADD_TC(tp, posix_spawn2); \ 1697 ATF_TP_ADD_TC(tp, posix_spawn2); \
1654 ATF_TP_ADD_TC(tp, posix_spawn3); \ 1698 ATF_TP_ADD_TC(tp, posix_spawn3); \
1655 ATF_TP_ADD_TC(tp, posix_spawn4); \ 1699 ATF_TP_ADD_TC(tp, posix_spawn4); \
1656 ATF_TP_ADD_TC(tp, posix_spawn5); \ 1700 ATF_TP_ADD_TC(tp, posix_spawn5); \
1657 ATF_TP_ADD_TC(tp, posix_spawn6); \ 1701 ATF_TP_ADD_TC(tp, posix_spawn6); \
1658 ATF_TP_ADD_TC(tp, posix_spawn7); \ 1702 ATF_TP_ADD_TC(tp, posix_spawn7); \
1659 ATF_TP_ADD_TC(tp, posix_spawn8); \ 1703 ATF_TP_ADD_TC(tp, posix_spawn8); \
1660 ATF_TP_ADD_TC_HAVE_PID(tp, posix_spawn9); \ 1704 ATF_TP_ADD_TC_HAVE_PID(tp, posix_spawn9); \
1661 ATF_TP_ADD_TC_HAVE_PID(tp, posix_spawn10); \ 1705 ATF_TP_ADD_TC_HAVE_PID(tp, posix_spawn10); \
1662 ATF_TP_ADD_TC_HAVE_PID(tp, posix_spawn11); \ 1706 ATF_TP_ADD_TC_HAVE_PID(tp, posix_spawn11); \
1663 ATF_TP_ADD_TC_HAVE_PID(tp, posix_spawn12); \ 1707 ATF_TP_ADD_TC_HAVE_PID(tp, posix_spawn12); \
1664 ATF_TP_ADD_TC_HAVE_PID(tp, posix_spawn13); \ 1708 ATF_TP_ADD_TC_HAVE_PID(tp, posix_spawn13); \
1665 ATF_TP_ADD_TC_HAVE_PID(tp, posix_spawn14); \ 1709 ATF_TP_ADD_TC_HAVE_PID(tp, posix_spawn14); \
1666 ATF_TP_ADD_TC_HAVE_PID(tp, posix_spawn15); \ 1710 ATF_TP_ADD_TC_HAVE_PID(tp, posix_spawn15); \
1667 ATF_TP_ADD_TC_HAVE_PID(tp, posix_spawn16); \ 1711 ATF_TP_ADD_TC_HAVE_PID(tp, posix_spawn16); \
 1712 ATF_TP_ADD_TC_HAVE_PID(tp, posix_spawn_setpgid); \
1668 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork1); \ 1713 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork1); \
1669 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork2); \ 1714 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork2); \
1670 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork3); \ 1715 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork3); \
1671 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork4); \ 1716 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork4); \
1672 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork5); \ 1717 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork5); \
1673 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork6); \ 1718 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork6); \
1674 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork7); \ 1719 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork7); \
1675 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork8); \ 1720 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork8); \
1676 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork9); \ 1721 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork9); \
1677 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork10); \ 1722 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork10); \
1678 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork11); \ 1723 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork11); \
1679 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork12); \ 1724 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork12); \
1680 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork13); \ 1725 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork13); \
1681 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork14); \ 1726 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork14); \
1682 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork15); \ 1727 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork15); \
1683 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork16); \ 1728 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork16); \
 1729 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork_setpgid); \
1684 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork1); \ 1730 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork1); \
1685 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork2); \ 1731 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork2); \
1686 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork3); \ 1732 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork3); \
1687 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork4); \ 1733 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork4); \
1688 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork5); \ 1734 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork5); \
1689 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork6); \ 1735 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork6); \
1690 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork7); \ 1736 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork7); \
1691 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork8); \ 1737 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork8); \
1692 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork9); \ 1738 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork9); \
1693 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork10); \ 1739 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork10); \
1694 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork11); \ 1740 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork11); \
1695 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork12); \ 1741 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork12); \
1696 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork13); \ 1742 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork13); \
1697 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork14); \ 1743 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork14); \
1698 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork15); \ 1744 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork15); \
1699 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork16); \ 1745 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork16); \
 1746 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork_setpgid); \
1700 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn1); \ 1747 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn1); \
1701 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn2); \ 1748 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn2); \
1702 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn3); \ 1749 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn3); \
1703 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn4); \ 1750 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn4); \
1704 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn5); \ 1751 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn5); \
1705 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn6); \ 1752 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn6); \
1706 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn7); \ 1753 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn7); \
1707 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn8); \ 1754 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn8); \
1708 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn9); \ 1755 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn9); \
1709 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn10); \ 1756 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn10); \
1710 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn11); \ 1757 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn11); \
1711 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn12); \ 1758 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn12); \
1712 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn13); \ 1759 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn13); \
1713 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn14); \ 1760 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn14); \
1714 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn15); \ 1761 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn15); \
1715 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn16); \ 1762 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn16); \
 1763 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn_setpgid); \
1716 ATF_TP_ADD_TC_HAVE_PID(tp, posix_spawn_detach_spawner); \ 1764 ATF_TP_ADD_TC_HAVE_PID(tp, posix_spawn_detach_spawner); \
1717 ATF_TP_ADD_TC_HAVE_PID(tp, fork_detach_forker); \ 1765 ATF_TP_ADD_TC_HAVE_PID(tp, fork_detach_forker); \
1718 ATF_TP_ADD_TC_HAVE_PID(tp, vfork_detach_vforker); \ 1766 ATF_TP_ADD_TC_HAVE_PID(tp, vfork_detach_vforker); \
1719 ATF_TP_ADD_TC_HAVE_PID(tp, vfork_detach_vforkerdone); \ 1767 ATF_TP_ADD_TC_HAVE_PID(tp, vfork_detach_vforkerdone); \
1720 ATF_TP_ADD_TC_HAVE_PID(tp, posix_spawn_kill_spawner); \ 1768 ATF_TP_ADD_TC_HAVE_PID(tp, posix_spawn_kill_spawner); \
1721 ATF_TP_ADD_TC_HAVE_PID(tp, fork_kill_forker); \ 1769 ATF_TP_ADD_TC_HAVE_PID(tp, fork_kill_forker); \
1722 ATF_TP_ADD_TC_HAVE_PID(tp, vfork_kill_vforker); \ 1770 ATF_TP_ADD_TC_HAVE_PID(tp, vfork_kill_vforker); \
1723 ATF_TP_ADD_TC_HAVE_PID(tp, vfork_kill_vforkerdone); \ 1771 ATF_TP_ADD_TC_HAVE_PID(tp, vfork_kill_vforkerdone); \
1724 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn_detach_spawner); \ 1772 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn_detach_spawner); \
1725 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork_detach_forker); \ 1773 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_fork_detach_forker); \
1726 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork_detach_vforker); \ 1774 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork_detach_vforker); \
1727 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork_detach_vforkerdone); \ 1775 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_vfork_detach_vforkerdone); \
1728 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn_kill_spawner); \ 1776 ATF_TP_ADD_TC_HAVE_PID(tp, unrelated_tracer_posix_spawn_kill_spawner); \