From c17c31c822dc4a5f3270f6ae4f96afa50fb7390f Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Tue, 1 Feb 2022 18:25:06 +0100 Subject: [PATCH] BUG/MEDIUM: mux-h1: Don't wake h1s if mux is blocked on lack of output buffer After sending some data, we try to wake the H1 stream to resume data processing at the stream level, except if the output buffer is still full. However we must also be sure the mux is not blocked because of an allocation failure on this buffer. Otherwise, it may lead to a ping-pong loop between the stream and the mux to send more data with an unallocated output buffer. Note there is a mechanism to queue buffers allocations when a failure happens. However this mechanism is totally broken since the filters were introducted in HAProxy 1.7. And it is worse now with the multiplexers. So this patch fixes a possible loop needlessly consuming all the CPU. But buffer allocation failures must remain pretty rare. This patch must be backported as far as 2.0. --- src/mux_h1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mux_h1.c b/src/mux_h1.c index 1f8cad245..4605c9577 100644 --- a/src/mux_h1.c +++ b/src/mux_h1.c @@ -2840,7 +2840,7 @@ static int h1_send(struct h1c *h1c) } end: - if (!(h1c->flags & H1C_F_OUT_FULL)) + if (!(h1c->flags & (H1C_F_OUT_FULL|H1C_F_OUT_ALLOC))) h1_wake_stream_for_send(h1c->h1s); /* We're done, no more to send */