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,