block all signals (even internal ones) in cancellation signal handler
authorRich Felker <dalias@aerifal.cx>
Tue, 17 Mar 2015 00:12:49 +0000 (20:12 -0400)
committerRich Felker <dalias@aerifal.cx>
Tue, 17 Mar 2015 00:12:49 +0000 (20:12 -0400)
previously the implementation-internal signal used for multithreaded
set*id operations was left unblocked during handling of the
cancellation signal. however, on some archs, signal contexts are huge
(up to 5k) and the possibility of nested signal handlers drastically
increases the minimum stack requirement. since the cancellation signal
handler will do its job and return in bounded time before possibly
passing execution to application code, there is no need to allow other
signals to interrupt it.

src/thread/pthread_cancel.c

index 1b71aa423399220f70a0a35066af8b04d8d0339a..a507f9237a9d55852167ad1733f27f39015374d2 100644 (file)
@@ -1,3 +1,4 @@
+#include <string.h>
 #include "pthread_impl.h"
 #include "syscall.h"
 #include "libc.h"
@@ -80,7 +81,7 @@ static void init_cancellation()
                .sa_flags = SA_SIGINFO | SA_RESTART,
                .sa_sigaction = cancel_handler
        };
-       sigfillset(&sa.sa_mask);
+       memset(&sa.sa_mask, -1, _NSIG/8);
        __libc_sigaction(SIGCANCEL, &sa, 0);
 }