From 1f035507af2bb5dfba51b844f2c57e5698e5c2e9 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Wed, 30 Jan 2019 11:44:07 +0100 Subject: [PATCH] BUG/MINOR: mux-h2: make sure request trailers on aborted streams don't break the connection 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 | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/mux_h2.c b/src/mux_h2.c index 640b06658..51e3ee9e7 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -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 */