diff options
author | Rich Felker <dalias@aerifal.cx> | 2017-01-19 11:45:01 -0500 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2017-01-19 11:45:01 -0500 |
commit | 6894f8472614e22c76820b6469d2551d17e024ed (patch) | |
tree | 3b81b41af90741b6dd6d2a52da344011a7dd1bf8 /src | |
parent | 1f53e7d00c375efb32e2e468f91a42668653d5f0 (diff) | |
download | musl-6894f8472614e22c76820b6469d2551d17e024ed.tar.gz musl-6894f8472614e22c76820b6469d2551d17e024ed.tar.bz2 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')
-rw-r--r-- | src/thread/synccall.c | 2 |
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; |