From: Amaury Denoyelle Date: Thu, 27 Feb 2025 10:35:41 +0000 (+0100) Subject: MINOR/OPTIM: mux-quic: do not allocate rxbuf on standalone FIN X-Git-Tag: v3.2-dev7~12 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=20dc8e4ec27672025c30d554a4dd29378b00ea37;p=thirdparty%2Fhaproxy.git MINOR/OPTIM: mux-quic: do not allocate rxbuf on standalone FIN 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. --- diff --git a/src/mux_quic.c b/src/mux_quic.c index 1d1764e41..c343f8c9e 100644 --- a/src/mux_quic.c +++ b/src/mux_quic.c @@ -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: