]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR/OPTIM: mux-quic: do not allocate rxbuf on standalone FIN
authorAmaury Denoyelle <adenoyelle@haproxy.com>
Thu, 27 Feb 2025 10:35:41 +0000 (11:35 +0100)
committerAmaury Denoyelle <adenoyelle@haproxy.com>
Fri, 7 Mar 2025 11:06:26 +0000 (12:06 +0100)
STREAM FIN may be received without any payload. However, qcc_recv()
always called qcs_get_ncbuf() indiscriminately, which may allocate a QCS
Rx buffer. This is unneeded as there is no payload to store.

Improve this by skipping qcs_get_ncbuf() invokation when dealing with a
standalone FIN signal. This should prevent superfluous buffer
allocation.

src/mux_quic.c

index 1d1764e419283b0b7b97312a74668f4a3e14a24a..c343f8c9ec3f815a4a419f51861c3701f61581ae 100644 (file)
@@ -1575,12 +1575,6 @@ int qcc_recv(struct qcc *qcc, uint64_t id, uint64_t len, uint64_t offset,
                }
        }
 
-       if (!qcs_get_ncbuf(qcs, &qcs->rx.ncbuf) || ncb_is_null(&qcs->rx.ncbuf)) {
-               TRACE_ERROR("receive ncbuf alloc failure", QMUX_EV_QCC_RECV|QMUX_EV_QCS_RECV, qcc->conn, qcs);
-               qcc_set_error(qcc, QC_ERR_INTERNAL_ERROR, 0);
-               goto err;
-       }
-
        TRACE_DATA("newly received offset", QMUX_EV_QCC_RECV|QMUX_EV_QCS_RECV, qcc->conn, qcs);
        if (offset < qcs->rx.offset) {
                size_t diff = qcs->rx.offset - offset;
@@ -1591,6 +1585,12 @@ int qcc_recv(struct qcc *qcc, uint64_t id, uint64_t len, uint64_t offset,
        }
 
        if (len) {
+               if (!qcs_get_ncbuf(qcs, &qcs->rx.ncbuf) || ncb_is_null(&qcs->rx.ncbuf)) {
+                       TRACE_ERROR("receive ncbuf alloc failure", QMUX_EV_QCC_RECV|QMUX_EV_QCS_RECV, qcc->conn, qcs);
+                       qcc_set_error(qcc, QC_ERR_INTERNAL_ERROR, 0);
+                       goto err;
+               }
+
                ret = ncb_add(&qcs->rx.ncbuf, offset - qcs->rx.offset, data, len, NCB_ADD_COMPARE);
                switch (ret) {
                case NCB_RET_OK: