From d46e335683a76302b20b87135d72e8d8be495c14 Mon Sep 17 00:00:00 2001 From: Amaury Denoyelle Date: Fri, 29 Apr 2022 15:57:49 +0200 Subject: [PATCH] MEDIUM: quic: do not ACK packet with STREAM if MUX not present If a packet contains a STREAM frame but the MUX is not allocated, the frame cannot be enqueued. According to the RFC9000, we must not acknowledge the packet under this condition. This may prevents a bug with firefox which keeps trying on refreshing the web page. This issue has already been detected before closing state implementation : haproxy wasn't emitted CONNECTION_CLOSE and keeps acknowledge STREAM frames despite not handle them. In the future, it might be necessary to respond with a CONNECTION_CLOSE if the MUX has already been freed. --- src/xprt_quic.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/xprt_quic.c b/src/xprt_quic.c index 15bcd387bf..844aa13ead 100644 --- a/src/xprt_quic.c +++ b/src/xprt_quic.c @@ -2738,9 +2738,12 @@ static int qc_parse_pkt_frms(struct quic_rx_packet *pkt, struct ssl_sock_ctx *ct } else if (!(stream->id & QUIC_STREAM_FRAME_ID_INITIATOR_BIT)) goto err; - /* At the application layer the connection may have already been closed. */ + /* The upper layer may not be allocated. + * + * TODO emit a CONNECTION_CLOSE if mux already freed. + */ if (qc->mux_state != QC_MUX_READY) - break; + goto err; if (!qc_handle_strm_frm(pkt, stream, qc)) goto err; -- 2.47.3