Cygwin: poll: Fix a bug on inquiring same fd with different events.

- poll() has a bug that it returns event which is not inquired if
  events are inquired in multiple pollfd entries on the same fd at
  the same time. This patch fixes the issue.
Addresses: https://cygwin.com/pipermail/cygwin/2022-June/251732.html
This commit is contained in:
Takashi Yano 2022-06-27 10:03:04 +09:00
parent e7ffbdb018
commit 54930ae7d7
2 changed files with 10 additions and 3 deletions

View File

@ -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;
}
}

View File

@ -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