Mercurial > hg > nginx
diff src/os/win32/ngx_wsarecv_chain.c @ 5882:ec81934727a1
Core: added limit to recv_chain().
author | Roman Arutyunyan <arut@nginx.com> |
---|---|
date | Tue, 28 Oct 2014 12:29:58 +0300 |
parents | d620f497c50f |
children | efd71d49bde0 |
line wrap: on
line diff
--- a/src/os/win32/ngx_wsarecv_chain.c +++ b/src/os/win32/ngx_wsarecv_chain.c @@ -14,12 +14,12 @@ ssize_t -ngx_wsarecv_chain(ngx_connection_t *c, ngx_chain_t *chain) +ngx_wsarecv_chain(ngx_connection_t *c, ngx_chain_t *chain, off_t limit) { int rc; u_char *prev; u_long bytes, flags; - size_t size; + size_t n, size; ngx_err_t err; ngx_array_t vec; ngx_event_t *rev; @@ -41,8 +41,20 @@ ngx_wsarecv_chain(ngx_connection_t *c, n /* coalesce the neighbouring bufs */ while (chain) { + n = chain->buf->end - chain->buf->last; + + if (limit) { + if (size >= (size_t) limit) { + break; + } + + if (size + n > (size_t) limit) { + n = (size_t) limit - size; + } + } + if (prev == chain->buf->last) { - wsabuf->len += chain->buf->end - chain->buf->last; + wsabuf->len += n; } else { wsabuf = ngx_array_push(&vec); @@ -51,10 +63,10 @@ ngx_wsarecv_chain(ngx_connection_t *c, n } wsabuf->buf = (char *) chain->buf->last; - wsabuf->len = chain->buf->end - chain->buf->last; + wsabuf->len = n; } - size += chain->buf->end - chain->buf->last; + size += n; prev = chain->buf->end; chain = chain->next; }