summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorPiotr Sikora <piotrsikora@google.com>2015-10-01 20:25:55 -0700
committerPiotr Sikora <piotrsikora@google.com>2015-10-01 20:25:55 -0700
commit71a6b600c25639cc7452a817806d3bf40149bf95 (patch)
tree2de33e43d27ec8647cc3ac00d5c837529cfb4c7f
parent79a03b3ff6d950e60a06c6d979bd7a909709e82d (diff)
downloadnginx-71a6b600c25639cc7452a817806d3bf40149bf95.tar.gz
nginx-71a6b600c25639cc7452a817806d3bf40149bf95.tar.bz2
HTTP/2: reject self-dependent streams.
Per RFC7540, a stream cannot depend on itself. Previously, this requirement was enforced on PRIORITY frames, but not on HEADERS frames and due to the implementation details nginx worker would crash (stack overflow) while opening self-dependent stream. Found with afl-fuzz. Signed-off-by: Piotr Sikora <piotrsikora@google.com>
-rw-r--r--src/http/v2/ngx_http_v2.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/http/v2/ngx_http_v2.c b/src/http/v2/ngx_http_v2.c
index 91f7bc9e1..6cca2b9a3 100644
--- a/src/http/v2/ngx_http_v2.c
+++ b/src/http/v2/ngx_http_v2.c
@@ -1133,6 +1133,22 @@ ngx_http_v2_state_headers(ngx_http_v2_connection_t *h2c, u_char *pos,
h2c->last_sid = h2c->state.sid;
+ if (depend == h2c->state.sid) {
+ ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
+ "client sent HEADERS frame for stream %ui "
+ "with incorrect dependency", h2c->state.sid);
+
+ if (ngx_http_v2_send_rst_stream(h2c, h2c->state.sid,
+ NGX_HTTP_V2_PROTOCOL_ERROR)
+ != NGX_OK)
+ {
+ return ngx_http_v2_connection_error(h2c,
+ NGX_HTTP_V2_INTERNAL_ERROR);
+ }
+
+ return ngx_http_v2_state_skip_headers(h2c, pos, end);
+ }
+
h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx,
ngx_http_v2_module);