From: Olivier Houchard Date: Wed, 19 Dec 2018 17:16:17 +0000 (+0100) Subject: BUG/MEDIUM: h2: Don't wait for flow control if the connection had a shutr. X-Git-Tag: v1.9.0~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6dea2ee93983ae1530f8202d5bb60e41c85fab2c;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: h2: Don't wait for flow control if the connection had a shutr. In h2_snd_buf(), if we couldn't send the data because of flow control, and the connection got a shutr, then add CS_FL_ERROR (or CS_FL_ERR_PENDING). We will never get any window update, so we will never be unlocked, anyway. No backport is needed. --- diff --git a/src/mux_h2.c b/src/mux_h2.c index faa5d0bcc2..0b28c38c95 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -4865,6 +4865,18 @@ static size_t h2_snd_buf(struct conn_stream *cs, struct buffer *buf, size_t coun tasklet_wakeup(h2s->h2c->wait_event.task); } + /* If we're waiting for flow control, and we got a shutr on the + * connection, we will never be unlocked, so add an error on + * the conn_stream. + */ + if (conn_xprt_read0_pending(h2s->h2c->conn) && + !b_data(&h2s->h2c->dbuf) && + (h2s->flags & (H2_SF_BLK_SFCTL | H2_SF_BLK_MFCTL))) { + if (cs->flags & CS_FL_EOS) + cs->flags |= CS_FL_ERROR; + else + cs->flags |= CS_FL_ERR_PENDING; + } return total; }