summaryrefslogtreecommitdiff
path: root/lib/vquic
diff options
context:
space:
mode:
authorStefan Eissing <stefan@eissing.org>2023-01-06 12:33:34 +0100
committerDaniel Stenberg <daniel@haxx.se>2023-01-09 13:23:20 +0100
commit1c5d8acf79efcf40ba20a232c4133fc81700c809 (patch)
tree512e2f011ab72fe8ffb37ccc92c25b5638f4073f /lib/vquic
parent0ef29268819b7a6d7c72d8f19bc6ad9e91d9b191 (diff)
downloadcurl-1c5d8acf79efcf40ba20a232c4133fc81700c809.tar.gz
quic: improve connect error message, debugging info, fix false connect report
- ECONNECTREFUSED has not its own fail message in quic filters - Debug logging in connect eyballing improved - Fix bug in ngtcp2/quiche that could lead to false success reporting. Reported-by: Divy Le Ray Fixes #10245 Closes #10248
Diffstat (limited to 'lib/vquic')
-rw-r--r--lib/vquic/curl_ngtcp2.c28
-rw-r--r--lib/vquic/curl_quiche.c8
2 files changed, 24 insertions, 12 deletions
diff --git a/lib/vquic/curl_ngtcp2.c b/lib/vquic/curl_ngtcp2.c
index 09cae498e..5ee5ad86b 100644
--- a/lib/vquic/curl_ngtcp2.c
+++ b/lib/vquic/curl_ngtcp2.c
@@ -1169,6 +1169,10 @@ static ssize_t cf_ngtcp2_recv(struct Curl_cfilter *cf, struct Curl_easy *data,
struct cf_ngtcp2_ctx *ctx = cf->ctx;
struct HTTP *stream = data->req.p.http;
+ DEBUGASSERT(cf->connected);
+ DEBUGASSERT(ctx);
+ DEBUGASSERT(ctx->qconn);
+ DEBUGASSERT(ctx->h3conn);
*err = CURLE_OK;
if(!stream->memlen) {
@@ -1442,6 +1446,10 @@ static ssize_t cf_ngtcp2_send(struct Curl_cfilter *cf, struct Curl_easy *data,
ssize_t sent = 0;
struct HTTP *stream = data->req.p.http;
+ DEBUGASSERT(cf->connected);
+ DEBUGASSERT(ctx);
+ DEBUGASSERT(ctx->qconn);
+ DEBUGASSERT(ctx->h3conn);
*err = CURLE_OK;
if(stream->closed) {
@@ -1576,8 +1584,16 @@ static CURLcode cf_process_ingress(struct Curl_cfilter *cf,
if(recvd == -1) {
if(SOCKERRNO == EAGAIN || SOCKERRNO == EWOULDBLOCK)
break;
-
- failf(data, "ngtcp2: recvfrom() unexpectedly returned %zd", recvd);
+ if(SOCKERRNO == ECONNREFUSED) {
+ const char *r_ip;
+ int r_port;
+ Curl_cf_socket_peek(cf->next, NULL, NULL, &r_ip, &r_port);
+ failf(data, "ngtcp2: connection to %s port %u refused",
+ r_ip, r_port);
+ return CURLE_COULDNT_CONNECT;
+ }
+ failf(data, "ngtcp2: recvfrom() unexpectedly returned %zd (errno=%d)",
+ recvd, SOCKERRNO);
return CURLE_RECV_ERROR;
}
@@ -2273,13 +2289,13 @@ static CURLcode cf_ngtcp2_connect(struct Curl_cfilter *cf,
return result;
}
+ *done = FALSE;
if(!ctx->qconn) {
result = cf_connect_start(cf, data);
if(result)
goto out;
}
- *done = FALSE;
result = cf_process_ingress(cf, data);
if(result)
goto out;
@@ -2301,12 +2317,10 @@ static CURLcode cf_ngtcp2_connect(struct Curl_cfilter *cf,
out:
#ifndef CURL_DISABLE_VERBOSE_STRINGS
if(result && result != CURLE_AGAIN) {
- const struct Curl_sockaddr_ex *sockaddr;
const char *r_ip;
int r_port;
- result = Curl_cf_socket_peek(cf->next, &ctx->sockfd,
- &sockaddr, &r_ip, &r_port);
+ Curl_cf_socket_peek(cf->next, NULL, NULL, &r_ip, &r_port);
infof(data, "connect to %s port %u failed: %s",
r_ip, r_port, curl_easy_strerror(result));
}
@@ -2364,7 +2378,7 @@ CURLcode Curl_cf_ngtcp2_create(struct Curl_cfilter **pcf,
const struct Curl_addrinfo *ai)
{
struct cf_ngtcp2_ctx *ctx = NULL;
- struct Curl_cfilter *cf = NULL, *udp_cf;
+ struct Curl_cfilter *cf = NULL, *udp_cf = NULL;
CURLcode result;
(void)data;
diff --git a/lib/vquic/curl_quiche.c b/lib/vquic/curl_quiche.c
index 48ea4399a..8863fe0a3 100644
--- a/lib/vquic/curl_quiche.c
+++ b/lib/vquic/curl_quiche.c
@@ -961,13 +961,13 @@ static CURLcode cf_quiche_connect(struct Curl_cfilter *cf,
return result;
}
+ *done = FALSE;
if(!ctx->qconn) {
result = cf_connect_start(cf, data);
if(result)
goto out;
}
- *done = FALSE;
result = cf_process_ingress(cf, data);
if(result)
goto out;
@@ -990,12 +990,10 @@ static CURLcode cf_quiche_connect(struct Curl_cfilter *cf,
out:
#ifndef CURL_DISABLE_VERBOSE_STRINGS
if(result && result != CURLE_AGAIN) {
- const struct Curl_sockaddr_ex *sockaddr;
const char *r_ip;
int r_port;
- result = Curl_cf_socket_peek(cf->next, &ctx->sockfd,
- &sockaddr, &r_ip, &r_port);
+ Curl_cf_socket_peek(cf->next, NULL, NULL, &r_ip, &r_port);
infof(data, "connect to %s port %u failed: %s",
r_ip, r_port, curl_easy_strerror(result));
}
@@ -1094,7 +1092,7 @@ CURLcode Curl_cf_quiche_create(struct Curl_cfilter **pcf,
const struct Curl_addrinfo *ai)
{
struct cf_quiche_ctx *ctx = NULL;
- struct Curl_cfilter *cf = NULL, *udp_cf;
+ struct Curl_cfilter *cf = NULL, *udp_cf = NULL;
CURLcode result;
(void)data;