summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2019-01-15 09:58:30 +0100
committerCorinna Vinschen <corinna@vinschen.de>2019-01-15 09:58:30 +0100
commit704068e4f994aa98ad4eb4bfc4a2ca3324cb4a00 (patch)
treebf083ddca87c38e04cd5a5994eef9a15c15b0c95
parent837eb2af5b77a42137bf729d594fc3b80bedfcca (diff)
downloadcygnal-704068e4f994aa98ad4eb4bfc4a2ca3324cb4a00.tar.gz
cygnal-704068e4f994aa98ad4eb4bfc4a2ca3324cb4a00.tar.bz2
cygnal-704068e4f994aa98ad4eb4bfc4a2ca3324cb4a00.zip
Cygwin: signalfd: drop incorrect handling of EINTR in read(2)
In case sigwait_common returns EINTR, read wrongly ignores it, so read can't be interrupt by a signal. Fix that. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
-rw-r--r--winsup/cygwin/fhandler_signalfd.cc12
1 files changed, 5 insertions, 7 deletions
diff --git a/winsup/cygwin/fhandler_signalfd.cc b/winsup/cygwin/fhandler_signalfd.cc
index 1bb0d1422..1547c64cd 100644
--- a/winsup/cygwin/fhandler_signalfd.cc
+++ b/winsup/cygwin/fhandler_signalfd.cc
@@ -112,13 +112,11 @@ fhandler_signalfd::read (void *ptr, size_t& len)
? (PLARGE_INTEGER) &poll : NULL);
if (ret == -1)
{
- if (curlen == 0)
- {
- if (get_errno () == EINTR && curlen == 0)
- continue;
- set_errno (old_errno);
- }
- len = curlen ?: (size_t) -1;
+ /* If we already read a signal so the buffer isn't empty, just
+ return success. */
+ if (curlen > 0)
+ break;
+ len = -1;
return;
}
__try