浏览代码

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) {