ensure pthread-internal signals are unblocked before threads are used
authorRich Felker <dalias@aerifal.cx>
Sat, 26 May 2012 02:34:09 +0000 (22:34 -0400)
committerRich Felker <dalias@aerifal.cx>
Sat, 26 May 2012 02:34:09 +0000 (22:34 -0400)
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.

src/thread/pthread_self.c

index 51f12bb3227951668c7e75273e9d868a58ca63f2..f68896f78dacd8b1e753e2145434cc1d3db5e566 100644 (file)
@@ -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;