Explorar el Código

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 hace 12 años
padre
commit
964e9f3c4c
Se han modificado 1 ficheros con 2 adiciones y 1 borrados
  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) {