commit 55b5a6d8e39c4f3474a8033c4b9af5244cd68384 Author: Kamil Rytarowski Date: Fri May 22 18:48:40 2020 +0200 Cherry-pick: Module Name: src Committed By: kamil Date: Mon May 11 20:58:48 UTC 2020 Modified Files: src/tests/lib/libc/sys: t_ptrace_fork_wait.h Log Message: Fix race in fork_singalmasked ELF RTLD after rtld.c r. 1.204 introduced locking that wraps the fork syscall. This locking changes signal mask of the calling process during the forking process. Instead of comparing old and new signal mask, just after the forking operation, check whether the expected signal is still masked and in another test whether it is still ignored. To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/tests/lib/libc/sys/t_ptrace_fork_wait.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. diff --git a/tests/lib/libc/sys/t_ptrace_wait.c b/tests/lib/libc/sys/t_ptrace_wait.c index 931cd96093b7..44ea33a51111 100644 --- a/tests/lib/libc/sys/t_ptrace_wait.c +++ b/tests/lib/libc/sys/t_ptrace_wait.c @@ -5824,11 +5824,8 @@ fork2_body(const char *fn, bool masked, bool ignored) FORKEE_ASSERT_EQ(sysctl(name, namelen, &kp, &len, NULL, 0), 0); - if (masked) - kp_sigmask = kp.p_sigmask; - - if (ignored) - kp_sigignore = kp.p_sigignore; + kp_sigmask = kp.p_sigmask; + kp_sigignore = kp.p_sigignore; DPRINTF("Set 0%s%s%s%s in EVENT_MASK for the child %d\n", strcmp(fn, "spawn") == 0 ? "|PTRACE_POSIX_SPAWN" : "", @@ -5874,8 +5871,8 @@ fork2_body(const char *fn, bool masked, bool ignored) kp.p_sigmask.__bits[0], kp.p_sigmask.__bits[1], kp.p_sigmask.__bits[2], kp.p_sigmask.__bits[3]); - ATF_REQUIRE(!memcmp(&kp_sigmask, &kp.p_sigmask, - sizeof(kp_sigmask))); + ATF_REQUIRE(sigismember((sigset_t *)&kp.p_sigmask, + SIGTRAP)); } if (ignored) { @@ -5891,8 +5888,8 @@ fork2_body(const char *fn, bool masked, bool ignored) kp.p_sigignore.__bits[0], kp.p_sigignore.__bits[1], kp.p_sigignore.__bits[2], kp.p_sigignore.__bits[3]); - ATF_REQUIRE(!memcmp(&kp_sigignore, &kp.p_sigignore, - sizeof(kp_sigignore))); + ATF_REQUIRE(sigismember((sigset_t *)&kp.p_sigignore, + SIGTRAP)); } SYSCALL_REQUIRE( @@ -5937,8 +5934,8 @@ fork2_body(const char *fn, bool masked, bool ignored) kp.p_sigmask.__bits[0], kp.p_sigmask.__bits[1], kp.p_sigmask.__bits[2], kp.p_sigmask.__bits[3]); - ATF_REQUIRE(!memcmp(&kp_sigmask, &kp.p_sigmask, - sizeof(kp_sigmask))); + ATF_REQUIRE(sigismember((sigset_t *)&kp.p_sigmask, + SIGTRAP)); } if (ignored) { @@ -5954,8 +5951,8 @@ fork2_body(const char *fn, bool masked, bool ignored) kp.p_sigignore.__bits[0], kp.p_sigignore.__bits[1], kp.p_sigignore.__bits[2], kp.p_sigignore.__bits[3]); - ATF_REQUIRE(!memcmp(&kp_sigignore, &kp.p_sigignore, - sizeof(kp_sigignore))); + ATF_REQUIRE(sigismember((sigset_t *)&kp.p_sigignore, + SIGTRAP)); } SYSCALL_REQUIRE( @@ -6016,8 +6013,8 @@ fork2_body(const char *fn, bool masked, bool ignored) kp.p_sigmask.__bits[0], kp.p_sigmask.__bits[1], kp.p_sigmask.__bits[2], kp.p_sigmask.__bits[3]); - ATF_REQUIRE(!memcmp(&kp_sigmask, &kp.p_sigmask, - sizeof(kp_sigmask))); + ATF_REQUIRE(sigismember((sigset_t *)&kp.p_sigmask, + SIGTRAP)); } if (ignored) { @@ -6033,8 +6030,8 @@ fork2_body(const char *fn, bool masked, bool ignored) kp.p_sigignore.__bits[0], kp.p_sigignore.__bits[1], kp.p_sigignore.__bits[2], kp.p_sigignore.__bits[3]); - ATF_REQUIRE(!memcmp(&kp_sigignore, &kp.p_sigignore, - sizeof(kp_sigignore))); + ATF_REQUIRE(sigismember((sigset_t *)&kp.p_sigignore, + SIGTRAP)); } SYSCALL_REQUIRE(