summaryrefslogtreecommitdiff
path: root/nptl-wait-for-pending-setxid-request-also-in-detache.patch
diff options
context:
space:
mode:
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.patch52
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
+