about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2012-05-25 22:34:09 -0400
committerRich Felker <dalias@aerifal.cx>2012-05-25 22:34:09 -0400
commit8cce15af83c04d8965561439f0a80a451a9b1af0 (patch)
tree9cd48519aaeb3de0cf56792c8f015b3b39076e41
parent8b4c232efe182f4a9c8c52c5638af8fec92987bf (diff)
downloadmusl-8cce15af83c04d8965561439f0a80a451a9b1af0.tar.gz
musl-8cce15af83c04d8965561439f0a80a451a9b1af0.tar.xz
musl-8cce15af83c04d8965561439f0a80a451a9b1af0.zip
ensure pthread-internal signals are unblocked before threads are used
if the process started with these signals blocked, cancellation could
fail or setxid could deadlock. there is no way to globally unblock
them after threads have been created. by unblocking them in the
pthread_self initialization for the main thread, we ensure that
they're unblocked before any other threads are created and also
outside of any signal handler context (sigaction initialized
pthread_self), which is important so that return from a signal handler
won't re-block them.
-rw-r--r--src/thread/pthread_self.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/src/thread/pthread_self.c b/src/thread/pthread_self.c
index 51f12bb3..f68896f7 100644
--- a/src/thread/pthread_self.c
+++ b/src/thread/pthread_self.c
@@ -8,6 +8,7 @@ weak_alias(dummy, __pthread_tsd_main);
 
 static int init_main_thread()
 {
+	__syscall(SYS_rt_sigprocmask, SIG_UNBLOCK, SIGPT_SET, 0, 8);
 	if (__set_thread_area(&main_thread) < 0) return -1;
 	main_thread.canceldisable = libc.canceldisable;
 	main_thread.tsd = (void **)__pthread_tsd_main;