From: Christopher Faulet Date: Fri, 26 Nov 2021 16:26:19 +0000 (+0100) Subject: BUG/MINOR: mux-h1: Fix splicing for messages with unknown length X-Git-Tag: v2.5.1~27 X-Git-Url: http://git.haproxy.org/?a=commitdiff_plain;h=a04ccb116df4f54564990638076840d61e31507e;p=haproxy-2.5.git BUG/MINOR: mux-h1: Fix splicing for messages with unknown length Splicing was disabled fo Messages with an unknown length (no C-L or T-E header) with no valid reason. So now, it is possible to use the kernel splicing for such messages. This patch should be backported as far as 2.4. (cherry picked from commit f5ce320156c1a1233755440dad766e7b2b401c0a) Signed-off-by: Willy Tarreau --- diff --git a/src/mux_h1.c b/src/mux_h1.c index 226a077..3d5a24f 100644 --- a/src/mux_h1.c +++ b/src/mux_h1.c @@ -1730,8 +1730,7 @@ static size_t h1_process_demux(struct h1c *h1c, struct buffer *buf, size_t count } /* Here h1s->cs is always defined */ - if (!(h1m->flags & H1_MF_CHNK) && - ((h1m->state == H1_MSG_DATA && h1m->curr_len) || (h1m->state == H1_MSG_TUNNEL))) { + if (!(h1m->flags & H1_MF_CHNK) && (h1m->state == H1_MSG_DATA || (h1m->state == H1_MSG_TUNNEL))) { TRACE_STATE("notify the mux can use splicing", H1_EV_RX_DATA|H1_EV_RX_BODY, h1c->conn, h1s); h1s->cs->flags |= CS_FL_MAY_SPLICE; } @@ -3585,11 +3584,11 @@ static int h1_rcv_pipe(struct conn_stream *cs, struct pipe *pipe, unsigned int c goto end; } - if (h1m->state == H1_MSG_DATA && count > h1m->curr_len) + if (h1m->state == H1_MSG_DATA && (h1m->flags & H1_MF_CLEN) && count > h1m->curr_len) count = h1m->curr_len; ret = cs->conn->xprt->rcv_pipe(cs->conn, cs->conn->xprt_ctx, pipe, count); if (ret >= 0) { - if (h1m->state == H1_MSG_DATA) { + if (h1m->state == H1_MSG_DATA && (h1m->flags & H1_MF_CLEN)) { if (ret > h1m->curr_len) { h1s->flags |= H1S_F_PARSING_ERROR; h1c->flags |= H1C_F_ST_ERROR; @@ -3645,7 +3644,7 @@ static int h1_snd_pipe(struct conn_stream *cs, struct pipe *pipe) } ret = cs->conn->xprt->snd_pipe(cs->conn, cs->conn->xprt_ctx, pipe); - if (h1m->state == H1_MSG_DATA) { + if (h1m->state == H1_MSG_DATA && (h1m->flags & H1_MF_CLEN)) { if (ret > h1m->curr_len) { h1s->flags |= H1S_F_PROCESSING_ERROR; h1c->flags |= H1C_F_ST_ERROR;