From 792279581b0449ce5fe2e4580efc1b3990772ee7 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Fri, 12 Dec 2008 12:21:11 +0000 Subject: [PATCH] - More work with Igor Novoseltsev to first fix the remaining stuff for removing easy handles from multi handles when the easy handle is/was within a HTTP pipeline. His bug report #2351653 (http://curl.haxx.se/bug/view.cgi?id=2351653) was also related and was eventually fixed by a patch by Igor himself. --- CHANGES | 7 +++++++ TODO-RELEASE | 3 --- lib/multi.c | 16 ++++++++++++---- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/CHANGES b/CHANGES index 7bfa5c1f3..eaee3cb54 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,13 @@ Changelog +Daniel Stenberg (12 Dec 2008) +- More work with Igor Novoseltsev to first fix the remaining stuff for + removing easy handles from multi handles when the easy handle is/was within + a HTTP pipeline. His bug report #2351653 + (http://curl.haxx.se/bug/view.cgi?id=2351653) was also related and was + eventually fixed by a patch by Igor himself. + Yang Tse (12 Dec 2008) - Patrick Monnerat fixed a build regression, introduced in 7.19.2, affecting OS/400 compilations with IPv6 enabled. diff --git a/TODO-RELEASE b/TODO-RELEASE index 3d659b348..fd941e4d2 100644 --- a/TODO-RELEASE +++ b/TODO-RELEASE @@ -10,9 +10,6 @@ To be addressed in 7.19.3 (planned release: January 2009) 197 - IIS-bug in Digest - libcurl parts done, no curl options added yet -199 - "Bug 2351645" adjustment of the patch Daniel S applied - - Suggested fix posted to list - 201 - "bug: header data output to the body callback function after set header" by Shunlong Bai diff --git a/lib/multi.c b/lib/multi.c index ccccf7e8f..21f6ec250 100644 --- a/lib/multi.c +++ b/lib/multi.c @@ -587,6 +587,8 @@ CURLMcode curl_multi_remove_handle(CURLM *multi_handle, if(easy) { bool premature = (bool)(easy->state != CURLM_STATE_COMPLETED); + bool easy_owns_conn = (bool)(easy->easy_conn && + (easy->easy_conn->data == easy->easy_handle)); /* If the 'state' is not INIT or COMPLETED, we might need to do something nice to put the easy_handle in a good known state when this returns. */ @@ -624,7 +626,7 @@ CURLMcode curl_multi_remove_handle(CURLM *multi_handle, /* we must call Curl_done() here (if we still "own it") so that we don't leave a half-baked one around */ - if (easy->easy_conn->data == easy->easy_handle) { + if (easy_owns_conn) { /* Curl_done() clears the conn->data field to lose the association between the easy handle and the connection @@ -676,9 +678,15 @@ CURLMcode curl_multi_remove_handle(CURLM *multi_handle, to that since we're not part of that handle anymore */ easy->easy_handle->state.connc = NULL; - /* and modify the connectindex since this handle can't point to the - connection cache anymore */ - if(easy->easy_conn && + /* Modify the connectindex since this handle can't point to the + connection cache anymore. + + TODO: consider if this is really what we want. The connection cache + is within the multi handle and that owns the connections so we should + not need to touch connections like this when we just remove an easy + handle... + */ + if(easy->easy_conn && easy_owns_conn && (easy->easy_conn->send_pipe->size + easy->easy_conn->recv_pipe->size == 0)) easy->easy_conn->connectindex = -1;