Przeglądaj źródła

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.
Rich Felker 4 lat temu
rodzic
commit
b115bee4dd
1 zmienionych plików z 3 dodań i 0 usunięć
  1. 3 0
      src/process/fork.c

+ 3 - 0
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);