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 13:57:27 +0100
commit3e17c8ab72e66bdd2faef5561de5030c519e3359 (patch)
tree3a21b64ab092391cebd3795369ff7d948bebf5d4
parentad338b390bb6e3baa4b95f466a104a809cb2c5b0 (diff)
downloadcurl-3e17c8ab72e66bdd2faef5561de5030c519e3359.tar.gz
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
-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 =