diff options
author | Stefan Eissing <stefan@eissing.org> | 2023-01-06 12:33:34 +0100 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2023-01-09 13:23:20 +0100 |
commit | 1c5d8acf79efcf40ba20a232c4133fc81700c809 (patch) | |
tree | 512e2f011ab72fe8ffb37ccc92c25b5638f4073f /lib/vquic | |
parent | 0ef29268819b7a6d7c72d8f19bc6ad9e91d9b191 (diff) | |
download | curl-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.c | 28 | ||||
-rw-r--r-- | lib/vquic/curl_quiche.c | 8 |
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; |