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.
This commit is contained in:
Amaury Denoyelle 2022-04-29 15:57:49 +02:00
parent 4173f4ea29
commit d46e335683

View File

@ -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;