From 3b7f63a17a89c9390af2b53e1f1f37974fc7e151 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 19 Nov 2021 11:41:10 +0100 Subject: [PATCH] BUG/MEDIUM: mux-h2: always process a pending shut read During 2.4-dev, an issue with partial frames was fixed with commit 3d4631fec ("BUG/MEDIUM: mux-h2: fix read0 handling on partial frames"). However this patch is not completely correct. It makes h2_recv() return 0 if the connection was shut for reads, but this not make h2_io_cb() call h2_process(), so if there are any pending data left in the demux buffer, they will never be processed, and the I/O callback will be called in loops forever from the poller. The correct return value there is 1, as is done at the end of the function to report a pending read0. This should definitely fix issue #1328. However even after a lot of tests I couldn't manage to reproduce it, the conditions to enter that situation are quite racy. This must be backported to 2.0 since the fix above was merged into 2.0.21 and 2.2.9. (cherry picked from commit 3a8bbcc38e3fe623fe9a9f2d61f483d4e3936fc5) Signed-off-by: Christopher Faulet (cherry picked from commit 49acac00e81027b44730a97927f7e5b2166b84ab) Signed-off-by: Christopher Faulet --- src/mux_h2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mux_h2.c b/src/mux_h2.c index b40fffc..b490170 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -3596,7 +3596,7 @@ static int h2_recv(struct h2c *h2c) if (h2c->flags & H2_CF_RCVD_SHUT) { TRACE_DEVEL("leaving on rcvd_shut", H2_EV_H2C_RECV, h2c->conn); - return 0; + return 1; } b_realign_if_empty(buf); -- 1.7.10.4