path: root/src/thread/synccall.c
diff options
authorRich Felker <>2017-01-19 11:45:01 -0500
committerRich Felker <>2017-01-19 11:45:01 -0500
commit6894f8472614e22c76820b6469d2551d17e024ed (patch)
tree3b81b41af90741b6dd6d2a52da344011a7dd1bf8 /src/thread/synccall.c
parent1f53e7d00c375efb32e2e468f91a42668653d5f0 (diff)
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.
Diffstat (limited to 'src/thread/synccall.c')
1 files changed, 1 insertions, 1 deletions
diff --git a/src/thread/synccall.c b/src/thread/synccall.c
index 000ec4e3..f6813576 100644
--- a/src/thread/synccall.c
+++ b/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;