summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2020-09-28 19:32:34 -0400
committerRich Felker <dalias@aerifal.cx>2020-10-14 20:27:12 -0400
commitb115bee4dd7c33ec719fe2fc566d41c0e2133c85 (patch)
treee958cb9537aa7e9e08706c035a5ad6306b33b4be /src
parent3cd3de61894b73ca9f62ab9e5b572fc1037dcd55 (diff)
downloadmusl-b115bee4dd7c33ec719fe2fc566d41c0e2133c85.tar.gz
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.
Diffstat (limited to 'src')
-rw-r--r--src/process/fork.c3
1 files changed, 3 insertions, 0 deletions
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 <signal.h>
#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);