diff options
author | Valentin Bartenev <vbart@nginx.com> | 2017-06-28 22:48:13 +0300 |
---|---|---|
committer | Valentin Bartenev <vbart@nginx.com> | 2017-06-28 22:48:13 +0300 |
commit | e4afc6ae9871d7e2cd13c81f2a7fe1535ea574c5 (patch) | |
tree | 7c14784a01f04c650c1aa0d913f8ce1b5fa3649e /src/nxt_controller.c | |
parent | 53074c3b2905061d3a7cf32f20d7dc481efc488a (diff) | |
download | unit-e4afc6ae9871d7e2cd13c81f2a7fe1535ea574c5.tar.gz unit-e4afc6ae9871d7e2cd13c81f2a7fe1535ea574c5.tar.bz2 |
Controller: fixed reading of request body.
Diffstat (limited to '')
-rw-r--r-- | src/nxt_controller.c | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/src/nxt_controller.c b/src/nxt_controller.c index 83562b7b..6898be6d 100644 --- a/src/nxt_controller.c +++ b/src/nxt_controller.c @@ -301,7 +301,7 @@ nxt_controller_conn_read(nxt_task_t *task, void *obj, void *data) preread = nxt_buf_mem_used_size(&b->mem); nxt_debug(task, "controller request header parsing complete, " - "body length: %O, preread: %uz", + "body length: %uz, preread: %uz", r->length, preread); if (preread >= r->length) { @@ -382,27 +382,25 @@ static const nxt_event_conn_state_t nxt_controller_conn_body_read_state static void nxt_controller_conn_body_read(nxt_task_t *task, void *obj, void *data) { - size_t rest; - nxt_buf_t *b; - nxt_conn_t *c; + size_t read; + nxt_buf_t *b; + nxt_conn_t *c; + nxt_controller_request_t *r; c = obj; - - nxt_debug(task, "controller conn body read"); - + r = data; b = c->read; - rest = nxt_buf_mem_free_size(&b->mem); + read = nxt_buf_mem_used_size(&b->mem); - if (rest == 0) { - nxt_debug(task, "controller conn body read complete"); + nxt_debug(task, "controller conn body read: %uz of %uz", + read, r->length); + if (read >= r->length) { nxt_controller_process_request(task, c, data); return; } - nxt_debug(task, "controller conn body read again, rest: %uz", rest); - nxt_conn_read(task->thread->engine, c); } @@ -525,7 +523,11 @@ nxt_controller_request_content_length(void *ctx, nxt_http_field_t *field, length = nxt_off_t_parse(field->value.start, field->value.length); if (nxt_fast_path(length > 0)) { - nxt_log_error(NXT_LOG_ERR, log, "Content-Length is too big"); + + if (nxt_slow_path(length > NXT_SIZE_T_MAX)) { + nxt_log_error(NXT_LOG_ERR, log, "Content-Length is too big"); + return NXT_ERROR; + } r->length = length; return NXT_OK; |