BUG/MINOR: quic: do not crash on CRYPTO ncbuf alloc failure
authorAmaury Denoyelle <adenoyelle@haproxy.com>
Fri, 18 Apr 2025 16:02:48 +0000 (18:02 +0200)
committerAmaury Denoyelle <adenoyelle@haproxy.com>
Tue, 22 Apr 2025 08:36:36 +0000 (10:36 +0200)
To handle out-of-order received CRYPTO frames, a ncbuf instance is
allocated. This is done via the helper quic_get_ncbuf().

Buffer allocation was improperly checked. In case b_alloc() fails, it
crashes due to a BUG_ON(). Fix this by removing it. The function now
returns NULL on allocation failure, which is already properly handled in
its caller qc_handle_crypto_frm().

This should fix the last reported crash from github issue #2935.

This must be backported up to 2.6.

(cherry picked from commit 4309a6fbf80240b0880c5adf091f0075c3bcd53f)
Signed-off-by: Amaury Denoyelle <adenoyelle@haproxy.com>
(cherry picked from commit 1c913c47cad4b00c9fef726b32b1a4240161a89e)
Signed-off-by: Amaury Denoyelle <adenoyelle@haproxy.com>

include/haproxy/quic_conn.h

index bc9dd15..9138a0a 100644 (file)
@@ -130,7 +130,11 @@ static inline void quic_conn_mv_cids_to_cc_conn(struct quic_conn_closed *cc_conn
 
 }
 
-/* Allocate the underlying required memory for <ncbuf> non-contiguous buffer */
+/* Allocate the underlying required memory for <ncbuf> non-contiguous buffer.
+ * Does nothing if buffer is already allocated.
+ *
+ * Returns the buffer instance or NULL on allocation failure.
+ */
 static inline struct ncbuf *quic_get_ncbuf(struct ncbuf *ncbuf)
 {
        struct buffer buf = BUF_NULL;
@@ -138,8 +142,8 @@ static inline struct ncbuf *quic_get_ncbuf(struct ncbuf *ncbuf)
        if (!ncb_is_null(ncbuf))
                return ncbuf;
 
-       b_alloc(&buf, DB_MUX_RX);
-       BUG_ON(b_is_null(&buf));
+       if (!b_alloc(&buf, DB_MUX_RX))
+               return NULL;
 
        *ncbuf = ncb_make(buf.area, buf.size, 0);
        ncb_init(ncbuf, 0);