From: Willy Tarreau Date: Mon, 30 Oct 2017 10:46:49 +0000 (+0100) Subject: MINOR: h2: centralize the check for the idle streams X-Git-Tag: v1.8-rc1~12 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f65b80dd47da42743b13327e358709eddb0edb73;p=thirdparty%2Fhaproxy.git MINOR: h2: centralize the check for the idle streams RFC7540#5.1 is pretty clear : "any frame other than HEADERS or PRIORITY in this state MUST be treated as a connection error". Instead of dealing with this for each and every frame type, let's do it once for all in the main demux loop. --- diff --git a/src/mux_h2.c b/src/mux_h2.c index 0690839de9..5281952240 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -1216,10 +1216,6 @@ static int h2c_handle_window_update(struct h2c *h2c, struct h2s *h2s) if (h2c->dsi != 0) { /* stream window update */ - if (h2s->st == H2_SS_IDLE) { - error = H2_ERR_PROTOCOL_ERROR; - goto conn_err; - } /* it's not an error to receive WU on a closed stream */ if (h2s->st == H2_SS_CLOSED) @@ -1325,11 +1321,6 @@ static int h2c_handle_rst_stream(struct h2c *h2c, struct h2s *h2s) goto conn_err; } - if (h2s->st == H2_SS_IDLE) { - error = H2_ERR_PROTOCOL_ERROR; - goto conn_err; - } - if (h2c->dfl != 4) { error = H2_ERR_FRAME_SIZE_ERROR; goto conn_err; @@ -1612,6 +1603,16 @@ static void h2_process_demux(struct h2c *h2c) /* Only H2_CS_FRAME_P and H2_CS_FRAME_A here */ h2s = h2c_st_by_id(h2c, h2c->dsi); + if (h2s->st == H2_SS_IDLE && + h2c->dft != H2_FT_HEADERS && h2c->dft != H2_FT_PRIORITY) { + /* RFC7540#5.1: any frame other than HEADERS or PRIORITY in + * this state MUST be treated as a connection error + */ + h2c_error(h2c, H2_ERR_PROTOCOL_ERROR); + h2c->st0 = H2_CS_ERROR; + break; + } + switch (h2c->dft) { case H2_FT_SETTINGS: if (h2c->st0 == H2_CS_FRAME_P)