From: Amaury Denoyelle Date: Wed, 5 Jun 2024 09:37:44 +0000 (+0200) Subject: BUG/MINOR: quic: fix computed length of emitted STREAM frames X-Git-Tag: v3.1-dev1~61 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=50470a5181b6105ad1914c0d4e67794a2f69c80a;p=thirdparty%2Fhaproxy.git BUG/MINOR: quic: fix computed length of emitted STREAM frames qc_build_frms() is responsible to encode multiple frames in a single QUIC packet. It accounts for room left in the buffer packet for each newly encded frame. An incorrect computation was performed when encoding a STREAM frame in a single packet. Frame length was accounted twice which would reduce in excess the buffer packet room. This caused the remaining built frames to be reduced with the resulting packet not able to fill the whole MTU. The impact of this bug should be minimal. It is only present when multiple frames are encoded in a single packet after a STREAM. However in this case datagrams built are smaller than expecting, which is suboptimal for bandwith. This should be backported up to 2.6. --- diff --git a/src/quic_tx.c b/src/quic_tx.c index 6d487ebd07..3b710ecb32 100644 --- a/src/quic_tx.c +++ b/src/quic_tx.c @@ -1425,6 +1425,7 @@ static int qc_build_frms(struct list *outlist, struct list *inlist, ret = 0; if (*len > room) goto leave; + room -= *len; /* If we are not probing we must take into an account the congestion * control window. @@ -1458,8 +1459,8 @@ static int qc_build_frms(struct list *outlist, struct list *inlist, QUIC_EV_CONN_BCFRMS, qc, &room, len); /* Compute the length of this CRYPTO frame header */ hlen = 1 + quic_int_getsize(cf->crypto.offset); - /* Compute the data length of this CRyPTO frame. */ - dlen = max_stream_data_size(room, *len + hlen, cf->crypto.len); + /* Compute the data length of this CRYPTO frame. */ + dlen = max_stream_data_size(room, hlen, cf->crypto.len); TRACE_DEVEL(" CRYPTO data length (hlen, crypto.len, dlen)", QUIC_EV_CONN_BCFRMS, qc, &hlen, &cf->crypto.len, &dlen); if (!dlen) @@ -1550,7 +1551,7 @@ static int qc_build_frms(struct list *outlist, struct list *inlist, hlen = 1 + quic_int_getsize(cf->stream.id) + ((cf->type & QUIC_STREAM_FRAME_TYPE_OFF_BIT) ? quic_int_getsize(cf->stream.offset.key) : 0); /* Compute the data length of this STREAM frame. */ - avail_room = room - hlen - *len; + avail_room = room - hlen; if ((ssize_t)avail_room <= 0) continue;