BUG/MEDIUM: mux-h2: always process a pending shut read
authorWilly Tarreau <w@1wt.eu>
Fri, 19 Nov 2021 10:41:10 +0000 (11:41 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Tue, 23 Nov 2021 15:34:07 +0000 (16:34 +0100)
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 <cfaulet@haproxy.com>
(cherry picked from commit 49acac00e81027b44730a97927f7e5b2166b84ab)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>

src/mux_h2.c

index b40fffc..b490170 100644 (file)
@@ -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);