summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2020-12-17 11:17:55 +0100
committerDaniel Stenberg <daniel@haxx.se>2020-12-17 11:17:55 +0100
commitc37444bdd8d1e94e4e78faeb3e719163d050f717 (patch)
tree07fb3fe249492263d43cd1515a9a9d5045640f85
parentf25112074d8c501de39f5174b534501b4ce3781f (diff)
downloadcurl-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.c10
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 =