diff options
Diffstat (limited to 'nptl-wait-for-pending-setxid-request-also-in-detache.patch')
| -rw-r--r-- | nptl-wait-for-pending-setxid-request-also-in-detache.patch | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/nptl-wait-for-pending-setxid-request-also-in-detache.patch b/nptl-wait-for-pending-setxid-request-also-in-detache.patch new file mode 100644 index 0000000..604e0b7 --- /dev/null +++ b/nptl-wait-for-pending-setxid-request-also-in-detache.patch @@ -0,0 +1,52 @@ +From 4cab20fa49b3ea3e3454fdc4f13bf3828d8efd19 Mon Sep 17 00:00:00 2001 +From: Andreas Schwab <schwab@suse.de> +Date: Thu, 7 May 2020 15:50:09 +0200 +Subject: [PATCH] nptl: wait for pending setxid request also in detached thread + (bug 25942) + +There is a race between __nptl_setxid and exiting detached thread, which +causes a deadlock on stack_cache_lock. The deadlock happens in this +state: + +T1: setgroups -> __nptl_setxid (holding stack_cache_lock, waiting on cmdp->cntr == 0) +T2 (detached, exiting): start_thread -> __deallocate_stack (waiting on stack_cache_lock) +more threads waiting on stack_cache_lock in pthread_create + +For non-detached threads, start_thread waits for its own setxid handler to +finish before exiting. Do this for detached threads as well. +--- + nptl/pthread_create.c | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c +index afd379e89a..a43089065c 100644 +--- a/nptl/pthread_create.c ++++ b/nptl/pthread_create.c +@@ -567,11 +567,7 @@ START_THREAD_DEFN + advise_stack_range (pd->stackblock, pd->stackblock_size, (uintptr_t) pd, + pd->guardsize); + +- /* If the thread is detached free the TCB. */ +- if (IS_DETACHED (pd)) +- /* Free the TCB. */ +- __free_tcb (pd); +- else if (__glibc_unlikely (pd->cancelhandling & SETXID_BITMASK)) ++ if (__glibc_unlikely (pd->cancelhandling & SETXID_BITMASK)) + { + /* Some other thread might call any of the setXid functions and expect + us to reply. In this case wait until we did that. */ +@@ -587,6 +583,11 @@ START_THREAD_DEFN + pd->setxid_futex = 0; + } + ++ /* If the thread is detached free the TCB. */ ++ if (IS_DETACHED (pd)) ++ /* Free the TCB. */ ++ __free_tcb (pd); ++ + /* We cannot call '_exit' here. '_exit' will terminate the process. + + The 'exit' implementation in the kernel will signal when the +-- +2.19.1 + |
