From: Willy Tarreau Date: Fri, 5 Feb 2021 11:16:01 +0000 (+0100) Subject: BUG/MEDIUM: mux-h2: do not quit the demux loop before setting END_REACHED X-Git-Tag: v2.4-dev7~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=133aaa9f110f5b78e57a23f9db0553e2978eca0e;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: mux-h2: do not quit the demux loop before setting END_REACHED The demux loop could quit on missing data but the H2_CF_END_REACHED flag would not be set in this case. This fixes a remaining situation where previous commit f09612289 ("BUG/MEDIUM: mux-h2: handle remaining read0 cases") could not be sufficient and still leave CLOSE_WAIT. It's harder to reproduce but was still observed in prod. Now we quit via the end of the loop which already takes care of shutr. This should be backported along with the patch above as far as 2.0. --- diff --git a/src/mux_h2.c b/src/mux_h2.c index c6425164de..70d9b024d7 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -3178,7 +3178,7 @@ static void h2_process_demux(struct h2c *h2c) if (!b_data(&h2c->dbuf)) { TRACE_DEVEL("no more Rx data", H2_EV_RX_FRAME, h2c->conn); - break; + goto dbuf_empty; } if (h2c->st0 >= H2_CS_ERROR) { @@ -3419,6 +3419,7 @@ static void h2_process_demux(struct h2c *h2c) ret = h2c_send_rst_stream(h2c, h2s); } + dbuf_empty: /* error or missing data condition met above ? */ if (ret <= 0) { TRACE_DEVEL("insufficient data to proceed", H2_EV_RX_FRAME, h2c->conn, h2s);