BUG/MAJOR: mux-quic: properly fix BUG_ON on empty STREAM emission
authorAmaury Denoyelle <adenoyelle@haproxy.com>
Thu, 2 Jan 2025 09:59:43 +0000 (10:59 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Mon, 6 Jan 2025 10:32:18 +0000 (11:32 +0100)
Properly fix BUG_ON() occurence when QUIC MUX emits only empty STREAM
frames. This was addressed by a previous patch but it causes another
regression so a revert was needed.

BUG_ON() on qcc_build_frms() return value is invalid. Indeed,
qcc_build_frms() may return 0, but this does not imply that frame list
is empty, as encoded frames can have a zero length payload. As such,
simply remove this invalid BUG_ON().

This must be backported up to 3.1.

(cherry picked from commit ddfd8031f895b448604cbc259f74e6cb7b086b0b)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>

src/mux_quic.c

index ae61a07..18d3c99 100644 (file)
@@ -2389,7 +2389,9 @@ static int qcc_emit_rs_ss(struct qcc *qcc)
  * error occured during this step, this is considered as fatal. Tx frms is
  * cleared and 0 is returned.
  *
- * Returns the sum of encoded STREAM frames length or 0 if no frame built.
+ * Returns the sum of encoded payload STREAM frames length. Note that 0 can be
+ * returned either if no frame was built or only empty payload frames were
+ * encoded.
  */
 static int qcc_build_frms(struct qcc *qcc, struct list *qcs_failed)
 {
@@ -2505,10 +2507,8 @@ static int qcc_io_send(struct qcc *qcc)
        /* Encode new STREAM frames if list has been previously cleared. */
        if (LIST_ISEMPTY(frms) && !LIST_ISEMPTY(&qcc->send_list)) {
                total = qcc_build_frms(qcc, &qcs_failed);
-               if (!total) {
-                       BUG_ON(!LIST_ISEMPTY(frms));
+               if (LIST_ISEMPTY(frms))
                        goto out;
-               }
        }
 
        if (qcc_is_pacing_active(qcc->conn)) {