From f7690db37d5c0225c73b02cbadc9a4d32137c75b Mon Sep 17 00:00:00 2001 From: Yang Tse Date: Tue, 15 Sep 2009 00:07:56 +0000 Subject: Some systems poll function sets POLLHUP in revents without setting POLLIN, and sets POLLERR without setting POLLIN and POLLOUT. In some libcurl code execution paths this could trigger busy wait loops with high CPU usage until a timeout condition aborted the loop. This fix for Curl_poll adresses the above in a libcurl-wide mode. --- lib/select.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'lib') diff --git a/lib/select.c b/lib/select.c index 7d6a6234f..2e1f38e5f 100644 --- a/lib/select.c +++ b/lib/select.c @@ -398,6 +398,20 @@ int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms) } } while(r == -1); + if(r < 0) + return -1; + if(r == 0) + return 0; + + for (i = 0; i < nfds; i++) { + if(ufds[i].fd == CURL_SOCKET_BAD) + continue; + if(ufds[i].revents & POLLHUP) + ufds[i].revents |= POLLIN; + if(ufds[i].revents & POLLERR) + ufds[i].revents |= (POLLIN|POLLOUT); + } + #else /* HAVE_POLL_FINE */ FD_ZERO(&fds_read); -- cgit v1.2.3