]> granicus.if.org Git - curl/commitdiff
Some systems poll function sets POLLHUP in revents without setting
authorYang Tse <yangsita@gmail.com>
Tue, 15 Sep 2009 00:07:56 +0000 (00:07 +0000)
committerYang Tse <yangsita@gmail.com>
Tue, 15 Sep 2009 00:07:56 +0000 (00:07 +0000)
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

index 7d6a6234ff73df1f56da101b29de8022cca4c331..2e1f38e5f20bd23e58cce3fe6447dc478b31ab7f 100644 (file)
@@ -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);