mirror of
https://github.com/curl/curl.git
synced 2026-06-01 22:24:15 +03:00
- Igor Novoseltsev filed bug #2351645
(http://curl.haxx.se/bug/view.cgi?id=2351645) that identified a problem with the multi interface that occured if you removed an easy handle while in progress and the handle was used in a HTTP pipeline.
This commit is contained in:
parent
4ee27b4594
commit
479ddb1fee
5 changed files with 45 additions and 22 deletions
31
lib/multi.c
31
lib/multi.c
|
|
@ -620,22 +620,27 @@ CURLMcode curl_multi_remove_handle(CURLM *multi_handle,
|
|||
easy->easy_handle->dns.hostcachetype = HCACHE_NONE;
|
||||
}
|
||||
|
||||
/* 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 &&
|
||||
(easy->easy_conn->data == easy->easy_handle)) {
|
||||
if(easy->easy_conn) {
|
||||
|
||||
/* Curl_done() clears the conn->data field to lose the association
|
||||
between the easy handle and the connection
|
||||
/* 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) {
|
||||
|
||||
Note that this ignores the return code simply because there's nothing
|
||||
really useful to do with it anyway! */
|
||||
(void)Curl_done(&easy->easy_conn, easy->result, premature);
|
||||
/* Curl_done() clears the conn->data field to lose the association
|
||||
between the easy handle and the connection
|
||||
|
||||
if(easy->easy_conn)
|
||||
/* the connection is still alive, set back the association to enable
|
||||
the check below to trigger TRUE */
|
||||
easy->easy_conn->data = easy->easy_handle;
|
||||
Note that this ignores the return code simply because there's
|
||||
nothing really useful to do with it anyway! */
|
||||
(void)Curl_done(&easy->easy_conn, easy->result, premature);
|
||||
|
||||
if(easy->easy_conn)
|
||||
/* the connection is still alive, set back the association to enable
|
||||
the check below to trigger TRUE */
|
||||
easy->easy_conn->data = easy->easy_handle;
|
||||
}
|
||||
else
|
||||
/* Clear connection pipelines, if Curl_done above was not called */
|
||||
Curl_getoff_all_pipelines(easy->easy_handle, easy->easy_conn);
|
||||
}
|
||||
|
||||
/* If this easy_handle was the last one in charge for one or more
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue