https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=704068e4f994aa98ad4eb4bfc4a2ca3324cb4a00

commit 704068e4f994aa98ad4eb4bfc4a2ca3324cb4a00
Author: Corinna Vinschen <[email protected]>
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 <[email protected]>

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

Reply via email to