am 0c3d21e6: am e480fc83: bionic: fix pthread_{create, exit}/signal race condition
* commit '0c3d21e63c6e75ae73aaf2b8d64af0bd8caa6beb':
bionic: fix pthread_{create, exit}/signal race condition
diff --git a/libc/arch-x86/bionic/clone.S b/libc/arch-x86/bionic/clone.S
index b9b0957..8abb7c8 100644
--- a/libc/arch-x86/bionic/clone.S
+++ b/libc/arch-x86/bionic/clone.S
@@ -22,6 +22,7 @@
movl %eax, -8(%ecx)
movl %ecx, -4(%ecx)
+ subl $16, %ecx
movl $__NR_clone, %eax
int $0x80
test %eax, %eax
@@ -39,7 +40,6 @@
# we're in the child thread now, call __thread_entry
# with the appropriate arguments on the child stack
# we already placed most of them
- subl $16, %esp
jmp __thread_entry
hlt
diff --git a/libc/bionic/pthread.c b/libc/bionic/pthread.c
index 63d885a..eeff364 100644
--- a/libc/bionic/pthread.c
+++ b/libc/bionic/pthread.c
@@ -568,6 +568,7 @@
void* stack_base = thread->attr.stack_base;
int stack_size = thread->attr.stack_size;
int user_stack = (thread->attr.flags & PTHREAD_ATTR_FLAG_USER_STACK) != 0;
+ sigset_t mask;
// call the cleanup handlers first
while (thread->cleanup_stack) {
@@ -610,6 +611,10 @@
pthread_mutex_unlock(&gThreadListLock);
}
+ sigfillset(&mask);
+ sigdelset(&mask, SIGSEGV);
+ (void)sigprocmask(SIG_SETMASK, &mask, (sigset_t *)NULL);
+
// destroy the thread stack
if (user_stack)
_exit_thread((int)retval);