Mercurial > hg > nginx-vendor-current
comparison src/os/unix/ngx_solaris_sendfilev_chain.c @ 672:f41d4b305d22 NGINX_1_2_0
nginx 1.2.0
*) Bugfix: a segmentation fault might occur in a worker process if the
"try_files" directive was used; the bug had appeared in 1.1.19.
*) Bugfix: response might be truncated if there were more than IOV_MAX
buffers used.
*) Bugfix: in the "crop" parameter of the "image_filter" directive.
Thanks to Maxim Bublis.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Mon, 23 Apr 2012 00:00:00 +0400 |
parents | d0f7a625f27c |
children | 5cb5db9975ba |
comparison
equal
deleted
inserted
replaced
671:47cb3497fbab | 672:f41d4b305d22 |
---|---|
72 limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize; | 72 limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize; |
73 } | 73 } |
74 | 74 |
75 | 75 |
76 send = 0; | 76 send = 0; |
77 complete = 0; | |
78 | 77 |
79 vec.elts = sfvs; | 78 vec.elts = sfvs; |
80 vec.size = sizeof(sendfilevec_t); | 79 vec.size = sizeof(sendfilevec_t); |
81 vec.nalloc = NGX_SENDFILEVECS; | 80 vec.nalloc = NGX_SENDFILEVECS; |
82 vec.pool = c->pool; | 81 vec.pool = c->pool; |
85 fd = SFV_FD_SELF; | 84 fd = SFV_FD_SELF; |
86 prev = NULL; | 85 prev = NULL; |
87 fprev = 0; | 86 fprev = 0; |
88 sfv = NULL; | 87 sfv = NULL; |
89 eintr = 0; | 88 eintr = 0; |
89 complete = 0; | |
90 sent = 0; | 90 sent = 0; |
91 prev_send = send; | 91 prev_send = send; |
92 | 92 |
93 vec.nelts = 0; | 93 vec.nelts = 0; |
94 | 94 |
95 /* create the sendfilevec and coalesce the neighbouring bufs */ | 95 /* create the sendfilevec and coalesce the neighbouring bufs */ |
96 | 96 |
97 for (cl = in; cl && vec.nelts < IOV_MAX && send < limit; cl = cl->next) | 97 for (cl = in; cl && send < limit; cl = cl->next) { |
98 { | 98 |
99 if (ngx_buf_special(cl->buf)) { | 99 if (ngx_buf_special(cl->buf)) { |
100 continue; | 100 continue; |
101 } | 101 } |
102 | 102 |
103 if (ngx_buf_in_memory_only(cl->buf)) { | 103 if (ngx_buf_in_memory_only(cl->buf)) { |
111 | 111 |
112 if (prev == cl->buf->pos) { | 112 if (prev == cl->buf->pos) { |
113 sfv->sfv_len += (size_t) size; | 113 sfv->sfv_len += (size_t) size; |
114 | 114 |
115 } else { | 115 } else { |
116 if (vec.nelts >= IOV_MAX) { | |
117 break; | |
118 } | |
119 | |
116 sfv = ngx_array_push(&vec); | 120 sfv = ngx_array_push(&vec); |
117 if (sfv == NULL) { | 121 if (sfv == NULL) { |
118 return NGX_CHAIN_ERROR; | 122 return NGX_CHAIN_ERROR; |
119 } | 123 } |
120 | 124 |
145 | 149 |
146 if (fd == cl->buf->file->fd && fprev == cl->buf->file_pos) { | 150 if (fd == cl->buf->file->fd && fprev == cl->buf->file_pos) { |
147 sfv->sfv_len += (size_t) size; | 151 sfv->sfv_len += (size_t) size; |
148 | 152 |
149 } else { | 153 } else { |
154 if (vec.nelts >= IOV_MAX) { | |
155 break; | |
156 } | |
157 | |
150 sfv = ngx_array_push(&vec); | 158 sfv = ngx_array_push(&vec); |
151 if (sfv == NULL) { | 159 if (sfv == NULL) { |
152 return NGX_CHAIN_ERROR; | 160 return NGX_CHAIN_ERROR; |
153 } | 161 } |
154 | 162 |