From: Damien Miller Date: Fri, 14 Jan 2022 02:49:32 +0000 (+1100) Subject: fix edge case in poll(2) wrapper X-Git-Tag: V_8_9_P1~68 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a1d42a6ce0398da3833bedf374ef2571af7fea50;p=thirdparty%2Fopenssh-portable.git fix edge case in poll(2) wrapper Correct handling of select(2) exceptfds. These should only be consulted for POLLPRI flagged pfds and not unconditionally converted to POLLERR. with and ok dtucker@ --- diff --git a/openbsd-compat/bsd-poll.c b/openbsd-compat/bsd-poll.c index 8084776ce..f8b427fc7 100644 --- a/openbsd-compat/bsd-poll.c +++ b/openbsd-compat/bsd-poll.c @@ -33,8 +33,8 @@ /* * A minimal implementation of ppoll(2), built on top of pselect(2). * - * Only supports POLLIN and POLLOUT flags in pfd.events, and POLLIN, POLLOUT - * and POLLERR flags in revents. + * Only supports POLLIN, POLLOUT and POLLPRI flags in pfd.events and + * revents. Notably POLLERR, POLLHUP and POLLNVAL are not supported. * * Supports pfd.fd = -1 meaning "unused" although it's not standard. */ @@ -71,14 +71,12 @@ ppoll(struct pollfd *fds, nfds_t nfds, const struct timespec *tmoutp, fd = fds[i].fd; if (fd == -1) continue; - if (fds[i].events & POLLIN) { + if (fds[i].events & POLLIN) FD_SET(fd, readfds); - FD_SET(fd, exceptfds); - } - if (fds[i].events & POLLOUT) { + if (fds[i].events & POLLOUT) FD_SET(fd, writefds); + if (fds[i].events & POLLPRI) FD_SET(fd, exceptfds); - } } ret = pselect(maxfd + 1, readfds, writefds, exceptfds, tmoutp, sigmask); @@ -90,15 +88,12 @@ 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 (FD_ISSET(fd, readfds)) fds[i].revents |= POLLIN; - } - if (FD_ISSET(fd, writefds)) { + if (FD_ISSET(fd, writefds)) fds[i].revents |= POLLOUT; - } - if (FD_ISSET(fd, exceptfds)) { - fds[i].revents |= POLLERR; - } + if (FD_ISSET(fd, exceptfds)) + fds[i].revents |= POLLPRI; } out: