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

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


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

dtucker pushed a commit to branch master
in repository openssh.

commit 90452c8b69d065b7c7c285ff78b81418a75bcd76
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