]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: mux-h2: make sure request trailers on aborted streams don't break the...
authorWilly Tarreau <w@1wt.eu>
Wed, 30 Jan 2019 10:44:07 +0000 (11:44 +0100)
committerWilly Tarreau <w@1wt.eu>
Wed, 30 Jan 2019 18:37:20 +0000 (19:37 +0100)
We used to respond a connection error in case we received a trailers
frame on a closed stream, but it's a problem to do this if the error
was caused by a reset because the sender has not yet received it and
is just a victim of the timing. Thus we must not close the connection
in this case.

This patch may be backported to 1.9 but then it requires the following
previous ones :
   MINOR: h2: add a generic frame checker
   MEDIUM: mux-h2: check the frame validity before considering the stream state
   CLEANUP: mux-h2: remove stream ID and frame length checks from the frame parsers

src/mux_h2.c

index 640b06658fb03d91af009e39bedb448cbe815bb3..51e3ee9e712e0fd9c4bbcc9a82acea988ec3e05b 100644 (file)
@@ -1854,9 +1854,12 @@ static struct h2s *h2c_frt_handle_headers(struct h2c *h2c, struct h2s *h2s)
                                goto out;
                        goto done;
                }
-               error = H2_ERR_PROTOCOL_ERROR;
-               sess_log(h2c->conn->owner);
-               goto conn_err;
+               /* the connection was already killed by an RST, let's consume
+                * the data and send another RST.
+                */
+               error = h2c_decode_headers(h2c, &rxbuf, &flags, &body_len);
+               h2s = (struct h2s*)h2_error_stream;
+               goto send_rst;
        }
        else if (h2c->dsi <= h2c->max_id || !(h2c->dsi & 1)) {
                /* RFC7540#5.1.1 stream id > prev ones, and must be odd here */