Explorar o código

fix spurious EINTR errors from multithreaded set*id, etc.

commit 78a8ef47c4d92b7680c52a85f80a81e29da86bb9 inadvertently removed
the SA_RESTART flag from the sigaction for the internal signal handler
used by __synccall for broadcasting. as a result, programs which did
not use interrupting signals but which used set*id() in a
multithreaded context could wrongly observe EINTR errors they're not
prepared to handle.
Rich Felker %!s(int64=8) %!d(string=hai) anos
pai
achega
6894f84726
Modificáronse 1 ficheiros con 1 adicións e 1 borrados
  1. 1 1
      src/thread/synccall.c

+ 1 - 1
src/thread/synccall.c

@@ -50,7 +50,7 @@ void __synccall(void (*func)(void *), void *ctx)
 	int cs, i, r, pid, self;;
 	DIR dir = {0};
 	struct dirent *de;
-	struct sigaction sa = { .sa_flags = 0, .sa_handler = handler };
+	struct sigaction sa = { .sa_flags = SA_RESTART, .sa_handler = handler };
 	struct chain *cp, *next;
 	struct timespec ts;