From: Christopher Faulet Date: Wed, 28 Feb 2024 13:46:56 +0000 (+0100) Subject: BUG/MINOR: mux-h1: Properly report when mux is blocked during a nego X-Git-Tag: v3.0-dev5~51 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=81f75d32b223e9deb56db910857509d162070293;p=thirdparty%2Fhaproxy.git BUG/MINOR: mux-h1: Properly report when mux is blocked during a nego During a zero-copy forwarding negociation, if the H1 mux is blocked for any reason, the IOBUF_FL_FF_BLOCKED flag must be set on its iobuf to notfiy the producer it must wait. However, there were two places where it was not performed: when the output buffer allocation failed and when the chunk formatting failed. This patch fixes the issue. It must be backported to 2.9. --- diff --git a/src/mux_h1.c b/src/mux_h1.c index aa224d34f7..18abebc24b 100644 --- a/src/mux_h1.c +++ b/src/mux_h1.c @@ -4487,8 +4487,10 @@ static size_t h1_nego_ff(struct stconn *sc, struct buffer *input, size_t count, else { BUG_ON(h1m->state != H1_MSG_CHUNK_CRLF && h1m->state != H1_MSG_CHUNK_SIZE); if (flags & NEGO_FF_FL_EXACT_SIZE) { - if (!h1_make_chunk(h1s, h1m, count)) + if (!h1_make_chunk(h1s, h1m, count)) { + h1s->sd->iobuf.flags |= IOBUF_FL_FF_BLOCKED; goto out; + } h1m->curr_len = count; } else { @@ -4531,6 +4533,7 @@ static size_t h1_nego_ff(struct stconn *sc, struct buffer *input, size_t count, no_splicing: if (!h1_get_buf(h1c, &h1c->obuf)) { h1c->flags |= H1C_F_OUT_ALLOC; + h1s->sd->iobuf.flags |= IOBUF_FL_FF_BLOCKED; TRACE_STATE("waiting for opposite h1c obuf allocation", H1_EV_STRM_SEND|H1_EV_H1S_BLK, h1c->conn, h1s); goto out; }