]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
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)
committerWilly Tarreau <w@1wt.eu>
Fri, 19 Nov 2021 11:10:02 +0000 (12:10 +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.

src/mux_h2.c

index e186d0b1bdf4dbb46c26b89d43c1c177c3048b37..6338cf02c0e93bd9bb09e7e1895eefa7f95330b0 100644 (file)
@@ -3689,7 +3689,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;
        }
 
        if (!b_data(buf)) {