fix potential deadlock between multithreaded fork and aio
[musl] / src / process / _Fork.c
index 1f41197..fb0fdc2 100644 (file)
@@ -4,6 +4,7 @@
 #include "libc.h"
 #include "lock.h"
 #include "pthread_impl.h"
+#include "aio_impl.h"
 
 static void dummy(int x) { }
 weak_alias(dummy, __aio_atfork);
@@ -13,7 +14,6 @@ pid_t _Fork(void)
        pid_t ret;
        sigset_t set;
        __block_all_sigs(&set);
-       __aio_atfork(-1);
        LOCK(__abort_lock);
 #ifdef SYS_fork
        ret = __syscall(SYS_fork);
@@ -31,7 +31,7 @@ pid_t _Fork(void)
                if (libc.need_locks) libc.need_locks = -1;
        }
        UNLOCK(__abort_lock);
-       __aio_atfork(!ret);
+       if (!ret) __aio_atfork(1);
        __restore_sigs(&set);
        return __syscall_ret(ret);
 }