Mercurial > hg > nginx
changeset 9238:392e8e2fd22a
Request body: explicit handling of NGX_AGAIN.
Request body reading indirectly uses the "do { c->recv() } while
(c->read->ready)" form, which is not really correct, as for example
with SSL c->read->ready may be still set when c->recv() returns NGX_AGAIN
due to SSL_ERROR_WANT_WRITE (see 7351:2b5528023f6b), and therefore this
form might be an infinite loop.
Added explicit NGX_AGAIN handling for the sake of correctness.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Sat, 30 Mar 2024 05:06:59 +0300 |
parents | 41db21d1ca7c |
children | b2e16e8639c8 |
files | src/http/ngx_http_request_body.c |
diffstat | 1 files changed, 2 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/http/ngx_http_request_body.c Sat Mar 30 05:06:15 2024 +0300 +++ b/src/http/ngx_http_request_body.c Sat Mar 30 05:06:59 2024 +0300 @@ -307,6 +307,7 @@ c = r->connection; rb = r->request_body; flush = 1; + n = NGX_AGAIN; ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http read client request body"); @@ -432,7 +433,7 @@ break; } - if (!c->read->ready || rb->rest == 0) { + if (n == NGX_AGAIN || !c->read->ready || rb->rest == 0) { clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); ngx_add_timer(c->read, clcf->client_body_timeout);