Fix for "return 202" not discarding body.

Big POST (not fully preread) to a

    location / {
        return 202;
    }

resulted in incorrect behaviour due to "return" code path not calling
ngx_http_discard_request_body().  The same applies to all "return" used
with 2xx/3xx codes except 201 and 204, and to all "return ... text" uses.

Fix is to add ngx_http_discard_request_body() call to ngx_http_send_response()
function where it looks appropriate.  Discard body call from emtpy gif module
removed as it's now redundant.

Reported by Pyry Hakulinen, see
http://mailman.nginx.org/pipermail/nginx/2011-August/028503.html
This commit is contained in:
Maxim Dounin 2011-09-27 11:13:00 +00:00
parent 723e834e74
commit 7a5a17bc76
2 changed files with 4 additions and 7 deletions

View file

@ -111,19 +111,12 @@ static ngx_str_t ngx_http_gif_type = ngx_string("image/gif");
static ngx_int_t static ngx_int_t
ngx_http_empty_gif_handler(ngx_http_request_t *r) ngx_http_empty_gif_handler(ngx_http_request_t *r)
{ {
ngx_int_t rc;
ngx_http_complex_value_t cv; ngx_http_complex_value_t cv;
if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) { if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {
return NGX_HTTP_NOT_ALLOWED; return NGX_HTTP_NOT_ALLOWED;
} }
rc = ngx_http_discard_request_body(r);
if (rc != NGX_OK) {
return rc;
}
ngx_memzero(&cv, sizeof(ngx_http_complex_value_t)); ngx_memzero(&cv, sizeof(ngx_http_complex_value_t));
cv.value.len = sizeof(ngx_empty_gif); cv.value.len = sizeof(ngx_empty_gif);

View file

@ -1784,6 +1784,10 @@ ngx_http_send_response(ngx_http_request_t *r, ngx_uint_t status,
ngx_buf_t *b; ngx_buf_t *b;
ngx_chain_t out; ngx_chain_t out;
if (ngx_http_discard_request_body(r) != NGX_OK) {
return NGX_HTTP_INTERNAL_SERVER_ERROR;
}
r->headers_out.status = status; r->headers_out.status = status;
if (status == NGX_HTTP_NO_CONTENT) { if (status == NGX_HTTP_NO_CONTENT) {