From 26f682bcc40dd8e197af3f0e958b0bd070d0ec26 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Wed, 18 Nov 2020 14:06:07 +0100 Subject: quiche: close the connection Reported-by: Junho Choi Fixes #6213 Closes #6217 --- lib/vquic/quiche.c | 22 ++++++++++++++-------- lib/vquic/quiche.h | 1 + 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/lib/vquic/quiche.c b/lib/vquic/quiche.c index 3d9739663..d0d150e39 100644 --- a/lib/vquic/quiche.c +++ b/lib/vquic/quiche.c @@ -89,8 +89,17 @@ static int quiche_perform_getsock(const struct connectdata *conn, return quiche_getsock((struct connectdata *)conn, socks); } -static CURLcode qs_disconnect(struct quicsocket *qs) +static CURLcode qs_disconnect(struct connectdata *conn, + struct quicsocket *qs) { + if(qs->conn) { + (void)quiche_conn_close(qs->conn, TRUE, 0, NULL, 0); + /* flushing the egress is not a failsafe way to deliver all the + outstanding packets, but we also don't want to get stuck here... */ + (void)flush_egress(conn, qs->sockfd, qs); + quiche_conn_free(qs->conn); + qs->conn = NULL; + } if(qs->h3config) quiche_h3_config_free(qs->h3config); if(qs->h3c) @@ -99,10 +108,6 @@ static CURLcode qs_disconnect(struct quicsocket *qs) quiche_config_free(qs->cfg); qs->cfg = NULL; } - if(qs->conn) { - quiche_conn_free(qs->conn); - qs->conn = NULL; - } return CURLE_OK; } @@ -111,14 +116,14 @@ static CURLcode quiche_disconnect(struct connectdata *conn, { struct quicsocket *qs = conn->quic; (void)dead_connection; - return qs_disconnect(qs); + return qs_disconnect(conn, qs); } void Curl_quic_disconnect(struct connectdata *conn, int tempindex) { if(conn->transport == TRNSPRT_QUIC) - qs_disconnect(&conn->hequic[tempindex]); + qs_disconnect(conn, &conn->hequic[tempindex]); } static unsigned int quiche_conncheck(struct connectdata *conn, @@ -187,6 +192,7 @@ CURLcode Curl_quic_connect(struct connectdata *conn, curl_socket_t sockfd, (void)addr; (void)addrlen; + qs->sockfd = sockfd; qs->cfg = quiche_config_new(QUICHE_PROTOCOL_VERSION); if(!qs->cfg) { failf(data, "can't create quiche config"); @@ -337,7 +343,7 @@ CURLcode Curl_quic_is_connected(struct connectdata *conn, int sockindex, return result; error: - qs_disconnect(qs); + qs_disconnect(conn, qs); return result; } diff --git a/lib/vquic/quiche.h b/lib/vquic/quiche.h index 247c1c448..d311e9988 100644 --- a/lib/vquic/quiche.h +++ b/lib/vquic/quiche.h @@ -41,6 +41,7 @@ struct quicsocket { quiche_h3_conn *h3c; quiche_h3_config *h3config; uint8_t scid[QUICHE_MAX_CONN_ID_LEN]; + curl_socket_t sockfd; uint32_t version; }; -- cgit v1.2.1