aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSergey Kandaurov <pluknet@nginx.com>2019-08-19 15:16:06 +0300
committerSergey Kandaurov <pluknet@nginx.com>2019-08-19 15:16:06 +0300
commit9cb22efa3fe947f8474338b99d389a35da177bb9 (patch)
tree9f4f5eb35871d230cb084226c132f25f20b1fe0d /src
parent1f960ed92a632cc60ac22c34237fe2f0eb1f8658 (diff)
downloadnginx-9cb22efa3fe947f8474338b99d389a35da177bb9.tar.gz
nginx-9cb22efa3fe947f8474338b99d389a35da177bb9.zip
HTTP/2: discard remaining request body after redirect.
Previously, if unbuffered request body reading wasn't finished before the request was redirected to a different location using error_page or X-Accel-Redirect, and the request body is read again, this could lead to disastrous effects, such as a duplicate post_handler call or "http request count is zero" alert followed by a segmentation fault. This happened in the following configuration (ticket #1819): location / { proxy_request_buffering off; proxy_pass http://bad; proxy_intercept_errors on; error_page 502 = /error; } location /error { proxy_pass http://backend; }
Diffstat (limited to 'src')
-rw-r--r--src/http/v2/ngx_http_v2.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/http/v2/ngx_http_v2.c b/src/http/v2/ngx_http_v2.c
index e55f9bab6..d80f8745a 100644
--- a/src/http/v2/ngx_http_v2.c
+++ b/src/http/v2/ngx_http_v2.c
@@ -947,6 +947,15 @@ ngx_http_v2_state_read_data(ngx_http_v2_connection_t *h2c, u_char *pos,
return ngx_http_v2_state_skip_padded(h2c, pos, end);
}
+ r = stream->request;
+
+ if (r->reading_body && !r->request_body_no_buffering) {
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+ "skipping http2 DATA frame");
+
+ return ngx_http_v2_state_skip_padded(h2c, pos, end);
+ }
+
size = end - pos;
if (size >= h2c->state.length) {
@@ -954,8 +963,6 @@ ngx_http_v2_state_read_data(ngx_http_v2_connection_t *h2c, u_char *pos,
stream->in_closed = h2c->state.flags & NGX_HTTP_V2_END_STREAM_FLAG;
}
- r = stream->request;
-
if (r->request_body) {
rc = ngx_http_v2_process_request_body(r, pos, size, stream->in_closed);