]> granicus.if.org Git - curl/commitdiff
- Igor filed bug #2111613 (http://curl.haxx.se/bug/view.cgi?id=2111613) that
authorDaniel Stenberg <daniel@haxx.se>
Wed, 8 Oct 2008 21:42:29 +0000 (21:42 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Wed, 8 Oct 2008 21:42:29 +0000 (21:42 +0000)
  eventually identified a flaw in how the multi_socket interface in some cases
  missed to call the timeout callback when easy interfaces are removed and
  added within the same millisecond.

CHANGES
RELEASE-NOTES
lib/multi.c

diff --git a/CHANGES b/CHANGES
index c6de56ea6012697953adc3102a18757ffdfec8af..c0759c029d405a54e4816b63dd2497e85bc4a515 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -7,6 +7,11 @@
                                   Changelog
 
 Daniel Stenberg (8 Oct 2008)
+- Igor filed bug #2111613 (http://curl.haxx.se/bug/view.cgi?id=2111613) that
+  eventually identified a flaw in how the multi_socket interface in some cases
+  missed to call the timeout callback when easy interfaces are removed and
+  added within the same millisecond.
+
 - Igor Novoseltsev brought a patch that introduced two new options to
   curl_easy_setopt: CURLOPT_USERNAME and CURLOPT_PASSWORD that sort of
   deprecates the good old CURLOPT_USERPWD since they allow applications to set
index 73ebdb74ba879850a7dbd346dcec6fcb4445206b..77beeb5fe64857e0a43ab14f86600e1259f6d48c 100644 (file)
@@ -34,6 +34,7 @@ This release includes the following bugfixes:
  o CURLOPT_RANGE now works for SFTP downloads
  o FTP SIZE response 550 now causes CURLE_REMOTE_FILE_NOT_FOUND
  o CURLINFO_PRIMARY_IP fixed for persistent connection re-use cases
+ o remove_handle/add_handle multi interface timer callback flaw
 
 This release includes the following known bugs:
 
index 6eda8c1c8d0b993f433208e24bed6852e19d755e..63db12a2193c00623ab4de776fac8541e8c344cc 100644 (file)
@@ -532,6 +532,18 @@ CURLMcode curl_multi_add_handle(CURLM *multi_handle,
   /* increase the alive-counter */
   multi->num_alive++;
 
+  /* A somewhat crude work-around for a little glitch in update_timer() that
+     happens if the lastcall time is set to the same time when the handle is
+     removed as when the next handle is added, as then the check in
+     update_timer() that prevents calling the application multiple times with
+     the same timer infor will not trigger and then the new handle's timeout
+     will not be notified to the app.
+
+     The work-around is thus simply to clear the 'lastcall' variable to force
+     update_timer() to always trigger a callback to the app when a new easy
+     handle is added */
+  memset(&multi->timer_lastcall, 0, sizeof(multi->timer_lastcall));
+
   update_timer(multi);
   return CURLM_OK;
 }
@@ -1013,9 +1025,9 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
           easy->easy_handle->set.errorbuffer[0] = '\0';
         easy->easy_handle->state.errorbuf = FALSE;
 
-       easy->result = CURLE_OK;
-       result = CURLM_CALL_MULTI_PERFORM;
-       multistate(easy, CURLM_STATE_CONNECT);
+        easy->result = CURLE_OK;
+        result = CURLM_CALL_MULTI_PERFORM;
+        multistate(easy, CURLM_STATE_CONNECT);
       }
       else if (CURLE_OK == easy->result) {
         if(!easy->easy_conn->bits.tunnel_connecting)