[newlib-cygwin] Cygwin: signalfd: drop incorrect handling of EINTR in read(2)
Corinna Vinschen
corinna@sourceware.org
Tue Jan 15 08:58:00 GMT 2019
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=704068e4f994aa98ad4eb4bfc4a2ca3324cb4a00
commit 704068e4f994aa98ad4eb4bfc4a2ca3324cb4a00
Author: Corinna Vinschen <corinna@vinschen.de>
Date: Tue Jan 15 09:58:30 2019 +0100
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>
Diff:
---
winsup/cygwin/fhandler_signalfd.cc | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/winsup/cygwin/fhandler_signalfd.cc b/winsup/cygwin/fhandler_signalfd.cc
index 1bb0d14..1547c64 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
More information about the Cygwin-cvs
mailing list