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)