Commit f7690db3 authored by Yang Tse's avatar Yang Tse
Browse files

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.
parent 7e0b0763
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -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);