diff options
| author | Rich Felker <dalias@aerifal.cx> | 2020-09-28 19:32:34 -0400 | 
|---|---|---|
| committer | Rich Felker <dalias@aerifal.cx> | 2020-10-14 20:27:12 -0400 | 
| commit | b115bee4dd7c33ec719fe2fc566d41c0e2133c85 (patch) | |
| tree | e958cb9537aa7e9e08706c035a5ad6306b33b4be /src | |
| parent | 3cd3de61894b73ca9f62ab9e5b572fc1037dcd55 (diff) | |
| download | musl-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.c | 3 | 
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);  | 
