Mercurial > hg > nginx
comparison 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 |
comparison
equal
deleted
inserted
replaced
5881:ee9230cd4bda | 5882:ec81934727a1 |
---|---|
12 | 12 |
13 #define NGX_WSABUFS 8 | 13 #define NGX_WSABUFS 8 |
14 | 14 |
15 | 15 |
16 ssize_t | 16 ssize_t |
17 ngx_wsarecv_chain(ngx_connection_t *c, ngx_chain_t *chain) | 17 ngx_wsarecv_chain(ngx_connection_t *c, ngx_chain_t *chain, off_t limit) |
18 { | 18 { |
19 int rc; | 19 int rc; |
20 u_char *prev; | 20 u_char *prev; |
21 u_long bytes, flags; | 21 u_long bytes, flags; |
22 size_t size; | 22 size_t n, size; |
23 ngx_err_t err; | 23 ngx_err_t err; |
24 ngx_array_t vec; | 24 ngx_array_t vec; |
25 ngx_event_t *rev; | 25 ngx_event_t *rev; |
26 LPWSABUF wsabuf; | 26 LPWSABUF wsabuf; |
27 WSABUF wsabufs[NGX_WSABUFS]; | 27 WSABUF wsabufs[NGX_WSABUFS]; |
39 vec.pool = c->pool; | 39 vec.pool = c->pool; |
40 | 40 |
41 /* coalesce the neighbouring bufs */ | 41 /* coalesce the neighbouring bufs */ |
42 | 42 |
43 while (chain) { | 43 while (chain) { |
44 n = chain->buf->end - chain->buf->last; | |
45 | |
46 if (limit) { | |
47 if (size >= (size_t) limit) { | |
48 break; | |
49 } | |
50 | |
51 if (size + n > (size_t) limit) { | |
52 n = (size_t) limit - size; | |
53 } | |
54 } | |
55 | |
44 if (prev == chain->buf->last) { | 56 if (prev == chain->buf->last) { |
45 wsabuf->len += chain->buf->end - chain->buf->last; | 57 wsabuf->len += n; |
46 | 58 |
47 } else { | 59 } else { |
48 wsabuf = ngx_array_push(&vec); | 60 wsabuf = ngx_array_push(&vec); |
49 if (wsabuf == NULL) { | 61 if (wsabuf == NULL) { |
50 return NGX_ERROR; | 62 return NGX_ERROR; |
51 } | 63 } |
52 | 64 |
53 wsabuf->buf = (char *) chain->buf->last; | 65 wsabuf->buf = (char *) chain->buf->last; |
54 wsabuf->len = chain->buf->end - chain->buf->last; | 66 wsabuf->len = n; |
55 } | 67 } |
56 | 68 |
57 size += chain->buf->end - chain->buf->last; | 69 size += n; |
58 prev = chain->buf->end; | 70 prev = chain->buf->end; |
59 chain = chain->next; | 71 chain = chain->next; |
60 } | 72 } |
61 | 73 |
62 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, | 74 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, |