Skip to content

Commit

Permalink
HTTP/2: discard remaining request body after redirect.
Browse files Browse the repository at this point in the history
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;
    }
  • Loading branch information
pluknet committed Aug 19, 2019
1 parent 1f960ed commit 9cb22ef
Showing 1 changed file with 9 additions and 2 deletions.
11 changes: 9 additions & 2 deletions src/http/v2/ngx_http_v2.c
Original file line number Diff line number Diff line change
Expand Up @@ -947,15 +947,22 @@ 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) {
size = h2c->state.length;
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);

Expand Down

0 comments on commit 9cb22ef

Please sign in to comment.