]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
multi: skip EINTR check on wakeup socket if it was closed
authorJay Satiro <raysatiro@yahoo.com>
Fri, 6 Mar 2020 04:35:32 +0000 (23:35 -0500)
committerJay Satiro <raysatiro@yahoo.com>
Fri, 6 Mar 2020 07:56:21 +0000 (02:56 -0500)
- Don't check errno on wakeup socket if sread returned 0 since sread
  doesn't set errno in that case.

This is a follow-up to cf7760a from several days ago which fixed
Curl_multi_wait to stop busy looping sread on the non-blocking wakeup
socket if it was closed (ie sread returns 0). Due to a logic error it
was still possible to busy loop in that case if errno == EINTR.

Closes https://github.com/curl/curl/pull/5047

lib/multi.c

index cef2805c8edfdab8a930e6b29912e4bc5c69ffd2..e10e752931905c3c4fb2740213b6c3553ea3ce3e 100644 (file)
@@ -1194,14 +1194,16 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
       if(use_wakeup && multi->wakeup_pair[0] != CURL_SOCKET_BAD) {
         if(ufds[curlfds + extra_nfds].revents & POLLIN) {
           char buf[64];
+          ssize_t nread;
           while(1) {
             /* the reading socket is non-blocking, try to read
                data from it until it receives an error (except EINTR).
                In normal cases it will get EAGAIN or EWOULDBLOCK
                when there is no more data, breaking the loop. */
-            if(sread(multi->wakeup_pair[0], buf, sizeof(buf)) <= 0) {
+            nread = sread(multi->wakeup_pair[0], buf, sizeof(buf));
+            if(nread <= 0) {
 #ifndef USE_WINSOCK
-              if(EINTR == SOCKERRNO)
+              if(nread < 0 && EINTR == SOCKERRNO)
                 continue;
 #endif
               break;