aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--winsup/cygwin/poll.cc8
-rw-r--r--winsup/cygwin/release/3.3.65
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