multi: when erroring in TOOFAST state, act as for PERFORM

When failing in TOOFAST, the multi_done() wasn't called so the same
cleanup and handling wasn't done like when it fails in PERFORM, which in
the case of FTP could mean that the control connection wouldn't be
marked as "dead" for the CURLE_ABORTED_BY_CALLBACK case. Which caused
ftp_disconnect() to use it to send "QUIT", which could end up waiting
for a response a long time before giving up!

Reported-by: Tomas Berger
Fixes #6333
Closes #6337
This commit is contained in:
Daniel Stenberg 2020-12-17 11:17:55 +01:00
parent ad338b390b
commit 3e17c8ab72
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2

View File

@ -2079,7 +2079,15 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
else else
result = Curl_speedcheck(data, *nowp); result = Curl_speedcheck(data, *nowp);
if(!result) { if(result) {
if(!(data->conn->handler->flags & PROTOPT_DUAL) &&
result != CURLE_HTTP2_STREAM)
streamclose(data->conn, "Transfer returned error");
Curl_posttransfer(data);
multi_done(data, result, TRUE);
}
else {
send_timeout_ms = 0; send_timeout_ms = 0;
if(data->set.max_send_speed > 0) if(data->set.max_send_speed > 0)
send_timeout_ms = send_timeout_ms =