From: Frédéric Lécaille Date: Mon, 21 Mar 2022 10:37:13 +0000 (+0100) Subject: BUG/MINOR: quic: 1RTT packets ignored after mux was released X-Git-Tag: v2.6-dev4~32 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=12aa26b6fd3eef3b8b176631ca0387cb57053bd1;p=thirdparty%2Fhaproxy.git BUG/MINOR: quic: 1RTT packets ignored after mux was released We must be able to handle 1RTT packets after the mux has terminated its job (qc->mux_state == QC_MUX_RELEASED). So the condition (qc->mux_state != QC_MUX_READY) in qc_qel_may_rm_hp() is not correct when we want to wait for the mux to be started. Add a check in qc_parse_pkt_frms() to ensure is started before calling it. All the STREAM frames will be ignored when the mux will be released. --- diff --git a/src/xprt_quic.c b/src/xprt_quic.c index 3e4dd9290c..b9723d9372 100644 --- a/src/xprt_quic.c +++ b/src/xprt_quic.c @@ -2428,6 +2428,10 @@ 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. */ + if (qc->mux_state != QC_MUX_READY) + break; + if (!qc_handle_strm_frm(pkt, stream, qc)) goto err; @@ -3374,7 +3378,7 @@ static int qc_qel_may_rm_hp(struct quic_conn *qc, struct quic_enc_level *qel) /* check if the connection layer is ready before using app level */ if ((tel == QUIC_TLS_ENC_LEVEL_APP || tel == QUIC_TLS_ENC_LEVEL_EARLY_DATA) && - qc->mux_state != QC_MUX_READY) + qc->mux_state == QC_MUX_NULL) return 0; return 1;