about summary refs log tree commit diff
path: root/sysdeps/pthread/Makefile
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2021-09-23 09:55:54 +0200
committerFlorian Weimer <fweimer@redhat.com>2021-09-23 09:56:07 +0200
commit2849e2f53311b66853cb5159b64cba2bddbfb854 (patch)
tree24a4ff2579b422e3689d254bfeb297ec8cf9a08b /sysdeps/pthread/Makefile
parentb3f27d8150d4f3c64063a9a257ec1d228de66398 (diff)
downloadglibc-2849e2f53311b66853cb5159b64cba2bddbfb854.tar.gz
glibc-2849e2f53311b66853cb5159b64cba2bddbfb854.tar.xz
glibc-2849e2f53311b66853cb5159b64cba2bddbfb854.zip
nptl: Avoid setxid deadlock with blocked signals in thread exit [BZ #28361]
As part of the fix for bug 12889, signals are blocked during
thread exit, so that application code cannot run on the thread that
is about to exit.  This would cause problems if the application
expected signals to be delivered after the signal handler revealed
the thread to still exist, despite pthread_kill can no longer be used
to send signals to it.  However, glibc internally uses the SIGSETXID
signal in a way that is incompatible with signal blocking, due to the
way the setxid handshake delays thread exit until the setxid operation
has completed.  With a blocked SIGSETXID, the handshake can never
complete, causing a deadlock.

As a band-aid, restore the previous handshake protocol by not blocking
SIGSETXID during thread exit.

The new test sysdeps/pthread/tst-pthread-setuid-loop.c is based on
a downstream test by Martin Osvald.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Tested-by: Carlos O'Donell <carlos@redhat.com>
Diffstat (limited to 'sysdeps/pthread/Makefile')
-rw-r--r--sysdeps/pthread/Makefile1
1 files changed, 1 insertions, 0 deletions
diff --git a/sysdeps/pthread/Makefile b/sysdeps/pthread/Makefile
index 48dba717a1..d4bd2d4e3e 100644
--- a/sysdeps/pthread/Makefile
+++ b/sysdeps/pthread/Makefile
@@ -118,6 +118,7 @@ tests += tst-cnd-basic tst-mtx-trylock tst-cnd-broadcast \
 	 tst-unload \
 	 tst-unwind-thread \
 	 tst-pt-vfork1 tst-pt-vfork2 tst-vfork1x tst-vfork2x \
+	 tst-pthread-setuid-loop \
 	 tst-pthread_cancel-exited \
 	 tst-pthread_cancel-select-loop \
 	 tst-pthread_kill-exited \