about summary refs log tree commit diff
path: root/src/thread/synccall.c
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2017-01-19 11:45:01 -0500
committerRich Felker <dalias@aerifal.cx>2017-01-19 11:45:01 -0500
commit6894f8472614e22c76820b6469d2551d17e024ed (patch)
tree3b81b41af90741b6dd6d2a52da344011a7dd1bf8 /src/thread/synccall.c
parent1f53e7d00c375efb32e2e468f91a42668653d5f0 (diff)
downloadmusl-6894f8472614e22c76820b6469d2551d17e024ed.tar.gz
musl-6894f8472614e22c76820b6469d2551d17e024ed.tar.xz
musl-6894f8472614e22c76820b6469d2551d17e024ed.zip
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')
-rw-r--r--src/thread/synccall.c2
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;