From: Christopher Faulet Date: Wed, 30 Sep 2020 15:33:22 +0000 (+0200) Subject: MINOR: mux-h1: Disable reads if an error was reported on the H1 stream X-Git-Tag: v2.4-dev3~74 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=119ac870ce38183b362287be4e43f688964195ef;p=thirdparty%2Fhaproxy.git MINOR: mux-h1: Disable reads if an error was reported on the H1 stream Don't try to read more data if a parsing or a formatting error was reported on the H1 stream. There is no reason to continue to process the messages for the current connection in this case. If a parsing error occurs, it means the input is invalid. If a formatting error occurs, it is an internal error and it is probably safer to give up. --- diff --git a/src/mux_h1.c b/src/mux_h1.c index 682776f558..fa5c2da7f7 100644 --- a/src/mux_h1.c +++ b/src/mux_h1.c @@ -356,11 +356,14 @@ static void h1_trace(enum trace_level level, uint64_t mask, const struct trace_s /* * Indicates whether or not we may receive data. The rules are the following : * - if an error or a shutdown for reads was detected on the connection we - must not attempt to receive + * must not attempt to receive + * - if we are waiting for the connection establishment, we must not attempt + * to receive + * - if an error was detected on the stream we must not attempt to receive + * - if reads are explicitly disabled, we must not attempt to receive * - if the input buffer failed to be allocated or is full , we must not try * to receive - * - if he input processing is busy waiting for the output side, we may - * attempt to receive + * - if the mux is not blocked on an input condition, we may attempt to receive * - otherwise must may not attempt to receive */ static inline int h1_recv_allowed(const struct h1c *h1c) @@ -375,6 +378,11 @@ static inline int h1_recv_allowed(const struct h1c *h1c) return 0; } + if (h1c->h1s && (h1c->h1s->flags & H1S_F_ERROR)) { + TRACE_DEVEL("recv not allowed because of error on h1s", H1_EV_H1C_RECV|H1_EV_H1C_BLK, h1c->conn); + return 0; + } + if (h1c->flags & H1C_F_WAIT_OPPOSITE) { TRACE_DEVEL("recv not allowed (wait_opposite)", H1_EV_H1C_RECV|H1_EV_H1C_BLK, h1c->conn); return 0;