]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: quic: Stream FIN bit fix in qcs_push_frame()
authorFrédéric Lécaille <flecaille@haproxy.com>
Mon, 20 Sep 2021 15:50:03 +0000 (17:50 +0200)
committerAmaury Denoyelle <adenoyelle@haproxy.com>
Thu, 23 Sep 2021 13:27:25 +0000 (15:27 +0200)
The FIN of a STREAM frame to be built must be set if there is no more
at all data in the ring buffer.
Do not do anything if there is nothing to transfer the ->tx.buf mux
buffer via b_force_xfer() (without zero copy)

src/mux_quic.c

index 8b96b6fd9ad4f5a4e21bdc999e52e28d2c18b762..707769fa139e432616f5d55a8feab57ac4e43e59 100644 (file)
@@ -1295,14 +1295,19 @@ static int qcs_push_frame(struct qcs *qcs, struct buffer *payload, int fin, uint
        struct quic_frame *frm;
        struct buffer *buf = &qcs->tx.buf;
        struct quic_enc_level *qel = &qcs->qcc->conn->qc->els[QUIC_TLS_ENC_LEVEL_APP];
-       int total = 0;
+       int total = 0, to_xfer;
 
        qc_get_buf(qcs->qcc, buf);
-       total = b_force_xfer(buf, payload, QUIC_MIN(b_data(payload), b_room(buf)));
+       to_xfer = QUIC_MIN(b_data(payload), b_room(buf));
+       if (!to_xfer)
+               goto out;
+
        frm = pool_zalloc(pool_head_quic_frame);
        if (!frm)
                goto err;
 
+       total = b_force_xfer(buf, payload, to_xfer);
+       fin = fin && !b_data(payload);
        frm->type = QUIC_FT_STREAM_8;
        if (fin)
                frm->type |= QUIC_STREAM_FRAME_TYPE_FIN_BIT;
@@ -1319,6 +1324,7 @@ static int qcs_push_frame(struct qcs *qcs, struct buffer *payload, int fin, uint
        }
 
        MT_LIST_APPEND(&qel->pktns->tx.frms, &frm->mt_list);
+ out:
        fprintf(stderr, "%s: total=%d fin=%d offset=%lu\n", __func__, total, fin, offset);
        return total;