fix spurious EINTR errors from multithreaded set*id, etc.
authorRich Felker <dalias@aerifal.cx>
Thu, 19 Jan 2017 16:45:01 +0000 (11:45 -0500)
committerRich Felker <dalias@aerifal.cx>
Thu, 19 Jan 2017 16:45:01 +0000 (11:45 -0500)
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.

src/thread/synccall.c

index 000ec4e..f681357 100644 (file)
@@ -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;