diff options
Diffstat (limited to 'winsup')
-rw-r--r-- | winsup/cygwin/poll.cc | 8 | ||||
-rw-r--r-- | winsup/cygwin/release/3.3.6 | 5 |
2 files changed, 10 insertions, 3 deletions
diff --git a/winsup/cygwin/poll.cc b/winsup/cygwin/poll.cc index 4404134..a67507b 100644 --- a/winsup/cygwin/poll.cc +++ b/winsup/cygwin/poll.cc @@ -104,7 +104,7 @@ poll (struct pollfd *fds, nfds_t nfds, int timeout) fds[i].revents = POLLHUP; else { - if (FD_ISSET(fds[i].fd, read_fds)) + if ((fds[i].events & POLLIN) && FD_ISSET(fds[i].fd, read_fds)) /* This should be sufficient for sockets, too. Using MSG_PEEK, as before, can be considered dangerous at best. Quote from W. Richard Stevens: "The presence @@ -122,9 +122,11 @@ poll (struct pollfd *fds, nfds_t nfds, int timeout) fds[i].revents |= (POLLIN | POLLERR); else { - if (FD_ISSET(fds[i].fd, write_fds)) + if ((fds[i].events & POLLOUT) + && FD_ISSET(fds[i].fd, write_fds)) fds[i].revents |= POLLOUT; - if (FD_ISSET(fds[i].fd, except_fds)) + if ((fds[i].events & POLLPRI) + && FD_ISSET(fds[i].fd, except_fds)) fds[i].revents |= POLLPRI; } } diff --git a/winsup/cygwin/release/3.3.6 b/winsup/cygwin/release/3.3.6 index 49ac58b..f1a4b78 100644 --- a/winsup/cygwin/release/3.3.6 +++ b/winsup/cygwin/release/3.3.6 @@ -17,3 +17,8 @@ Bug Fixes - Handle setting very long window title correctly in console. Addresses: https://cygwin.com/pipermail/cygwin/2022-June/251662.html + +- Fix a bug of poll() that it returns event which is not inquired + if events are inquired in multiple pollfd entries on the same fd + at the same time. + Addresses: https://cygwin.com/pipermail/cygwin/2022-June/251732.html |