]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: mux-h1: Disable reads if an error was reported on the H1 stream
authorChristopher Faulet <cfaulet@haproxy.com>
Wed, 30 Sep 2020 15:33:22 +0000 (17:33 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Fri, 4 Dec 2020 13:41:49 +0000 (14:41 +0100)
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.

src/mux_h1.c

index 682776f558bb80cda84f76bae568a7ffbcd395c7..fa5c2da7f7a934a72e8e5a39cdd9847c4352898e 100644 (file)
@@ -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;