aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2008-10-08 21:42:29 +0000
committerDaniel Stenberg <daniel@haxx.se>2008-10-08 21:42:29 +0000
commit544f2f74dfa7ef9bdb08b098995e61c1ca0e1aca (patch)
tree1e506f0bd1f5fbc300731dafbb97cd1d77f7f50d
parent450348d6bd8a9d0fc22eb53f066443b5d0180113 (diff)
- 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.
-rw-r--r--CHANGES5
-rw-r--r--RELEASE-NOTES1
-rw-r--r--lib/multi.c18
3 files changed, 21 insertions, 3 deletions
diff --git a/CHANGES b/CHANGES
index c6de56ea6..c0759c029 100644
--- 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
diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index 73ebdb74b..77beeb5fe 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -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:
diff --git a/lib/multi.c b/lib/multi.c
index 6eda8c1c8..63db12a21 100644
--- a/lib/multi.c
+++ b/lib/multi.c
@@ -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)