瀏覽代碼

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

+ 1 - 0
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;