Просмотр исходного кода

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 лет назад
Родитель
Сommit
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) {