[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