diff options
-rw-r--r-- | lib/select.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/lib/select.c b/lib/select.c index 3bfffa9c8..daa591eae 100644 --- a/lib/select.c +++ b/lib/select.c @@ -573,7 +573,7 @@ int Curl_select(int nfds, else if (poll_nfds <= SMALL_POLLNFDS) poll_fds = small_fds; else { - poll_fds = calloc((size_t)poll_nfds, sizeof(struct pollfd)); + poll_fds = malloc(poll_nfds * sizeof(struct pollfd)); if (!poll_fds) { SET_SOCKERRNO(ENOBUFS); return -1; @@ -581,20 +581,27 @@ int Curl_select(int nfds, } if (poll_fds) { + int events; ix = 0; fd = nfds; while (fd--) { - poll_fds[ix].events = 0; + events = 0; if (fds_read && (0 != FD_ISSET(fd, fds_read))) - poll_fds[ix].events |= (POLLRDNORM|POLLIN); + events |= (POLLRDNORM|POLLIN); if (fds_write && (0 != FD_ISSET(fd, fds_write))) - poll_fds[ix].events |= (POLLWRNORM|POLLOUT); + events |= (POLLWRNORM|POLLOUT); if (fds_excep && (0 != FD_ISSET(fd, fds_excep))) - poll_fds[ix].events |= (POLLRDBAND|POLLPRI); - if (poll_fds[ix].events) { + events |= (POLLRDBAND|POLLPRI); + if (events) { + poll_fds[ix].events = events; poll_fds[ix].fd = fd; poll_fds[ix].revents = 0; ix++; + if(ix == poll_nfds) + /* since we know this is the total amount of descriptors with + interesting actions, we can skip the rest of the loop at this + point */ + break; } } } |