From c37444bdd8d1e94e4e78faeb3e719163d050f717 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Thu, 17 Dec 2020 11:17:55 +0100 Subject: 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 --- lib/multi.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/multi.c b/lib/multi.c index 86e36be4a..bf439bb8e 100644 --- a/lib/multi.c +++ b/lib/multi.c @@ -2079,7 +2079,15 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, else 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; if(data->set.max_send_speed > 0) send_timeout_ms = -- cgit v1.2.1