mirror of
https://github.com/curl/curl.git
synced 2025-01-30 14:22:33 +08:00
make sure the code deals with failures on the DO_MORE state properly
This commit is contained in:
parent
2ec8f77f21
commit
51009a40b4
53
lib/multi.c
53
lib/multi.c
@ -935,28 +935,28 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
|
|||||||
/* Add this handle to the send pipeline */
|
/* Add this handle to the send pipeline */
|
||||||
easy->result = Curl_addHandleToPipeline(easy->easy_handle,
|
easy->result = Curl_addHandleToPipeline(easy->easy_handle,
|
||||||
easy->easy_conn->send_pipe);
|
easy->easy_conn->send_pipe);
|
||||||
if(CURLE_OK == easy->result) {
|
if(CURLE_OK == easy->result) {
|
||||||
if(async)
|
if(async)
|
||||||
/* We're now waiting for an asynchronous name lookup */
|
/* We're now waiting for an asynchronous name lookup */
|
||||||
multistate(easy, CURLM_STATE_WAITRESOLVE);
|
multistate(easy, CURLM_STATE_WAITRESOLVE);
|
||||||
else {
|
else {
|
||||||
/* after the connect has been sent off, go WAITCONNECT unless the
|
/* after the connect has been sent off, go WAITCONNECT unless the
|
||||||
protocol connect is already done and we can go directly to
|
protocol connect is already done and we can go directly to
|
||||||
WAITDO! */
|
WAITDO! */
|
||||||
result = CURLM_CALL_MULTI_PERFORM;
|
result = CURLM_CALL_MULTI_PERFORM;
|
||||||
|
|
||||||
if(protocol_connect)
|
if(protocol_connect)
|
||||||
multistate(easy, CURLM_STATE_WAITDO);
|
multistate(easy, CURLM_STATE_WAITDO);
|
||||||
else {
|
else {
|
||||||
#ifndef CURL_DISABLE_HTTP
|
#ifndef CURL_DISABLE_HTTP
|
||||||
if (easy->easy_conn->bits.tunnel_connecting)
|
if (easy->easy_conn->bits.tunnel_connecting)
|
||||||
multistate(easy, CURLM_STATE_WAITPROXYCONNECT);
|
multistate(easy, CURLM_STATE_WAITPROXYCONNECT);
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
multistate(easy, CURLM_STATE_WAITCONNECT);
|
multistate(easy, CURLM_STATE_WAITCONNECT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -1057,7 +1057,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
|
|||||||
/* protocol-specific connect phase */
|
/* protocol-specific connect phase */
|
||||||
easy->result = Curl_protocol_connecting(easy->easy_conn,
|
easy->result = Curl_protocol_connecting(easy->easy_conn,
|
||||||
&protocol_connect);
|
&protocol_connect);
|
||||||
if(protocol_connect) {
|
if((easy->result == CURLE_OK) && protocol_connect) {
|
||||||
/* after the connect has completed, go WAITDO */
|
/* after the connect has completed, go WAITDO */
|
||||||
multistate(easy, CURLM_STATE_WAITDO);
|
multistate(easy, CURLM_STATE_WAITDO);
|
||||||
result = CURLM_CALL_MULTI_PERFORM;
|
result = CURLM_CALL_MULTI_PERFORM;
|
||||||
@ -1181,15 +1181,20 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
|
|||||||
|
|
||||||
if(CURLE_OK == easy->result)
|
if(CURLE_OK == easy->result)
|
||||||
easy->result = Curl_readwrite_init(easy->easy_conn);
|
easy->result = Curl_readwrite_init(easy->easy_conn);
|
||||||
else
|
|
||||||
/* Remove ourselves from the send pipeline */
|
/* No need to remove ourselves from the send pipeline here since that
|
||||||
Curl_removeHandleFromPipeline(easy->easy_handle,
|
is done for us in Curl_done() */
|
||||||
easy->easy_conn->send_pipe);
|
|
||||||
|
|
||||||
if(CURLE_OK == easy->result) {
|
if(CURLE_OK == easy->result) {
|
||||||
multistate(easy, CURLM_STATE_DO_DONE);
|
multistate(easy, CURLM_STATE_DO_DONE);
|
||||||
result = CURLM_CALL_MULTI_PERFORM;
|
result = CURLM_CALL_MULTI_PERFORM;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
/* failure detected */
|
||||||
|
Curl_posttransfer(easy->easy_handle);
|
||||||
|
Curl_done(&easy->easy_conn, easy->result, FALSE);
|
||||||
|
disconnect_conn = TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user