瀏覽代碼

avoid the thread-ptr-init behavior of sigaction when not installing handler

this is necessary because posix_spawn calls sigaction after vfork, and
if the thread pointer is not already initialized, initializing it in
the child corrupts the parent process's state.
Rich Felker 12 年之前
父節點
當前提交
964e9f3c4c
共有 1 個文件被更改,包括 2 次插入1 次删除
  1. 2 1
      src/signal/sigaction.c

+ 2 - 1
src/signal/sigaction.c

@@ -15,12 +15,13 @@ int __libc_sigaction(int sig, const struct sigaction *restrict sa, struct sigact
 {
 	struct k_sigaction ksa;
 	if (sa) {
+		if ((uintptr_t)sa->sa_handler > 1UL)
+			__pthread_self_def();
 		ksa.handler = sa->sa_handler;
 		ksa.flags = sa->sa_flags | SA_RESTORER;
 		ksa.restorer = (sa->sa_flags & SA_SIGINFO) ? __restore_rt : __restore;
 		memcpy(&ksa.mask, &sa->sa_mask, sizeof ksa.mask);
 	}
-	__pthread_self_def();
 	if (syscall(SYS_rt_sigaction, sig, sa?&ksa:0, old?&ksa:0, sizeof ksa.mask))
 		return -1;
 	if (old) {