瀏覽代碼

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.
Rich Felker 10 年之前
父節點
當前提交
76fd01177a
共有 1 個文件被更改,包括 2 次插入1 次删除
  1. 2 1
      src/thread/pthread_cancel.c

+ 2 - 1
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);
 }