diff options
author | Daniel Stenberg <daniel@haxx.se> | 2020-12-17 11:17:55 +0100 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2020-12-17 11:17:55 +0100 |
commit | c37444bdd8d1e94e4e78faeb3e719163d050f717 (patch) | |
tree | 07fb3fe249492263d43cd1515a9a9d5045640f85 | |
parent | f25112074d8c501de39f5174b534501b4ce3781f (diff) | |
download | curl-bagder/multi-error-in-toofast.tar.gz |
multi: when erroring in TOOFAST state, act as for PERFORMbagder/multi-error-in-toofast
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
-rw-r--r-- | lib/multi.c | 10 |
1 files changed, 9 insertions, 1 deletions
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 = |