[openssh-commits] [openssh] 01/01: Only return events from ppoll that were requested.

git+noreply at mindrot.org git+noreply at mindrot.org
Fri Apr 1 23:59:11 AEDT 2022


This is an automated email from the git hooks/post-receive script.

dtucker pushed a commit to branch V_8_9
in repository openssh.

commit bc04f2674a8feeea3777e957310f57427f39b7cb
Author: Darren Tucker <dtucker at dtucker.net>
Date:   Fri Apr 1 23:38:44 2022 +1100

    Only return events from ppoll that were requested.
    
    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@
---
 openbsd-compat/bsd-poll.c | 6 +++---
 1 file 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;
 	}
 

-- 
To stop receiving notification emails like this one, please contact
djm at mindrot.org.


More information about the openssh-commits mailing list