diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2019-01-15 09:58:30 +0100 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2019-01-15 09:58:30 +0100 |
commit | 704068e4f994aa98ad4eb4bfc4a2ca3324cb4a00 (patch) | |
tree | bf083ddca87c38e04cd5a5994eef9a15c15b0c95 | |
parent | 837eb2af5b77a42137bf729d594fc3b80bedfcca (diff) | |
download | cygnal-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.cc | 12 |
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 |