X-Git-Url: http://nsz.repo.hu/git/?p=musl;a=blobdiff_plain;f=src%2Fthread%2Fpthread_create.c;h=6a37ee9be5c760a89923a394276406a027a45e22;hp=6163f50910445ea7055738eb618cf4628888422b;hb=6e531f999a82cf39a951e1e9bba3cb80a6eb1464;hpb=14a835b3868e4dccece15acbff6d5da6c0e1ff17 diff --git a/src/thread/pthread_create.c b/src/thread/pthread_create.c index 6163f509..6a37ee9b 100644 --- a/src/thread/pthread_create.c +++ b/src/thread/pthread_create.c @@ -32,15 +32,28 @@ _Noreturn void pthread_exit(void *result) self->dead = 1; __unlock(self->killlock); + /* Block all signals before decrementing the live thread count. + * This is important to ensure that dynamically allocated TLS + * is not under-allocated/over-committed, and possibly for other + * reasons as well. */ + __syscall(SYS_rt_sigprocmask, SIG_BLOCK, SIGALL_SET, 0, _NSIG/8); + do n = libc.threads_minus_1; while (n && a_cas(&libc.threads_minus_1, n, n-1)!=n); if (!n) exit(0); if (self->detached && self->map_base) { - if (self->detached == 2) - __syscall(SYS_set_tid_address, 0); - __syscall(SYS_rt_sigprocmask, SIG_BLOCK, - SIGALL_SET, 0, _NSIG/8); + /* Detached threads must avoid the kernel clear_child_tid + * feature, since the virtual address will have been + * unmapped and possibly already reused by a new mapping + * at the time the kernel would perform the write. In + * the case of threads that started out detached, the + * initial clone flags are correct, but if the thread was + * detached later (== 2), we need to clear it here. */ + if (self->detached == 2) __syscall(SYS_set_tid_address, 0); + + /* The following call unmaps the thread's stack mapping + * and then exits without touching the stack. */ __unmapself(self->map_base, self->map_size); } @@ -123,7 +136,7 @@ int pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict attrp size_t need = libc.tls_size + __pthread_tsd_size; size = attr._a_stacksize + DEFAULT_STACK_SIZE; stack = (void *)(attr._a_stackaddr & -16); - stack_limit = attr._a_stackaddr - size; + stack_limit = (void *)(attr._a_stackaddr - size); /* Use application-provided stack for TLS only when * it does not take more than ~12% or 2k of the * application's stack space. */