From b115bee4dd7c33ec719fe2fc566d41c0e2133c85 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Mon, 28 Sep 2020 19:32:34 -0400 Subject: fix missing synchronization of fork with abort if the multithreaded parent forked while another thread was calling sigaction for SIGABRT or calling abort, the child could inherit a lock state in which future calls to abort will deadlock, or in which the disposition for SIGABRT has already been reset to SIG_DFL. this is nonconforming since abort is AS-safe and permitted to be called concurrently with fork or in the MT-forked child. --- src/process/fork.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src') diff --git a/src/process/fork.c b/src/process/fork.c index dbaa9402..17fb87ad 100644 --- a/src/process/fork.c +++ b/src/process/fork.c @@ -3,6 +3,7 @@ #include #include "syscall.h" #include "libc.h" +#include "lock.h" #include "pthread_impl.h" static void dummy(int x) @@ -19,6 +20,7 @@ pid_t fork(void) __fork_handler(-1); __block_all_sigs(&set); __aio_atfork(-1); + LOCK(__abort_lock); #ifdef SYS_fork ret = __syscall(SYS_fork); #else @@ -34,6 +36,7 @@ pid_t fork(void) libc.threads_minus_1 = 0; if (libc.need_locks) libc.need_locks = -1; } + UNLOCK(__abort_lock); __aio_atfork(!ret); __restore_sigs(&set); __fork_handler(!ret); -- cgit v1.2.1