diff options
author | Darren Tucker <dtucker@dtucker.net> | 2022-04-01 23:38:44 +1100 |
---|---|---|
committer | Darren Tucker <dtucker@dtucker.net> | 2022-04-01 23:58:56 +1100 |
commit | bc04f2674a8feeea3777e957310f57427f39b7cb (patch) | |
tree | 6e1651483aafc4e00ceb73fbeb0da40ccb6bce82 | |
parent | 5880200867e440f8ab5fd893c93db86555990443 (diff) |
Only return events from ppoll that were requested.V_8_9
If the underlying system's select() returns bits that were not in the
request set, our ppoll() implementation can return revents for events
not requested, which can apparently cause a hang. Only return revents
for activity in the requested event set. bz#3416, analysis and fix by
yaroslav.kuzmin at vmssoftware com, ok djm@
-rw-r--r-- | openbsd-compat/bsd-poll.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/openbsd-compat/bsd-poll.c b/openbsd-compat/bsd-poll.c index 781ee978..9a9794f5 100644 --- a/openbsd-compat/bsd-poll.c +++ b/openbsd-compat/bsd-poll.c @@ -91,11 +91,11 @@ ppoll(struct pollfd *fds, nfds_t nfds, const struct timespec *tmoutp, fds[i].revents = 0; if (fd == -1) continue; - if (FD_ISSET(fd, readfds)) + if ((fds[i].events & POLLIN) && FD_ISSET(fd, readfds)) fds[i].revents |= POLLIN; - if (FD_ISSET(fd, writefds)) + if ((fds[i].events & POLLOUT) && FD_ISSET(fd, writefds)) fds[i].revents |= POLLOUT; - if (FD_ISSET(fd, exceptfds)) + if ((fds[i].events & POLLPRI) && FD_ISSET(fd, exceptfds)) fds[i].revents |= POLLPRI; } |