diff options
author | archie <archie@FreeBSD.org> | 2002-08-29 21:39:19 +0000 |
---|---|---|
committer | archie <archie@FreeBSD.org> | 2002-08-29 21:39:19 +0000 |
commit | af2ae1a6ead6955227462a1da514280ecab1d181 (patch) | |
tree | aa7dcc9cb64d129e3a4c13a9f90f8e4f0054aaa0 /lib/libc_r/uthread | |
parent | c72f9f522eb030e55f95a5a07bfb06c8c594d513 (diff) | |
download | FreeBSD-src-af2ae1a6ead6955227462a1da514280ecab1d181.zip FreeBSD-src-af2ae1a6ead6955227462a1da514280ecab1d181.tar.gz |
Make the libc_r version of select() set the readable or writable
file descriptor bit if poll() returns POLLERR, POLLHUP, or POLLNVAL.
Othewise, it's possible for select() to return successfully but
with no bits set.
Reviewed by: deischen
MFC after: 3 days
PR: bin/42175
Diffstat (limited to 'lib/libc_r/uthread')
-rw-r--r-- | lib/libc_r/uthread/uthread_select.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/lib/libc_r/uthread/uthread_select.c b/lib/libc_r/uthread/uthread_select.c index a3a9a9d..2776cb2 100644 --- a/lib/libc_r/uthread/uthread_select.c +++ b/lib/libc_r/uthread/uthread_select.c @@ -179,8 +179,9 @@ _select(int numfds, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, got_events = 0; if (readfds != NULL) { if (FD_ISSET(data.fds[i].fd, readfds)) { - if (data.fds[i].revents & (POLLIN | - POLLRDNORM)) + if ((data.fds[i].revents & (POLLIN + | POLLRDNORM | POLLERR + | POLLHUP | POLLNVAL)) != 0) got_events++; else FD_CLR(data.fds[i].fd, readfds); @@ -188,8 +189,9 @@ _select(int numfds, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, } if (writefds != NULL) { if (FD_ISSET(data.fds[i].fd, writefds)) { - if (data.fds[i].revents & (POLLOUT | - POLLWRNORM | POLLWRBAND)) + if ((data.fds[i].revents & (POLLOUT + | POLLWRNORM | POLLWRBAND | POLLERR + | POLLHUP | POLLNVAL)) != 0) got_events++; else FD_CLR(data.fds[i].fd, |