diff options
author | Rich Felker <dalias@aerifal.cx> | 2012-05-25 22:34:09 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2012-05-25 22:34:09 -0400 |
commit | 8cce15af83c04d8965561439f0a80a451a9b1af0 (patch) | |
tree | 9cd48519aaeb3de0cf56792c8f015b3b39076e41 | |
parent | 8b4c232efe182f4a9c8c52c5638af8fec92987bf (diff) | |
download | musl-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.c | 1 |
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; |