aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2020-03-10 22:31:47 +0100
committerDaniel Stenberg <daniel@haxx.se>2020-03-15 11:43:47 +0100
commitf38c7290b1d57a7cad27ede73d88bfa2e8349d1a (patch)
tree2b7300fc7788128f4d8d8d0eba9626647b93645c /lib
parent51fde337471c9125e7bf425e7ce0a0bf53691992 (diff)
transfer: cap retries of "dead connections" to 5
When libcurl retries a connection due to it being "seemingly dead" or by REFUSED_STREAM, it will now only do it up five times before giving up, to avoid never-ending loops. Reported-by: Dima Tisnek Bug: https://curl.haxx.se/mail/lib-2020-03/0044.html Closes #5074
Diffstat (limited to 'lib')
-rw-r--r--lib/transfer.c6
-rw-r--r--lib/urldata.h2
2 files changed, 7 insertions, 1 deletions
diff --git a/lib/transfer.c b/lib/transfer.c
index e76834eb3..d02baa4c3 100644
--- a/lib/transfer.c
+++ b/lib/transfer.c
@@ -1779,6 +1779,12 @@ CURLcode Curl_retry_request(struct connectdata *conn,
retry = TRUE;
}
if(retry) {
+#define CONN_MAX_RETRIES 5
+ if(conn->retrycount++ >= CONN_MAX_RETRIES) {
+ failf(data, "Connection died, tried %d times before giving up",
+ CONN_MAX_RETRIES);
+ return CURLE_SEND_ERROR;
+ }
infof(conn->data, "Connection died, retrying a fresh connect\n");
*url = strdup(conn->data->change.url);
if(!*url)
diff --git a/lib/urldata.h b/lib/urldata.h
index 4ee568fd6..374bf4371 100644
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@ -1099,7 +1099,7 @@ struct connectdata {
struct http_connect_state *connect_state; /* for HTTP CONNECT */
struct connectbundle *bundle; /* The bundle we are member of */
int negnpn; /* APLN or NPN TLS negotiated protocol, CURL_HTTP_VERSION* */
-
+ int retrycount; /* number of retries on a new connection */
#ifdef USE_UNIX_SOCKETS
char *unix_domain_socket;
BIT(abstract_unix_socket);