summaryrefslogtreecommitdiff
path: root/src/thread
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2015-03-16 20:12:49 -0400
committerRich Felker <dalias@aerifal.cx>2015-03-16 20:12:49 -0400
commit76fd01177a32d602bc5ee7bd7ba65316adbae611 (patch)
treed855b8e220d5ade11a8ef96f82f95f5820c56b1a /src/thread
parenteceaf1d29f32656e5befb5e37b1f7db632f2e1dc (diff)
downloadmusl-76fd01177a32d602bc5ee7bd7ba65316adbae611.tar.gz
block all signals (even internal ones) in cancellation signal handler
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.
Diffstat (limited to 'src/thread')
-rw-r--r--src/thread/pthread_cancel.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/src/thread/pthread_cancel.c b/src/thread/pthread_cancel.c
index 1b71aa42..a507f923 100644
--- a/src/thread/pthread_cancel.c
+++ b/src/thread/pthread_cancel.c
@@ -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);
}