Merge branch 'sz/maint-curl-multi-timeout' into maint
authorJunio C Hamano <gitster@pobox.com>
Mon, 19 Nov 2012 03:44:36 +0000 (19:44 -0800)
committerJunio C Hamano <gitster@pobox.com>
Mon, 19 Nov 2012 03:44:36 +0000 (19:44 -0800)
Sometimes curl_multi_timeout() function suggested a wrong timeout
value when there is no file descriptors to wait on and the http
transport ended up sleeping for minutes in select(2) system call. A
workaround has been added for this.

* sz/maint-curl-multi-timeout:
Fix potential hang in https handshake

http.c
diff --git a/http.c b/http.c
index df9bb710863e30ba98d7661f84e872b30ed4449e..f9a9de141622549ec4338cbbfc2f430029696ebe 100644 (file)
--- a/http.c
+++ b/http.c
@@ -631,6 +631,18 @@ void run_active_slot(struct active_request_slot *slot)
                        FD_ZERO(&excfds);
                        curl_multi_fdset(curlm, &readfds, &writefds, &excfds, &max_fd);
 
+                       /*
+                        * It can happen that curl_multi_timeout returns a pathologically
+                        * long timeout when curl_multi_fdset returns no file descriptors
+                        * to read.  See commit message for more details.
+                        */
+                       if (max_fd < 0 &&
+                           (select_timeout.tv_sec > 0 ||
+                            select_timeout.tv_usec > 50000)) {
+                               select_timeout.tv_sec  = 0;
+                               select_timeout.tv_usec = 50000;
+                       }
+
                        select(max_fd+1, &readfds, &writefds, &excfds, &select_timeout);
                }
        }