]> git.kaiwu.me - haproxy.git/commitdiff
BUG/MINOR: mux-quic: Fix handling EOM after in qcs_http_rcv_buf()
authorChristopher Faulet <cfaulet@haproxy.com>
Wed, 1 Jul 2026 13:45:10 +0000 (15:45 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Thu, 2 Jul 2026 15:03:54 +0000 (17:03 +0200)
In qcs_http_rcv_buf() function, when the buffers cannot be swapped and
htx_xfer() function is called, the way the EOM flag is handled is buggy. The
htx_xfer() function is responsible to tranfer HTX flags from the QCS message
to the CS one. And when it is performed, HTX flags of the original message
are reset.

So, the following test on the EOM flag when the QCS message is empty is
never true. Because of this bug, QC_SF_EOI_SUSPENDED flag is never tested on
this code path and <fin> variable is not set to 1 as expected.

To fix the issue, we must test the EOM flag on the CS message.

This patch must be backported to 3.4.

src/qcm_http.c

index f028cb992f37e2ca9d5456197c94334f3bc173bb..1593d428e8d91e1ff99bb7b02131d63d394fbfd5 100644 (file)
@@ -47,9 +47,8 @@ size_t qcs_http_rcv_buf(struct qcs *qcs, struct buffer *buf, size_t count,
        htx_xfer(cs_htx, qcs_htx, count, HTX_XFER_DEFAULT);
        BUG_ON(qcs_htx->flags & HTX_FL_PARSING_ERROR);
 
-       /* Copy EOM from src to dst buffer if all data copied. */
-       if (htx_is_empty(qcs_htx) && (qcs_htx->flags & HTX_FL_EOM)) {
-               cs_htx->flags |= HTX_FL_EOM;
+       /* EOM was copied to cs_htx if all data were copied. */
+       if (cs_htx->flags & HTX_FL_EOM) {
                if (!(qcs->flags & QC_SF_EOI_SUSPENDED))
                        *fin = 1;
        }