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.
#include <signal.h>
#include "syscall.h"
#include "libc.h"
+#include "lock.h"
#include "pthread_impl.h"
static void dummy(int x)
__fork_handler(-1);
__block_all_sigs(&set);
__aio_atfork(-1);
+ LOCK(__abort_lock);
#ifdef SYS_fork
ret = __syscall(SYS_fork);
#else
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);