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