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
This commit is contained in:
parent
5bdfbf5afd
commit
afa4625307
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user