Quellcode durchsuchen

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 vor 12 Jahren
Ursprung
Commit
964e9f3c4c
1 geänderte Dateien mit 2 neuen und 1 gelöschten Zeilen
  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;
 	struct k_sigaction ksa;
 	if (sa) {
 	if (sa) {
+		if ((uintptr_t)sa->sa_handler > 1UL)
+			__pthread_self_def();
 		ksa.handler = sa->sa_handler;
 		ksa.handler = sa->sa_handler;
 		ksa.flags = sa->sa_flags | SA_RESTORER;
 		ksa.flags = sa->sa_flags | SA_RESTORER;
 		ksa.restorer = (sa->sa_flags & SA_SIGINFO) ? __restore_rt : __restore;
 		ksa.restorer = (sa->sa_flags & SA_SIGINFO) ? __restore_rt : __restore;
 		memcpy(&ksa.mask, &sa->sa_mask, sizeof ksa.mask);
 		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))
 	if (syscall(SYS_rt_sigaction, sig, sa?&ksa:0, old?&ksa:0, sizeof ksa.mask))
 		return -1;
 		return -1;
 	if (old) {
 	if (old) {