]> git.kaiwu.me - haproxy.git/commitdiff
BUG/MINOR: mux_quic: prevent multiple STOP_SENDING emission per stream quic-interop
authorAmaury Denoyelle <adenoyelle@haproxy.com>
Wed, 1 Jul 2026 12:36:45 +0000 (14:36 +0200)
committerAmaury Denoyelle <adenoyelle@haproxy.com>
Fri, 3 Jul 2026 07:27:21 +0000 (09:27 +0200)
A QUIC stream may be aborted to ignore future data read. This also
prepares a STOP_SENDING frame to instruct the peer to close its write
channel.

This capability is exposed via qcc_abort_stream_read() which should be
guarded against multiple invokation for a single stream. This was
checked via QC_SF_TO_STOP_SENDING flag. However, this flag is resetted
once STOP_SENDING frame is emitted. Thus in theory it could be possible
to emit several STOP_SENDING for a single stream.

This patch improves this by using QC_SF_READ_ABORTED flag check. This
flag is set during qcc_abort_stream_read() and never removed even after
STOP_SENDING frame is emitted.

This bug was never encountered in a real situation. However, this patch
is necessary to definitely guarantee that it cannot occur.

This should be backported up to 2.8.

src/mux_quic.c

index ce0bc488e8ee10ec8215d82fade13cca8f303b57..3b8f40cf671022a3e4c2c053149f78a17fef2656 100644 (file)
@@ -1813,7 +1813,7 @@ void qcc_abort_stream_read(struct qcs *qcs)
 
        TRACE_ENTER(QMUX_EV_QCC_NEW, qcc->conn, qcs);
 
-       if ((qcs->flags & QC_SF_TO_STOP_SENDING) || qcs_is_close_remote(qcs))
+       if ((qcs->flags & QC_SF_READ_ABORTED) || qcs_is_close_remote(qcs))
                goto end;
 
        TRACE_STATE("abort stream read", QMUX_EV_QCS_END, qcc->conn, qcs);