From: Amaury Denoyelle Date: Fri, 29 Apr 2022 13:57:49 +0000 (+0200) Subject: MEDIUM: quic: do not ACK packet with STREAM if MUX not present X-Git-Tag: v2.6-dev8~8 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d46e335683a76302b20b87135d72e8d8be495c14;p=thirdparty%2Fhaproxy.git 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. --- 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;