Merge lp:~groldster/ubuntu/maverick/nginx/merge-from-sid-0.7.67-2 into lp:ubuntu/maverick/nginx

Proposed by Mikhail Turov
Status: Merged
Merged at revision: 33
Proposed branch: lp:~groldster/ubuntu/maverick/nginx/merge-from-sid-0.7.67-2
Merge into: lp:ubuntu/maverick/nginx
Diff against target: 4347 lines (+2367/-363)
83 files modified
.pc/applied-patches (+1/-0)
.pc/fix_reloading_ipv6.diff/src/core/ngx_cycle.c (+1343/-0)
CHANGES (+121/-0)
CHANGES.ru (+126/-2)
auto/cc/conf (+1/-0)
auto/cc/gcc (+0/-2)
auto/feature (+1/-1)
auto/lib/openssl/conf (+2/-0)
auto/lib/openssl/make (+1/-1)
auto/lib/openssl/makefile.bcc (+1/-2)
auto/lib/openssl/makefile.msvc (+1/-2)
auto/lib/zlib/make (+3/-3)
auto/modules (+8/-8)
auto/unix (+10/-0)
debian/README.Debian (+9/-0)
debian/changelog (+101/-0)
debian/conf/mime.types (+2/-0)
debian/conf/sites-available/default (+7/-4)
debian/control (+2/-1)
debian/copyright (+37/-36)
debian/init.d (+2/-1)
debian/patches/fix_reloading_ipv6.diff (+15/-0)
debian/patches/series (+1/-0)
debian/rules (+10/-5)
src/core/nginx.h (+2/-2)
src/core/ngx_cycle.c (+2/-2)
src/core/ngx_file.c (+6/-4)
src/core/ngx_open_file_cache.c (+8/-1)
src/core/ngx_string.c (+2/-2)
src/core/ngx_times.c (+73/-9)
src/core/ngx_times.h (+2/-1)
src/event/modules/ngx_devpoll_module.c (+2/-2)
src/event/modules/ngx_epoll_module.c (+2/-2)
src/event/modules/ngx_eventport_module.c (+2/-2)
src/event/modules/ngx_kqueue_module.c (+3/-3)
src/event/modules/ngx_poll_module.c (+2/-2)
src/event/modules/ngx_rtsig_module.c (+4/-4)
src/event/modules/ngx_select_module.c (+2/-2)
src/event/modules/ngx_win32_select_module.c (+1/-1)
src/event/ngx_event.c (+0/-2)
src/event/ngx_event_openssl.c (+12/-2)
src/event/ngx_event_openssl.h (+1/-0)
src/http/modules/ngx_http_autoindex_module.c (+0/-4)
src/http/modules/ngx_http_chunked_filter_module.c (+10/-2)
src/http/modules/ngx_http_dav_module.c (+7/-11)
src/http/modules/ngx_http_fastcgi_module.c (+11/-0)
src/http/modules/ngx_http_flv_module.c (+0/-4)
src/http/modules/ngx_http_geo_module.c (+1/-1)
src/http/modules/ngx_http_geoip_module.c (+80/-28)
src/http/modules/ngx_http_gzip_static_module.c (+1/-5)
src/http/modules/ngx_http_image_filter_module.c (+33/-13)
src/http/modules/ngx_http_index_module.c (+0/-4)
src/http/modules/ngx_http_memcached_module.c (+8/-3)
src/http/modules/ngx_http_proxy_module.c (+22/-2)
src/http/modules/ngx_http_random_index_module.c (+0/-4)
src/http/modules/ngx_http_referer_module.c (+20/-11)
src/http/modules/ngx_http_rewrite_module.c (+4/-7)
src/http/modules/ngx_http_ssi_filter_module.c (+17/-21)
src/http/modules/ngx_http_static_module.c (+1/-5)
src/http/modules/ngx_http_userid_filter_module.c (+1/-1)
src/http/modules/perl/nginx.pm (+1/-1)
src/http/modules/perl/nginx.xs (+1/-4)
src/http/modules/perl/ngx_http_perl_module.c (+0/-10)
src/http/ngx_http_cache.h (+5/-0)
src/http/ngx_http_copy_filter_module.c (+3/-1)
src/http/ngx_http_core_module.c (+29/-10)
src/http/ngx_http_core_module.h (+1/-0)
src/http/ngx_http_file_cache.c (+68/-2)
src/http/ngx_http_header_filter_module.c (+2/-2)
src/http/ngx_http_parse.c (+19/-38)
src/http/ngx_http_request.c (+28/-7)
src/http/ngx_http_request.h (+3/-4)
src/http/ngx_http_special_response.c (+11/-13)
src/http/ngx_http_upstream.c (+13/-10)
src/http/ngx_http_upstream.h (+1/-0)
src/http/ngx_http_variables.c (+6/-10)
src/http/ngx_http_variables.h (+1/-1)
src/mail/ngx_mail_pop3_handler.c (+0/-2)
src/mail/ngx_mail_proxy_module.c (+1/-1)
src/os/unix/ngx_errno.h (+13/-1)
src/os/unix/ngx_files.h (+4/-0)
src/os/unix/ngx_process.c (+7/-6)
src/os/unix/ngx_process_cycle.c (+3/-3)
To merge this branch: bzr merge lp:~groldster/ubuntu/maverick/nginx/merge-from-sid-0.7.67-2
Reviewer Review Type Date Requested Status
Daniel Holbach (community) Approve
Ubuntu branches Pending
Review via email: mp+30513@code.launchpad.net

Description of the change

merging nginx 0.7.67 (httpd) from Debian unstable (httpd)

To post a comment you must log in.
Revision history for this message
Daniel Holbach (dholbach) wrote :

Good work.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file '.pc/applied-patches'
2--- .pc/applied-patches 2010-03-03 23:50:36 +0000
3+++ .pc/applied-patches 2010-07-21 11:15:58 +0000
4@@ -1,2 +1,3 @@
5 nginx-upstream-fair.diff
6 dlopen.diff
7+fix_reloading_ipv6.diff
8
9=== added directory '.pc/fix_reloading_ipv6.diff'
10=== added directory '.pc/fix_reloading_ipv6.diff/src'
11=== added directory '.pc/fix_reloading_ipv6.diff/src/core'
12=== added file '.pc/fix_reloading_ipv6.diff/src/core/ngx_cycle.c'
13--- .pc/fix_reloading_ipv6.diff/src/core/ngx_cycle.c 1970-01-01 00:00:00 +0000
14+++ .pc/fix_reloading_ipv6.diff/src/core/ngx_cycle.c 2010-07-21 11:15:58 +0000
15@@ -0,0 +1,1343 @@
16+
17+/*
18+ * Copyright (C) Igor Sysoev
19+ */
20+
21+
22+#include <ngx_config.h>
23+#include <ngx_core.h>
24+#include <ngx_event.h>
25+
26+
27+static void ngx_destroy_cycle_pools(ngx_conf_t *conf);
28+static ngx_int_t ngx_cmp_sockaddr(struct sockaddr *sa1, struct sockaddr *sa2);
29+static ngx_int_t ngx_init_zone_pool(ngx_cycle_t *cycle,
30+ ngx_shm_zone_t *shm_zone);
31+static ngx_int_t ngx_test_lockfile(u_char *file, ngx_log_t *log);
32+static void ngx_clean_old_cycles(ngx_event_t *ev);
33+
34+
35+volatile ngx_cycle_t *ngx_cycle;
36+ngx_array_t ngx_old_cycles;
37+
38+static ngx_pool_t *ngx_temp_pool;
39+static ngx_event_t ngx_cleaner_event;
40+
41+ngx_uint_t ngx_test_config;
42+
43+#if (NGX_THREADS)
44+ngx_tls_key_t ngx_core_tls_key;
45+#endif
46+
47+
48+/* STUB NAME */
49+static ngx_connection_t dumb;
50+/* STUB */
51+
52+static ngx_str_t error_log = ngx_string(NGX_ERROR_LOG_PATH);
53+
54+
55+ngx_cycle_t *
56+ngx_init_cycle(ngx_cycle_t *old_cycle)
57+{
58+ void *rv;
59+ char **senv, **env;
60+ ngx_uint_t i, n;
61+ ngx_log_t *log;
62+ ngx_time_t *tp;
63+ ngx_conf_t conf;
64+ ngx_pool_t *pool;
65+ ngx_cycle_t *cycle, **old;
66+ ngx_shm_zone_t *shm_zone, *oshm_zone;
67+ ngx_list_part_t *part, *opart;
68+ ngx_open_file_t *file;
69+ ngx_listening_t *ls, *nls;
70+ ngx_core_conf_t *ccf, *old_ccf;
71+ ngx_core_module_t *module;
72+ char hostname[NGX_MAXHOSTNAMELEN];
73+
74+ ngx_timezone_update();
75+
76+ /* force localtime update with a new timezone */
77+
78+ tp = ngx_timeofday();
79+ tp->sec = 0;
80+
81+ ngx_time_update();
82+
83+
84+ log = old_cycle->log;
85+
86+ pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, log);
87+ if (pool == NULL) {
88+ return NULL;
89+ }
90+ pool->log = log;
91+
92+ cycle = ngx_pcalloc(pool, sizeof(ngx_cycle_t));
93+ if (cycle == NULL) {
94+ ngx_destroy_pool(pool);
95+ return NULL;
96+ }
97+
98+ cycle->pool = pool;
99+ cycle->log = log;
100+ cycle->new_log.log_level = NGX_LOG_ERR;
101+ cycle->old_cycle = old_cycle;
102+
103+ cycle->conf_prefix.len = old_cycle->conf_prefix.len;
104+ cycle->conf_prefix.data = ngx_pstrdup(pool, &old_cycle->conf_prefix);
105+ if (cycle->conf_prefix.data == NULL) {
106+ ngx_destroy_pool(pool);
107+ return NULL;
108+ }
109+
110+ cycle->prefix.len = old_cycle->prefix.len;
111+ cycle->prefix.data = ngx_pstrdup(pool, &old_cycle->prefix);
112+ if (cycle->prefix.data == NULL) {
113+ ngx_destroy_pool(pool);
114+ return NULL;
115+ }
116+
117+ cycle->conf_file.len = old_cycle->conf_file.len;
118+ cycle->conf_file.data = ngx_pnalloc(pool, old_cycle->conf_file.len + 1);
119+ if (cycle->conf_file.data == NULL) {
120+ ngx_destroy_pool(pool);
121+ return NULL;
122+ }
123+ ngx_cpystrn(cycle->conf_file.data, old_cycle->conf_file.data,
124+ old_cycle->conf_file.len + 1);
125+
126+ cycle->conf_param.len = old_cycle->conf_param.len;
127+ cycle->conf_param.data = ngx_pstrdup(pool, &old_cycle->conf_param);
128+ if (cycle->conf_param.data == NULL) {
129+ ngx_destroy_pool(pool);
130+ return NULL;
131+ }
132+
133+
134+ n = old_cycle->pathes.nelts ? old_cycle->pathes.nelts : 10;
135+
136+ cycle->pathes.elts = ngx_pcalloc(pool, n * sizeof(ngx_path_t *));
137+ if (cycle->pathes.elts == NULL) {
138+ ngx_destroy_pool(pool);
139+ return NULL;
140+ }
141+
142+ cycle->pathes.nelts = 0;
143+ cycle->pathes.size = sizeof(ngx_path_t *);
144+ cycle->pathes.nalloc = n;
145+ cycle->pathes.pool = pool;
146+
147+
148+ if (old_cycle->open_files.part.nelts) {
149+ n = old_cycle->open_files.part.nelts;
150+ for (part = old_cycle->open_files.part.next; part; part = part->next) {
151+ n += part->nelts;
152+ }
153+
154+ } else {
155+ n = 20;
156+ }
157+
158+ if (ngx_list_init(&cycle->open_files, pool, n, sizeof(ngx_open_file_t))
159+ != NGX_OK)
160+ {
161+ ngx_destroy_pool(pool);
162+ return NULL;
163+ }
164+
165+
166+ if (old_cycle->shared_memory.part.nelts) {
167+ n = old_cycle->shared_memory.part.nelts;
168+ for (part = old_cycle->shared_memory.part.next; part; part = part->next)
169+ {
170+ n += part->nelts;
171+ }
172+
173+ } else {
174+ n = 1;
175+ }
176+
177+ if (ngx_list_init(&cycle->shared_memory, pool, n, sizeof(ngx_shm_zone_t))
178+ != NGX_OK)
179+ {
180+ ngx_destroy_pool(pool);
181+ return NULL;
182+ }
183+
184+ n = old_cycle->listening.nelts ? old_cycle->listening.nelts : 10;
185+
186+ cycle->listening.elts = ngx_pcalloc(pool, n * sizeof(ngx_listening_t));
187+ if (cycle->listening.elts == NULL) {
188+ ngx_destroy_pool(pool);
189+ return NULL;
190+ }
191+
192+ cycle->listening.nelts = 0;
193+ cycle->listening.size = sizeof(ngx_listening_t);
194+ cycle->listening.nalloc = n;
195+ cycle->listening.pool = pool;
196+
197+
198+ cycle->conf_ctx = ngx_pcalloc(pool, ngx_max_module * sizeof(void *));
199+ if (cycle->conf_ctx == NULL) {
200+ ngx_destroy_pool(pool);
201+ return NULL;
202+ }
203+
204+
205+ if (gethostname(hostname, NGX_MAXHOSTNAMELEN) == -1) {
206+ ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "gethostname() failed");
207+ ngx_destroy_pool(pool);
208+ return NULL;
209+ }
210+
211+ /* on Linux gethostname() silently truncates name that does not fit */
212+
213+ hostname[NGX_MAXHOSTNAMELEN - 1] = '\0';
214+ cycle->hostname.len = ngx_strlen(hostname);
215+
216+ cycle->hostname.data = ngx_pnalloc(pool, cycle->hostname.len);
217+ if (cycle->hostname.data == NULL) {
218+ ngx_destroy_pool(pool);
219+ return NULL;
220+ }
221+
222+ ngx_memcpy(cycle->hostname.data, hostname, cycle->hostname.len);
223+
224+
225+ for (i = 0; ngx_modules[i]; i++) {
226+ if (ngx_modules[i]->type != NGX_CORE_MODULE) {
227+ continue;
228+ }
229+
230+ module = ngx_modules[i]->ctx;
231+
232+ if (module->create_conf) {
233+ rv = module->create_conf(cycle);
234+ if (rv == NULL) {
235+ ngx_destroy_pool(pool);
236+ return NULL;
237+ }
238+ cycle->conf_ctx[ngx_modules[i]->index] = rv;
239+ }
240+ }
241+
242+
243+ senv = environ;
244+
245+
246+ ngx_memzero(&conf, sizeof(ngx_conf_t));
247+ /* STUB: init array ? */
248+ conf.args = ngx_array_create(pool, 10, sizeof(ngx_str_t));
249+ if (conf.args == NULL) {
250+ ngx_destroy_pool(pool);
251+ return NULL;
252+ }
253+
254+ conf.temp_pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, log);
255+ if (conf.temp_pool == NULL) {
256+ ngx_destroy_pool(pool);
257+ return NULL;
258+ }
259+
260+
261+ conf.ctx = cycle->conf_ctx;
262+ conf.cycle = cycle;
263+ conf.pool = pool;
264+ conf.log = log;
265+ conf.module_type = NGX_CORE_MODULE;
266+ conf.cmd_type = NGX_MAIN_CONF;
267+
268+#if 0
269+ log->log_level = NGX_LOG_DEBUG_ALL;
270+#endif
271+
272+ if (ngx_conf_param(&conf) != NGX_CONF_OK) {
273+ environ = senv;
274+ ngx_destroy_cycle_pools(&conf);
275+ return NULL;
276+ }
277+
278+ if (ngx_conf_parse(&conf, &cycle->conf_file) != NGX_CONF_OK) {
279+ environ = senv;
280+ ngx_destroy_cycle_pools(&conf);
281+ return NULL;
282+ }
283+
284+ if (ngx_test_config) {
285+ ngx_log_stderr(0, "the configuration file %s syntax is ok",
286+ cycle->conf_file.data);
287+ }
288+
289+ for (i = 0; ngx_modules[i]; i++) {
290+ if (ngx_modules[i]->type != NGX_CORE_MODULE) {
291+ continue;
292+ }
293+
294+ module = ngx_modules[i]->ctx;
295+
296+ if (module->init_conf) {
297+ if (module->init_conf(cycle, cycle->conf_ctx[ngx_modules[i]->index])
298+ == NGX_CONF_ERROR)
299+ {
300+ environ = senv;
301+ ngx_destroy_cycle_pools(&conf);
302+ return NULL;
303+ }
304+ }
305+ }
306+
307+ if (ngx_process == NGX_PROCESS_SIGNALLER) {
308+ return cycle;
309+ }
310+
311+ ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
312+
313+ if (ngx_test_config) {
314+
315+ if (ngx_create_pidfile(&ccf->pid, log) != NGX_OK) {
316+ goto failed;
317+ }
318+
319+ } else if (!ngx_is_init_cycle(old_cycle)) {
320+
321+ /*
322+ * we do not create the pid file in the first ngx_init_cycle() call
323+ * because we need to write the demonized process pid
324+ */
325+
326+ old_ccf = (ngx_core_conf_t *) ngx_get_conf(old_cycle->conf_ctx,
327+ ngx_core_module);
328+ if (ccf->pid.len != old_ccf->pid.len
329+ || ngx_strcmp(ccf->pid.data, old_ccf->pid.data) != 0)
330+ {
331+ /* new pid file name */
332+
333+ if (ngx_create_pidfile(&ccf->pid, log) != NGX_OK) {
334+ goto failed;
335+ }
336+
337+ ngx_delete_pidfile(old_cycle);
338+ }
339+ }
340+
341+
342+ if (ngx_test_lockfile(cycle->lock_file.data, log) != NGX_OK) {
343+ goto failed;
344+ }
345+
346+
347+ if (ngx_create_pathes(cycle, ccf->user) != NGX_OK) {
348+ goto failed;
349+ }
350+
351+
352+ if (cycle->new_log.file == NULL) {
353+ cycle->new_log.file = ngx_conf_open_file(cycle, &error_log);
354+ if (cycle->new_log.file == NULL) {
355+ goto failed;
356+ }
357+ }
358+
359+ /* open the new files */
360+
361+ part = &cycle->open_files.part;
362+ file = part->elts;
363+
364+ for (i = 0; /* void */ ; i++) {
365+
366+ if (i >= part->nelts) {
367+ if (part->next == NULL) {
368+ break;
369+ }
370+ part = part->next;
371+ file = part->elts;
372+ i = 0;
373+ }
374+
375+ if (file[i].name.len == 0) {
376+ continue;
377+ }
378+
379+ file[i].fd = ngx_open_file(file[i].name.data,
380+ NGX_FILE_APPEND,
381+ NGX_FILE_CREATE_OR_OPEN,
382+ NGX_FILE_DEFAULT_ACCESS);
383+
384+ ngx_log_debug3(NGX_LOG_DEBUG_CORE, log, 0,
385+ "log: %p %d \"%s\"",
386+ &file[i], file[i].fd, file[i].name.data);
387+
388+ if (file[i].fd == NGX_INVALID_FILE) {
389+ ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
390+ ngx_open_file_n " \"%s\" failed",
391+ file[i].name.data);
392+ goto failed;
393+ }
394+
395+#if !(NGX_WIN32)
396+ if (fcntl(file[i].fd, F_SETFD, FD_CLOEXEC) == -1) {
397+ ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
398+ "fcntl(FD_CLOEXEC) \"%s\" failed",
399+ file[i].name.data);
400+ goto failed;
401+ }
402+#endif
403+ }
404+
405+ cycle->log = &cycle->new_log;
406+ pool->log = &cycle->new_log;
407+
408+
409+ /* create shared memory */
410+
411+ part = &cycle->shared_memory.part;
412+ shm_zone = part->elts;
413+
414+ for (i = 0; /* void */ ; i++) {
415+
416+ if (i >= part->nelts) {
417+ if (part->next == NULL) {
418+ break;
419+ }
420+ part = part->next;
421+ shm_zone = part->elts;
422+ i = 0;
423+ }
424+
425+ if (shm_zone[i].shm.size == 0) {
426+ ngx_log_error(NGX_LOG_EMERG, log, 0,
427+ "zero size shared memory zone \"%V\"",
428+ &shm_zone[i].shm.name);
429+ goto failed;
430+ }
431+
432+ if (shm_zone[i].init == NULL) {
433+ /* unused shared zone */
434+ continue;
435+ }
436+
437+ shm_zone[i].shm.log = cycle->log;
438+
439+ opart = &old_cycle->shared_memory.part;
440+ oshm_zone = opart->elts;
441+
442+ for (n = 0; /* void */ ; n++) {
443+
444+ if (n >= opart->nelts) {
445+ if (opart->next == NULL) {
446+ break;
447+ }
448+ opart = opart->next;
449+ oshm_zone = opart->elts;
450+ n = 0;
451+ }
452+
453+ if (shm_zone[i].shm.name.len != oshm_zone[n].shm.name.len) {
454+ continue;
455+ }
456+
457+ if (ngx_strncmp(shm_zone[i].shm.name.data,
458+ oshm_zone[n].shm.name.data,
459+ shm_zone[i].shm.name.len)
460+ != 0)
461+ {
462+ continue;
463+ }
464+
465+ if (shm_zone[i].shm.size == oshm_zone[n].shm.size) {
466+ shm_zone[i].shm.addr = oshm_zone[n].shm.addr;
467+
468+ if (shm_zone[i].init(&shm_zone[i], oshm_zone[n].data)
469+ != NGX_OK)
470+ {
471+ goto failed;
472+ }
473+
474+ goto shm_zone_found;
475+ }
476+
477+ ngx_shm_free(&oshm_zone[n].shm);
478+
479+ break;
480+ }
481+
482+ if (ngx_shm_alloc(&shm_zone[i].shm) != NGX_OK) {
483+ goto failed;
484+ }
485+
486+ if (ngx_init_zone_pool(cycle, &shm_zone[i]) != NGX_OK) {
487+ goto failed;
488+ }
489+
490+ if (shm_zone[i].init(&shm_zone[i], NULL) != NGX_OK) {
491+ goto failed;
492+ }
493+
494+ shm_zone_found:
495+
496+ continue;
497+ }
498+
499+
500+ /* handle the listening sockets */
501+
502+ if (old_cycle->listening.nelts) {
503+ ls = old_cycle->listening.elts;
504+ for (i = 0; i < old_cycle->listening.nelts; i++) {
505+ ls[i].remain = 0;
506+ }
507+
508+ nls = cycle->listening.elts;
509+ for (n = 0; n < cycle->listening.nelts; n++) {
510+
511+ for (i = 0; i < old_cycle->listening.nelts; i++) {
512+ if (ls[i].ignore) {
513+ continue;
514+ }
515+
516+ if (ngx_cmp_sockaddr(nls[n].sockaddr, ls[i].sockaddr) == NGX_OK)
517+ {
518+ nls[n].fd = ls[i].fd;
519+ nls[n].previous = &ls[i];
520+ ls[i].remain = 1;
521+
522+ if (ls[n].backlog != nls[i].backlog) {
523+ nls[n].listen = 1;
524+ }
525+
526+#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)
527+
528+ /*
529+ * FreeBSD, except the most recent versions,
530+ * could not remove accept filter
531+ */
532+ nls[n].deferred_accept = ls[i].deferred_accept;
533+
534+ if (ls[i].accept_filter && nls[n].accept_filter) {
535+ if (ngx_strcmp(ls[i].accept_filter,
536+ nls[n].accept_filter)
537+ != 0)
538+ {
539+ nls[n].delete_deferred = 1;
540+ nls[n].add_deferred = 1;
541+ }
542+
543+ } else if (ls[i].accept_filter) {
544+ nls[n].delete_deferred = 1;
545+
546+ } else if (nls[n].accept_filter) {
547+ nls[n].add_deferred = 1;
548+ }
549+#endif
550+
551+#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)
552+
553+ if (ls[n].deferred_accept && !nls[n].deferred_accept) {
554+ nls[n].delete_deferred = 1;
555+
556+ } else if (ls[i].deferred_accept != nls[n].deferred_accept)
557+ {
558+ nls[n].add_deferred = 1;
559+ }
560+#endif
561+ break;
562+ }
563+ }
564+
565+ if (nls[n].fd == -1) {
566+ nls[n].open = 1;
567+ }
568+ }
569+
570+ } else {
571+ ls = cycle->listening.elts;
572+ for (i = 0; i < cycle->listening.nelts; i++) {
573+ ls[i].open = 1;
574+#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)
575+ if (ls[i].accept_filter) {
576+ ls[i].add_deferred = 1;
577+ }
578+#endif
579+#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)
580+ if (ls[i].deferred_accept) {
581+ ls[i].add_deferred = 1;
582+ }
583+#endif
584+ }
585+ }
586+
587+ if (ngx_open_listening_sockets(cycle) != NGX_OK) {
588+ goto failed;
589+ }
590+
591+ if (!ngx_test_config) {
592+ ngx_configure_listening_sockets(cycle);
593+ }
594+
595+
596+ /* commit the new cycle configuration */
597+
598+ if (!ngx_use_stderr && cycle->log->file->fd != ngx_stderr) {
599+
600+ if (ngx_set_stderr(cycle->log->file->fd) == NGX_FILE_ERROR) {
601+ ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
602+ ngx_set_stderr_n " failed");
603+ }
604+ }
605+
606+ pool->log = cycle->log;
607+
608+ for (i = 0; ngx_modules[i]; i++) {
609+ if (ngx_modules[i]->init_module) {
610+ if (ngx_modules[i]->init_module(cycle) != NGX_OK) {
611+ /* fatal */
612+ exit(1);
613+ }
614+ }
615+ }
616+
617+
618+ /* close and delete stuff that lefts from an old cycle */
619+
620+ /* free the unnecessary shared memory */
621+
622+ opart = &old_cycle->shared_memory.part;
623+ oshm_zone = opart->elts;
624+
625+ for (i = 0; /* void */ ; i++) {
626+
627+ if (i >= opart->nelts) {
628+ if (opart->next == NULL) {
629+ goto old_shm_zone_done;
630+ }
631+ opart = opart->next;
632+ oshm_zone = opart->elts;
633+ i = 0;
634+ }
635+
636+ part = &cycle->shared_memory.part;
637+ shm_zone = part->elts;
638+
639+ for (n = 0; /* void */ ; n++) {
640+
641+ if (n >= part->nelts) {
642+ if (part->next == NULL) {
643+ break;
644+ }
645+ part = part->next;
646+ shm_zone = part->elts;
647+ n = 0;
648+ }
649+
650+ if (oshm_zone[i].shm.name.len == shm_zone[n].shm.name.len
651+ && ngx_strncmp(oshm_zone[i].shm.name.data,
652+ shm_zone[n].shm.name.data,
653+ oshm_zone[i].shm.name.len)
654+ == 0)
655+ {
656+ goto live_shm_zone;
657+ }
658+ }
659+
660+ ngx_shm_free(&oshm_zone[i].shm);
661+
662+ live_shm_zone:
663+
664+ continue;
665+ }
666+
667+old_shm_zone_done:
668+
669+
670+ /* close the unnecessary listening sockets */
671+
672+ ls = old_cycle->listening.elts;
673+ for (i = 0; i < old_cycle->listening.nelts; i++) {
674+
675+ if (ls[i].remain || ls[i].fd == -1) {
676+ continue;
677+ }
678+
679+ if (ngx_close_socket(ls[i].fd) == -1) {
680+ ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
681+ ngx_close_socket_n " listening socket on %V failed",
682+ &ls[i].addr_text);
683+ }
684+ }
685+
686+
687+ /* close the unnecessary open files */
688+
689+ part = &old_cycle->open_files.part;
690+ file = part->elts;
691+
692+ for (i = 0; /* void */ ; i++) {
693+
694+ if (i >= part->nelts) {
695+ if (part->next == NULL) {
696+ break;
697+ }
698+ part = part->next;
699+ file = part->elts;
700+ i = 0;
701+ }
702+
703+ if (file[i].fd == NGX_INVALID_FILE || file[i].fd == ngx_stderr) {
704+ continue;
705+ }
706+
707+ if (ngx_close_file(file[i].fd) == NGX_FILE_ERROR) {
708+ ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
709+ ngx_close_file_n " \"%s\" failed",
710+ file[i].name.data);
711+ }
712+ }
713+
714+ ngx_destroy_pool(conf.temp_pool);
715+
716+ if (ngx_process == NGX_PROCESS_MASTER || ngx_is_init_cycle(old_cycle)) {
717+
718+ /*
719+ * perl_destruct() frees environ, if it is not the same as it was at
720+ * perl_construct() time, therefore we save the previous cycle
721+ * environment before ngx_conf_parse() where it will be changed.
722+ */
723+
724+ env = environ;
725+ environ = senv;
726+
727+ ngx_destroy_pool(old_cycle->pool);
728+ cycle->old_cycle = NULL;
729+
730+ environ = env;
731+
732+ return cycle;
733+ }
734+
735+
736+ if (ngx_temp_pool == NULL) {
737+ ngx_temp_pool = ngx_create_pool(128, cycle->log);
738+ if (ngx_temp_pool == NULL) {
739+ ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,
740+ "can not create ngx_temp_pool");
741+ exit(1);
742+ }
743+
744+ n = 10;
745+ ngx_old_cycles.elts = ngx_pcalloc(ngx_temp_pool,
746+ n * sizeof(ngx_cycle_t *));
747+ if (ngx_old_cycles.elts == NULL) {
748+ exit(1);
749+ }
750+ ngx_old_cycles.nelts = 0;
751+ ngx_old_cycles.size = sizeof(ngx_cycle_t *);
752+ ngx_old_cycles.nalloc = n;
753+ ngx_old_cycles.pool = ngx_temp_pool;
754+
755+ ngx_cleaner_event.handler = ngx_clean_old_cycles;
756+ ngx_cleaner_event.log = cycle->log;
757+ ngx_cleaner_event.data = &dumb;
758+ dumb.fd = (ngx_socket_t) -1;
759+ }
760+
761+ ngx_temp_pool->log = cycle->log;
762+
763+ old = ngx_array_push(&ngx_old_cycles);
764+ if (old == NULL) {
765+ exit(1);
766+ }
767+ *old = old_cycle;
768+
769+ if (!ngx_cleaner_event.timer_set) {
770+ ngx_add_timer(&ngx_cleaner_event, 30000);
771+ ngx_cleaner_event.timer_set = 1;
772+ }
773+
774+ return cycle;
775+
776+
777+failed:
778+
779+ if (!ngx_is_init_cycle(old_cycle)) {
780+ old_ccf = (ngx_core_conf_t *) ngx_get_conf(old_cycle->conf_ctx,
781+ ngx_core_module);
782+ if (old_ccf->environment) {
783+ environ = old_ccf->environment;
784+ }
785+ }
786+
787+ /* rollback the new cycle configuration */
788+
789+ part = &cycle->open_files.part;
790+ file = part->elts;
791+
792+ for (i = 0; /* void */ ; i++) {
793+
794+ if (i >= part->nelts) {
795+ if (part->next == NULL) {
796+ break;
797+ }
798+ part = part->next;
799+ file = part->elts;
800+ i = 0;
801+ }
802+
803+ if (file[i].fd == NGX_INVALID_FILE || file[i].fd == ngx_stderr) {
804+ continue;
805+ }
806+
807+ if (ngx_close_file(file[i].fd) == NGX_FILE_ERROR) {
808+ ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
809+ ngx_close_file_n " \"%s\" failed",
810+ file[i].name.data);
811+ }
812+ }
813+
814+ if (ngx_test_config) {
815+ ngx_destroy_cycle_pools(&conf);
816+ return NULL;
817+ }
818+
819+ ls = cycle->listening.elts;
820+ for (i = 0; i < cycle->listening.nelts; i++) {
821+ if (ls[i].fd == -1 || !ls[i].open) {
822+ continue;
823+ }
824+
825+ if (ngx_close_socket(ls[i].fd) == -1) {
826+ ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
827+ ngx_close_socket_n " %V failed",
828+ &ls[i].addr_text);
829+ }
830+ }
831+
832+ ngx_destroy_cycle_pools(&conf);
833+
834+ return NULL;
835+}
836+
837+
838+static void
839+ngx_destroy_cycle_pools(ngx_conf_t *conf)
840+{
841+ ngx_destroy_pool(conf->temp_pool);
842+ ngx_destroy_pool(conf->pool);
843+}
844+
845+
846+static ngx_int_t
847+ngx_cmp_sockaddr(struct sockaddr *sa1, struct sockaddr *sa2)
848+{
849+ struct sockaddr_in *sin1, *sin2;
850+#if (NGX_HAVE_INET6)
851+ struct sockaddr_in6 *sin61, *sin62;
852+#endif
853+
854+ if (sa1->sa_family != sa2->sa_family) {
855+ return NGX_DECLINED;
856+ }
857+
858+ switch (sa1->sa_family) {
859+
860+#if (NGX_HAVE_INET6)
861+ case AF_INET6:
862+ sin61 = (struct sockaddr_in6 *) sa1;
863+ sin62 = (struct sockaddr_in6 *) sa2;
864+
865+ if (sin61->sin6_port != sin61->sin6_port) {
866+ return NGX_DECLINED;
867+ }
868+
869+ if (ngx_memcmp(&sin61->sin6_addr, &sin62->sin6_addr, 16) != 0) {
870+ return NGX_DECLINED;
871+ }
872+
873+ break;
874+#endif
875+
876+ default: /* AF_INET */
877+
878+ sin1 = (struct sockaddr_in *) sa1;
879+ sin2 = (struct sockaddr_in *) sa2;
880+
881+ if (sin1->sin_port != sin2->sin_port) {
882+ return NGX_DECLINED;
883+ }
884+
885+ if (sin1->sin_addr.s_addr != sin2->sin_addr.s_addr) {
886+ return NGX_DECLINED;
887+ }
888+
889+ break;
890+ }
891+
892+ return NGX_OK;
893+}
894+
895+
896+static ngx_int_t
897+ngx_init_zone_pool(ngx_cycle_t *cycle, ngx_shm_zone_t *zn)
898+{
899+ u_char *file;
900+ ngx_slab_pool_t *sp;
901+
902+ sp = (ngx_slab_pool_t *) zn->shm.addr;
903+
904+ if (zn->shm.exists) {
905+
906+ if (sp == sp->addr) {
907+ return NGX_OK;
908+ }
909+
910+ ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,
911+ "shared zone \"%V\" has no equal addresses: %p vs %p",
912+ &zn->shm.name, sp->addr, sp);
913+ return NGX_ERROR;
914+ }
915+
916+ sp->end = zn->shm.addr + zn->shm.size;
917+ sp->min_shift = 3;
918+ sp->addr = zn->shm.addr;
919+
920+#if (NGX_HAVE_ATOMIC_OPS)
921+
922+ file = NULL;
923+
924+#else
925+
926+ file = ngx_pnalloc(cycle->pool, cycle->lock_file.len + zn->shm.name.len);
927+ if (file == NULL) {
928+ return NGX_ERROR;
929+ }
930+
931+ (void) ngx_sprintf(file, "%V%V%Z", &cycle->lock_file, &zn->shm.name);
932+
933+#endif
934+
935+ if (ngx_shmtx_create(&sp->mutex, (void *) &sp->lock, file) != NGX_OK) {
936+ return NGX_ERROR;
937+ }
938+
939+ ngx_slab_init(sp);
940+
941+ return NGX_OK;
942+}
943+
944+
945+ngx_int_t
946+ngx_create_pidfile(ngx_str_t *name, ngx_log_t *log)
947+{
948+ size_t len;
949+ ngx_uint_t create;
950+ ngx_file_t file;
951+ u_char pid[NGX_INT64_LEN + 2];
952+
953+ if (ngx_process > NGX_PROCESS_MASTER) {
954+ return NGX_OK;
955+ }
956+
957+ ngx_memzero(&file, sizeof(ngx_file_t));
958+
959+ file.name = *name;
960+ file.log = log;
961+
962+ create = ngx_test_config ? NGX_FILE_CREATE_OR_OPEN : NGX_FILE_TRUNCATE;
963+
964+ file.fd = ngx_open_file(file.name.data, NGX_FILE_RDWR,
965+ create, NGX_FILE_DEFAULT_ACCESS);
966+
967+ if (file.fd == NGX_INVALID_FILE) {
968+ ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
969+ ngx_open_file_n " \"%s\" failed", file.name.data);
970+ return NGX_ERROR;
971+ }
972+
973+ if (!ngx_test_config) {
974+ len = ngx_snprintf(pid, NGX_INT64_LEN + 2, "%P%N", ngx_pid) - pid;
975+
976+ if (ngx_write_file(&file, pid, len, 0) == NGX_ERROR) {
977+ return NGX_ERROR;
978+ }
979+ }
980+
981+ if (ngx_close_file(file.fd) == NGX_FILE_ERROR) {
982+ ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
983+ ngx_close_file_n " \"%s\" failed", file.name.data);
984+ }
985+
986+ return NGX_OK;
987+}
988+
989+
990+void
991+ngx_delete_pidfile(ngx_cycle_t *cycle)
992+{
993+ u_char *name;
994+ ngx_core_conf_t *ccf;
995+
996+ ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
997+
998+ name = ngx_new_binary ? ccf->oldpid.data : ccf->pid.data;
999+
1000+ if (ngx_delete_file(name) == NGX_FILE_ERROR) {
1001+ ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
1002+ ngx_delete_file_n " \"%s\" failed", name);
1003+ }
1004+}
1005+
1006+
1007+ngx_int_t
1008+ngx_signal_process(ngx_cycle_t *cycle, char *sig)
1009+{
1010+ ssize_t n;
1011+ ngx_int_t pid;
1012+ ngx_file_t file;
1013+ ngx_core_conf_t *ccf;
1014+ u_char buf[NGX_INT64_LEN + 2];
1015+
1016+ ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "signal process started");
1017+
1018+ ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
1019+
1020+ file.name = ccf->pid;
1021+ file.log = cycle->log;
1022+
1023+ file.fd = ngx_open_file(file.name.data, NGX_FILE_RDONLY,
1024+ NGX_FILE_OPEN, NGX_FILE_DEFAULT_ACCESS);
1025+
1026+ if (file.fd == NGX_INVALID_FILE) {
1027+ ngx_log_error(NGX_LOG_ERR, cycle->log, ngx_errno,
1028+ ngx_open_file_n " \"%s\" failed", file.name.data);
1029+ return 1;
1030+ }
1031+
1032+ n = ngx_read_file(&file, buf, NGX_INT64_LEN + 2, 0);
1033+
1034+ if (ngx_close_file(file.fd) == NGX_FILE_ERROR) {
1035+ ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
1036+ ngx_close_file_n " \"%s\" failed", file.name.data);
1037+ }
1038+
1039+ if (n == NGX_ERROR) {
1040+ return 1;
1041+ }
1042+
1043+ while (n-- && (buf[n] == CR || buf[n] == LF)) { /* void */ }
1044+
1045+ pid = ngx_atoi(buf, ++n);
1046+
1047+ if (pid == NGX_ERROR) {
1048+ ngx_log_error(NGX_LOG_ERR, cycle->log, 0,
1049+ "invalid PID number \"%*s\" in \"%s\"",
1050+ n, buf, file.name.data);
1051+ return 1;
1052+ }
1053+
1054+ return ngx_os_signal_process(cycle, sig, pid);
1055+
1056+}
1057+
1058+
1059+static ngx_int_t
1060+ngx_test_lockfile(u_char *file, ngx_log_t *log)
1061+{
1062+#if !(NGX_HAVE_ATOMIC_OPS)
1063+ ngx_fd_t fd;
1064+
1065+ fd = ngx_open_file(file, NGX_FILE_RDWR, NGX_FILE_CREATE_OR_OPEN,
1066+ NGX_FILE_DEFAULT_ACCESS);
1067+
1068+ if (fd == NGX_INVALID_FILE) {
1069+ ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
1070+ ngx_open_file_n " \"%s\" failed", file);
1071+ return NGX_ERROR;
1072+ }
1073+
1074+ if (ngx_close_file(fd) == NGX_FILE_ERROR) {
1075+ ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
1076+ ngx_close_file_n " \"%s\" failed", file);
1077+ }
1078+
1079+ if (ngx_delete_file(file) == NGX_FILE_ERROR) {
1080+ ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
1081+ ngx_delete_file_n " \"%s\" failed", file);
1082+ }
1083+
1084+#endif
1085+
1086+ return NGX_OK;
1087+}
1088+
1089+
1090+void
1091+ngx_reopen_files(ngx_cycle_t *cycle, ngx_uid_t user)
1092+{
1093+ ssize_t n, len;
1094+ ngx_fd_t fd;
1095+ ngx_uint_t i;
1096+ ngx_list_part_t *part;
1097+ ngx_open_file_t *file;
1098+
1099+ part = &cycle->open_files.part;
1100+ file = part->elts;
1101+
1102+ for (i = 0; /* void */ ; i++) {
1103+
1104+ if (i >= part->nelts) {
1105+ if (part->next == NULL) {
1106+ break;
1107+ }
1108+ part = part->next;
1109+ file = part->elts;
1110+ i = 0;
1111+ }
1112+
1113+ if (file[i].name.len == 0) {
1114+ continue;
1115+ }
1116+
1117+ len = file[i].pos - file[i].buffer;
1118+
1119+ if (file[i].buffer && len != 0) {
1120+
1121+ n = ngx_write_fd(file[i].fd, file[i].buffer, len);
1122+
1123+ if (n == NGX_FILE_ERROR) {
1124+ ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
1125+ ngx_write_fd_n " to \"%s\" failed",
1126+ file[i].name.data);
1127+
1128+ } else if (n != len) {
1129+ ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
1130+ ngx_write_fd_n " to \"%s\" was incomplete: %z of %uz",
1131+ file[i].name.data, n, len);
1132+ }
1133+
1134+ file[i].pos = file[i].buffer;
1135+ }
1136+
1137+ fd = ngx_open_file(file[i].name.data, NGX_FILE_APPEND,
1138+ NGX_FILE_CREATE_OR_OPEN, NGX_FILE_DEFAULT_ACCESS);
1139+
1140+ ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
1141+ "reopen file \"%s\", old:%d new:%d",
1142+ file[i].name.data, file[i].fd, fd);
1143+
1144+ if (fd == NGX_INVALID_FILE) {
1145+ ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
1146+ ngx_open_file_n " \"%s\" failed", file[i].name.data);
1147+ continue;
1148+ }
1149+
1150+#if !(NGX_WIN32)
1151+ if (user != (ngx_uid_t) NGX_CONF_UNSET_UINT) {
1152+ ngx_file_info_t fi;
1153+
1154+ if (ngx_file_info((const char *) file[i].name.data, &fi)
1155+ == NGX_FILE_ERROR)
1156+ {
1157+ ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
1158+ ngx_file_info_n " \"%s\" failed",
1159+ file[i].name.data);
1160+
1161+ if (ngx_close_file(fd) == NGX_FILE_ERROR) {
1162+ ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
1163+ ngx_close_file_n " \"%s\" failed",
1164+ file[i].name.data);
1165+ }
1166+ }
1167+
1168+ if (fi.st_uid != user) {
1169+ if (chown((const char *) file[i].name.data, user, -1) == -1) {
1170+ ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
1171+ "chown(\"%s\", %d) failed",
1172+ file[i].name.data, user);
1173+
1174+ if (ngx_close_file(fd) == NGX_FILE_ERROR) {
1175+ ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
1176+ ngx_close_file_n " \"%s\" failed",
1177+ file[i].name.data);
1178+ }
1179+ }
1180+ }
1181+
1182+ if ((fi.st_mode & (S_IRUSR|S_IWUSR)) != (S_IRUSR|S_IWUSR)) {
1183+
1184+ fi.st_mode |= (S_IRUSR|S_IWUSR);
1185+
1186+ if (chmod((const char *) file[i].name.data, fi.st_mode) == -1) {
1187+ ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
1188+ "chmod() \"%s\" failed", file[i].name.data);
1189+
1190+ if (ngx_close_file(fd) == NGX_FILE_ERROR) {
1191+ ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
1192+ ngx_close_file_n " \"%s\" failed",
1193+ file[i].name.data);
1194+ }
1195+ }
1196+ }
1197+ }
1198+
1199+ if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
1200+ ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
1201+ "fcntl(FD_CLOEXEC) \"%s\" failed",
1202+ file[i].name.data);
1203+
1204+ if (ngx_close_file(fd) == NGX_FILE_ERROR) {
1205+ ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
1206+ ngx_close_file_n " \"%s\" failed",
1207+ file[i].name.data);
1208+ }
1209+
1210+ continue;
1211+ }
1212+#endif
1213+
1214+ if (ngx_close_file(file[i].fd) == NGX_FILE_ERROR) {
1215+ ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
1216+ ngx_close_file_n " \"%s\" failed",
1217+ file[i].name.data);
1218+ }
1219+
1220+ file[i].fd = fd;
1221+ }
1222+
1223+#if !(NGX_WIN32)
1224+
1225+ if (cycle->log->file->fd != STDERR_FILENO) {
1226+ if (dup2(cycle->log->file->fd, STDERR_FILENO) == -1) {
1227+ ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
1228+ "dup2(STDERR) failed");
1229+ }
1230+ }
1231+
1232+#endif
1233+}
1234+
1235+
1236+ngx_shm_zone_t *
1237+ngx_shared_memory_add(ngx_conf_t *cf, ngx_str_t *name, size_t size, void *tag)
1238+{
1239+ ngx_uint_t i;
1240+ ngx_shm_zone_t *shm_zone;
1241+ ngx_list_part_t *part;
1242+
1243+ part = &cf->cycle->shared_memory.part;
1244+ shm_zone = part->elts;
1245+
1246+ for (i = 0; /* void */ ; i++) {
1247+
1248+ if (i >= part->nelts) {
1249+ if (part->next == NULL) {
1250+ break;
1251+ }
1252+ part = part->next;
1253+ shm_zone = part->elts;
1254+ i = 0;
1255+ }
1256+
1257+ if (name->len != shm_zone[i].shm.name.len) {
1258+ continue;
1259+ }
1260+
1261+ if (ngx_strncmp(name->data, shm_zone[i].shm.name.data, name->len)
1262+ != 0)
1263+ {
1264+ continue;
1265+ }
1266+
1267+ if (size && size != shm_zone[i].shm.size) {
1268+ ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
1269+ "the size %uz of shared memory zone \"%V\" "
1270+ "conflicts with already declared size %uz",
1271+ size, &shm_zone[i].shm.name, shm_zone[i].shm.size);
1272+ return NULL;
1273+ }
1274+
1275+ if (tag != shm_zone[i].tag) {
1276+ ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
1277+ "the shared memory zone \"%V\" is "
1278+ "already declared for a different use",
1279+ &shm_zone[i].shm.name);
1280+ return NULL;
1281+ }
1282+
1283+ return &shm_zone[i];
1284+ }
1285+
1286+ shm_zone = ngx_list_push(&cf->cycle->shared_memory);
1287+
1288+ if (shm_zone == NULL) {
1289+ return NULL;
1290+ }
1291+
1292+ shm_zone->data = NULL;
1293+ shm_zone->shm.log = cf->cycle->log;
1294+ shm_zone->shm.size = size;
1295+ shm_zone->shm.name = *name;
1296+ shm_zone->shm.exists = 0;
1297+ shm_zone->init = NULL;
1298+ shm_zone->tag = tag;
1299+
1300+ return shm_zone;
1301+}
1302+
1303+
1304+static void
1305+ngx_clean_old_cycles(ngx_event_t *ev)
1306+{
1307+ ngx_uint_t i, n, found, live;
1308+ ngx_log_t *log;
1309+ ngx_cycle_t **cycle;
1310+
1311+ log = ngx_cycle->log;
1312+ ngx_temp_pool->log = log;
1313+
1314+ ngx_log_debug0(NGX_LOG_DEBUG_CORE, log, 0, "clean old cycles");
1315+
1316+ live = 0;
1317+
1318+ cycle = ngx_old_cycles.elts;
1319+ for (i = 0; i < ngx_old_cycles.nelts; i++) {
1320+
1321+ if (cycle[i] == NULL) {
1322+ continue;
1323+ }
1324+
1325+ found = 0;
1326+
1327+ for (n = 0; n < cycle[i]->connection_n; n++) {
1328+ if (cycle[i]->connections[n].fd != (ngx_socket_t) -1) {
1329+ found = 1;
1330+
1331+ ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, "live fd:%d", n);
1332+
1333+ break;
1334+ }
1335+ }
1336+
1337+ if (found) {
1338+ live = 1;
1339+ continue;
1340+ }
1341+
1342+ ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, "clean old cycle: %d", i);
1343+
1344+ ngx_destroy_pool(cycle[i]->pool);
1345+ cycle[i] = NULL;
1346+ }
1347+
1348+ ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, "old cycles status: %d", live);
1349+
1350+ if (live) {
1351+ ngx_add_timer(ev, 30000);
1352+
1353+ } else {
1354+ ngx_destroy_pool(ngx_temp_pool);
1355+ ngx_temp_pool = NULL;
1356+ ngx_old_cycles.nelts = 0;
1357+ }
1358+}
1359
1360=== modified file 'CHANGES'
1361--- CHANGES 2010-03-03 23:50:36 +0000
1362+++ CHANGES 2010-07-21 11:15:58 +0000
1363@@ -1,4 +1,125 @@
1364
1365+Changes with nginx 0.7.67 15 Jun 2010
1366+
1367+ *) Security: nginx/Windows worker might be terminated abnormally if a
1368+ requested file name has invalid UTF-8 encoding.
1369+
1370+
1371+Changes with nginx 0.7.66 07 Jun 2010
1372+
1373+ *) Security: now nginx/Windows ignores default file stream name.
1374+ Thanks to Jose Antonio Vazquez Gonzalez.
1375+
1376+ *) Change: now the charset filter runs before the SSI filter.
1377+
1378+ *) Change: now no message is written in an error log if a variable is
1379+ not found by $r->variable() method.
1380+
1381+ *) Change: now keepalive connections after POST requests are not
1382+ disabled for MSIE 7.0+.
1383+ Thanks to Adam Lounds.
1384+
1385+ *) Feature: the "proxy_no_cache" and "fastcgi_no_cache" directives.
1386+
1387+ *) Feature: now the "rewrite" directive does a redirect automatically
1388+ if the $scheme variable is used.
1389+ Thanks to Piotr Sikora.
1390+
1391+ *) Feature: the "chunked_transfer_encoding" directive.
1392+
1393+ *) Feature: the $geoip_city_continent_code, $geoip_latitude, and
1394+ $geoip_longitude variables.
1395+ Thanks to Arvind Sundararajan.
1396+
1397+ *) Feature: now the ngx_http_image_filter_module deletes always EXIF
1398+ and other application specific data if the data consume more than 5%
1399+ of a JPEG file.
1400+
1401+ *) Feature: now the "msie_padding" directive works for Chrome too.
1402+
1403+ *) Workaround: now keepalive connections are disabled for Safari.
1404+ Thanks to Joshua Sierles.
1405+
1406+ *) Bugfix: nginx ignored the "private" and "no-store" values in the
1407+ "Cache-Control" backend response header line.
1408+
1409+ *) Bugfix: an "&" character was not escaped when it was copied in
1410+ arguments part in a rewrite rule.
1411+
1412+ *) Bugfix: nginx might be terminated abnormally while a signal
1413+ processing or if the directive "timer_resolution" was used on
1414+ platforms which do not support kqueue or eventport notification
1415+ methods.
1416+ Thanks to George Xie and Maxim Dounin.
1417+
1418+ *) Bugfix: if temporary files and permanent storage area resided at
1419+ different file systems, then permanent file modification times were
1420+ incorrect.
1421+ Thanks to Maxim Dounin.
1422+
1423+ *) Bugfix: ngx_http_memcached_module might issue the error message
1424+ "memcached sent invalid trailer".
1425+ Thanks to Maxim Dounin.
1426+
1427+ *) Bugfix: nginx could not built zlib-1.2.4 library using the library
1428+ sources.
1429+ Thanks to Maxim Dounin.
1430+
1431+ *) Bugfix: values of the $query_string, $arg_..., etc. variables cached
1432+ in main request were used by the SSI module in subrequests.
1433+
1434+ *) Bugfix: nginx did not support HTTPS referrers.
1435+
1436+ *) Bugfix: nginx/Windows might not find file if path in configuration
1437+ was given in other character case; the bug had appeared in 0.7.65.
1438+
1439+ *) Bugfix: the $date_local variable has an incorrect value, if the "%s"
1440+ format was used.
1441+ Thanks to Maxim Dounin.
1442+
1443+ *) Bugfix: nginx did not support all ciphers and digests used in client
1444+ certificates.
1445+ Thanks to Innocenty Enikeew.
1446+
1447+ *) Bugfix: if ssl_session_cache was not set or was set to "none", then
1448+ during client certificate verify the error "session id context
1449+ uninitialized" might occur; the bug had appeared in 0.7.1.
1450+
1451+ *) Bugfix: OpenSSL-1.0.0 compatibility on 64-bit Linux.
1452+ Thanks to Maxim Dounin.
1453+
1454+ *) Bugfix: a geo range returned default value if the range included two
1455+ or more /16 networks and did not begin at /16 network boundary.
1456+
1457+ *) Bugfix: the $uid_got variable might not be used in the SSI and perl
1458+ modules.
1459+
1460+ *) Bugfix: a worker process hung if a FIFO file was requested.
1461+ Thanks to Vicente Aguilar and Maxim Dounin.
1462+
1463+ *) Bugfix: a variable value was repeatedly encoded after each an "echo"
1464+ SSI-command output; the bug had appeared in 0.6.14.
1465+
1466+ *) Bugfix: a "stub" parameter of an "include" SSI directive was not
1467+ used, if empty response has 200 status code.
1468+
1469+ *) Bugfix: a block used in a "stub" parameter of an "include" SSI
1470+ directive was output with "text/plain" MIME type.
1471+
1472+ *) Bugfix: if a proxied or FastCGI request was internally redirected to
1473+ another proxied or FastCGI location, then a segmentation fault might
1474+ occur in a worker process; the bug had appeared in 0.7.65.
1475+ Thanks to Yichun Zhang.
1476+
1477+ *) Bugfix: IMAP connections may hang until they timed out while talking
1478+ to Zimbra server.
1479+ Thanks to Alan Batie.
1480+
1481+ *) Bugfix: nginx did not support chunked transfer encoding for 201
1482+ responses.
1483+ Thanks to Julian Reich.
1484+
1485+
1486 Changes with nginx 0.7.65 01 Feb 2010
1487
1488 *) Security: now nginx/Windows ignores trailing spaces in URI.
1489
1490=== modified file 'CHANGES.ru'
1491--- CHANGES.ru 2010-03-03 23:50:36 +0000
1492+++ CHANGES.ru 2010-07-21 11:15:58 +0000
1493@@ -1,4 +1,128 @@
1494
1495+éÚÍÅÎÅÎÉÑ × nginx 0.7.67 15.06.2010
1496+
1497+ *) âÅÚÏÐÁÓÎÏÓÔØ: ÒÁÂÏÞÉÊ ÐÒÏÃÅÓÓ nginx/Windows ÍÏÇ ÚÁ×ÅÒÛÁÔØÓÑ Á×ÁÒÉÊÎÏ
1498+ ÐÒÉ ÚÁÐÒÏÓÅ ÆÁÊÌÁ Ó ÎÅ×ÅÒÎÏÊ ËÏÄÉÒÏ×ËÏÊ UTF-8.
1499+
1500+
1501+éÚÍÅÎÅÎÉÑ × nginx 0.7.66 07.06.2010
1502+
1503+ *) âÅÚÏÐÁÓÎÏÓÔØ: ÔÅÐÅÒØ nginx/Windows ÉÇÎÏÒÉÒÕÅÔ ÉÍÑ ÐÏÔÏËÁ ÆÁÊÌÁ ÐÏ
1504+ ÕÍÏÌÞÁÎÉÀ.
1505+ óÐÁÓÉÂÏ Jose Antonio Vazquez Gonzalez.
1506+
1507+ *) éÚÍÅÎÅÎÉÅ: ÔÅÐÅÒØ charset-ÆÉÌØÔÒ ÒÁÂÏÔÁÅÔ ÄÏ SSI-ÆÉÌØÔÒÁ.
1508+
1509+ *) éÚÍÅÎÅÎÉÅ: ÔÅÐÅÒØ × ÌÏÇ ÏÛÉÂÏË ÎÅ ÐÉÛÅÔÓÑ ÓÏÏÂÝÅÎÉÅ, ÅÓÌÉ ÐÅÒÅÍÅÎÎÁÑ
1510+ ÎÅ ÎÁÊÄÅÎÁ Ó ÐÏÍÏÝØÀ ÍÅÔÏÄÁ $r->variable().
1511+
1512+ *) éÚÍÅÎÅÎÉÅ: ÔÅÐÅÒØ keepalive ÓÏÅÄÉÎÅÎÉÑ ÐÏÓÌÅ ÚÁÐÒÏÓÏ× POST ÎÅ
1513+ ÚÁÐÒÅÝÁÀÔÓÑ ÄÌÑ MSIE 7.0+.
1514+ óÐÁÓÉÂÏ Adam Lounds.
1515+
1516+ *) äÏÂÁ×ÌÅÎÉÅ: ÄÉÒÅËÔÉ×Ù proxy_no_cache É fastcgi_no_cache.
1517+
1518+ *) äÏÂÁ×ÌÅÎÉÅ: ÔÅÐÅÒØ ÐÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÐÅÒÅÍÅÎÎÏÊ $scheme × ÄÉÒÅËÔÉ×Å
1519+ rewrite Á×ÔÏÍÁÔÉÞÅÓËÉ ÄÅÌÁÅÔÓÑ ÒÅÄÉÒÅËÔ.
1520+ óÐÁÓÉÂÏ Piotr Sikora.
1521+
1522+ *) äÏÂÁ×ÌÅÎÉÅ: ÄÉÒÅËÔÉ×Á chunked_transfer_encoding.
1523+
1524+ *) äÏÂÁ×ÌÅÎÉÅ: ÐÅÒÅÍÅÎÎÙÅ $geoip_city_continent_code, $geoip_latitude É
1525+ $geoip_longitude.
1526+ óÐÁÓÉÂÏ Arvind Sundararajan.
1527+
1528+ *) äÏÂÁ×ÌÅÎÉÅ: ÍÏÄÕÌØ ngx_http_image_filter_module ÔÅÐÅÒØ ×ÓÅÇÄÁ
1529+ ÕÄÁÌÑÅÔ EXIF É ÄÒÕÇÉÅ ÄÁÎÎÙÅ, ÅÓÌÉ ÏÎÉ ÚÁÎÉÍÁÀÔ ÂÏÌØÛÅ 5% ×
1530+ JPEG-ÆÁÊÌÅ.
1531+
1532+ *) äÏÂÁ×ÌÅÎÉÅ: ÔÅÐÅÒØ ÄÉÒÅËÔÉ×Á msie_padding ÒÁÂÏÔÁÅÔ É ÄÌÑ Chrome.
1533+
1534+ *) éÚÍÅÎÅÎÉÅ: ÔÅÐÅÒØ keepalive ÓÏÅÄÉÎÅÎÉÑ ÚÁÐÒÅÝÅÎÙ ÄÌÑ Safari.
1535+ óÐÁÓÉÂÏ Joshua Sierles.
1536+
1537+ *) éÓÐÒÁ×ÌÅÎÉÅ: nginx ÉÇÎÏÒÉÒÏ×ÁÌ ÚÎÁÞÅÎÉÑ "private" É "no-store" ×
1538+ ÓÔÒÏËÅ "Cache-Control" × ÚÁÇÏÌÏ×ËÅ ÏÔ×ÅÔÁ ÂÜËÅÎÄÁ.
1539+
1540+ *) éÓÐÒÁ×ÌÅÎÉÅ: ÓÉÍ×ÏÌ "&" ÐÒÉ ËÏÐÉÒÏ×ÁÎÉÉ × ÁÒÇÕÍÅÎÔÙ × ÐÒÁ×ÉÌÁÈ
1541+ rewrite ÎÅ ÜËÒÁÎÉÒÏ×ÁÌÓÑ.
1542+
1543+ *) éÓÐÒÁ×ÌÅÎÉÅ: nginx ÍÏÇ ÚÁ×ÅÒÛÁÔØÓÑ Á×ÁÒÉÊÎÏ ×Ï ×ÒÅÍÑ ÏÂÒÁÂÏÔËÉ
1544+ ÓÉÇÎÁÌÁ ÉÌÉ ÐÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÄÉÒÅËÔÉ×Ù timer_resolution ÎÁ
1545+ ÐÌÁÔÆÏÒÍÁÈ, ÎÅ ÐÏÄÄÅÒÖÉ×ÁÀÝÉÈ ÍÅÔÏÄÙ kqueue ÉÌÉ eventport.
1546+ óÐÁÓÉÂÏ George Xie É íÁËÓÉÍÕ äÕÎÉÎÕ.
1547+
1548+ *) éÓÐÒÁ×ÌÅÎÉÅ: ÅÓÌÉ ×ÒÅÍÅÎÎÙÅ ÆÁÊÌÙ É ÐÏÓÔÏÑÎÎÏÅ ÍÅÓÔÏ ÈÒÁÎÅÎÉÑ
1549+ ÒÁÓÐÏÌÁÇÁÌÉÓØ ÎÁ ÒÁÚÎÙÈ ÆÁÊÌÏ×ÙÈ ÓÉÓÔÅÍÁÈ, ÔÏ Õ ÐÏÓÔÏÑÎÎÙÈ ÆÁÊÌÏ×
1550+ ×ÒÅÍÑ ÉÚÍÅÎÅÎÉÑ ÂÙÌÏ ÎÅ×ÅÒÎÙÍ.
1551+ óÐÁÓÉÂÏ íÁËÓÉÍÕ äÕÎÉÎÕ.
1552+
1553+ *) éÓÐÒÁ×ÌÅÎÉÅ: ÍÏÄÕÌØ ngx_http_memcached_module ÍÏÇ ×ÙÄÁ×ÁÔØ ÏÛÉÂËÕ
1554+ "memcached sent invalid trailer".
1555+ óÐÁÓÉÂÏ íÁËÓÉÍÕ äÕÎÉÎÕ.
1556+
1557+ *) éÓÐÒÁ×ÌÅÎÉÅ: nginx ÎÅ ÍÏÇ ÓÏÂÒÁÔØ ÂÉÂÌÉÏÔÅËÕ zlib-1.2.4 ÉÚ ÉÓÈÏÄÎÙÈ
1558+ ÔÅËÓÔÏ×.
1559+ óÐÁÓÉÂÏ íÁËÓÉÍÕ äÕÎÉÎÕ.
1560+
1561+ *) éÓÐÒÁ×ÌÅÎÉÅ: ÍÏÄÕÌØ SSI × ÐÏÄÚÁÐÒÏÓÁÈ ÉÓÐÏÌØÚÏ×ÁÌ ÚÁËÜÛÉÒÏ×ÁÎÎÙÅ ×
1562+ ÏÓÎÏ×ÎÏÍ ÚÁÐÒÏÓÅ ÚÎÁÞÅÎÉÑ ÐÅÒÅÍÅÎÎÙÈ $query_string, $arg_... É ÉÍ
1563+ ÐÏÄÏÂÎÙÈ.
1564+
1565+ *) éÓÐÒÁ×ÌÅÎÉÅ: nginx ÎÅ ÐÏÄÄÅÒÖÉ×ÁÌ HTTPS-ÒÅÆÅÒÅÒÙ.
1566+
1567+ *) éÓÐÒÁ×ÌÅÎÉÅ: nginx/Windows ÍÏÇ ÎÅ ÎÁÈÏÄÉÔØ ÆÁÊÌÙ, ÅÓÌÉ ÐÕÔØ ×
1568+ ËÏÎÆÉÇÕÒÁÃÉÉ ÂÙÌ ÚÁÄÁÎ × ÄÒÕÇÏÍ ÒÅÇÉÓÔÒÅ; ÏÛÉÂËÁ ÐÏÑ×ÉÌÁÓØ × 0.7.65.
1569+
1570+ *) éÓÐÒÁ×ÌÅÎÉÅ: ÐÅÒÅÍÅÎÎÁÑ $date_local ×ÙÄÁ×ÁÌÁ ÎÅ×ÅÒÎÏÅ ×ÒÅÍÑ, ÅÓÌÉ
1571+ ÉÓÐÏÌØÚÏ×ÁÌÓÑ ÆÏÒÍÁÔ "%s".
1572+ óÐÁÓÉÂÏ íÁËÓÉÍÕ äÕÎÉÎÕ.
1573+
1574+ *) éÓÐÒÁ×ÌÅÎÉÅ: nginx ÎÅ ÐÏÄÄÅÒÖÉ×ÁÌ ×ÓÅ ÛÉÆÒÙ, ÉÓÐÏÌØÚÕÅÍÙÅ ×
1575+ ËÌÉÅÎÔÓËÉÈ ÓÅÒÔÉÆÉËÁÔÁÈ.
1576+ óÐÁÓÉÂÏ éÎÎÏËÅÎÔÉÀ åÎÉËÅÅ×Õ.
1577+
1578+ *) éÓÐÒÁ×ÌÅÎÉÅ: ÅÓÌÉ ssl_session_cache ÎÅ ÂÙÌ ÕÓÔÁÎÏ×ÌÅÎ ÉÌÉ ÕÓÔÁÎÏ×ÌÅÎ
1579+ × none, ÔÏ ÐÒÉ ÐÒÏ×ÅÒËÅ ËÌÉÅÎÔÓËÏÇÏ ÓÅÒÔÉÆÉËÁÔÙ ÍÏÇÌÁ ÐÒÏÉÓÈÏÄÉÔØ
1580+ ÏÛÉÂËÁ "session id context uninitialized"; ÏÛÉÂËÁ ÐÏÑ×ÉÌÁÓØ × 0.7.1.
1581+
1582+ *) éÓÐÒÁ×ÌÅÎÉÅ: ÓÏ×ÍÅÓÔÉÍÏÓÔØ Ó OpenSSL-1.0.0 ÎÁ 64-ÂÉÔÎÏÍ Linux.
1583+ óÐÁÓÉÂÏ íÁËÓÉÍÕ äÕÎÉÎÕ.
1584+
1585+ *) éÓÐÒÁ×ÌÅÎÉÅ: geo-ÄÉÁÐÁÚÏÎ ×ÏÚ×ÒÁÝÁÌ ÚÎÁÞÅÎÉÅ ÐÏ ÕÍÏÌÞÁÎÉÀ, ÅÓÌÉ
1586+ ÄÉÁÐÁÚÏÎ ×ËÌÀÞÁÌ × ÓÅÂÑ ÏÄÎÕ É ÂÏÌÅÅ ÓÅÔÅÊ ÒÁÚÍÅÒÏÍ /16 É ÎÅ
1587+ ÎÁÞÉÎÁÌÓÑ ÎÁ ÇÒÁÎÉÃÅ ÓÅÔÉ ÒÁÚÍÅÒÏÍ /16.
1588+
1589+ *) éÓÐÒÁ×ÌÅÎÉÅ: ÐÅÒÅÍÅÎÎÕÀ $uid_got ÎÅÌØÚÑ ÂÙÌÏ ÉÓÐÏÌØÚÏ×ÁÔØ × SSI É
1590+ ÐÅÒÌÏ×ÏÍ ÍÏÄÕÌÑÈ.
1591+
1592+ *) éÓÐÒÁ×ÌÅÎÉÅ: ÒÁÂÏÞÉÊ ÐÒÏÃÅÓÓ ÚÁ×ÉÓÁÌ ÐÒÉ ÚÁÐÒÏÓÅ ÆÁÊÌÁ FIFO.
1593+ óÐÁÓÉÂÏ Vicente Aguilar É íÁËÓÉÍÕ äÕÎÉÎÕ.
1594+
1595+ *) éÓÐÒÁ×ÌÅÎÉÅ: ÚÎÁÞÅÎÉÅ ÐÅÒÅÍÅÎÎÏÊ ÐÏ×ÔÏÒÎÏ ÜËÒÁÎÉÒÏ×ÁÌÏÓØ ÐÏÓÌÅ
1596+ ËÁÖÄÏÇÏ ×Ù×ÏÄÁ SSI-ËÏÍÁÎÄÙ echo; ÏÛÉÂËÁ ÐÏÑ×ÉÌÁÓØ × 0.6.14.
1597+
1598+ *) éÓÐÒÁ×ÌÅÎÉÅ: ÐÁÒÁÍÅÔÒ stub × SSI-ÄÉÒÅËÔÉ×Å include ÎÅ ÉÓÐÏÌØÚÏ×ÁÌÓÑ,
1599+ ÅÓÌÉ ÐÕÓÔÏÊ ÏÔ×ÅÔ ÉÍÅÌ ËÏÄ 200.
1600+
1601+ *) éÓÐÒÁ×ÌÅÎÉÅ: ÂÌÏË, ÉÓÐÏÌØÚÕÅÍÙÊ × ÐÁÒÁÍÅÔÒÅ stub × SSI-ÄÉÒÅËÔÉ×Å
1602+ include, ×Ù×ÏÄÉÌÓÑ Ó MIME-ÔÉÐÏÍ "text/plain".
1603+
1604+ *) éÓÐÒÁ×ÌÅÎÉÅ: ÅÓÌÉ ÐÒÏËÓÉÒÏ×ÁÎÎÙÊ ÉÌÉ FastCGI ÚÁÐÒÏÓ ×ÎÕÔÒÅÎÎÅ
1605+ ÐÅÒÅÎÁÐÒÁ×ÌÑÌÓÑ × ÄÒÕÇÏÊ ÐÒÏËÓÉÒÏ×ÁÎÎÙÊ ÉÌÉ FastCGI location, ÔÏ ×
1606+ ÒÁÂÏÞÅÍ ÐÒÏÃÅÓÓÅ ÍÏÇ ÐÒÏÉÚÏÊÔÉ segmentation fault; ÏÛÉÂËÁ ÐÏÑ×ÉÌÁÓØ
1607+ × 0.7.65.
1608+ óÐÁÓÉÂÏ Yichun Zhang.
1609+
1610+ *) éÓÐÒÁ×ÌÅÎÉÅ: ÓÏÅÄÉÎÅÎÉÑ IMAP Ë ÓÅÒ×ÅÒÕ Zimbra ÍÏÇÌÏ ÚÁ×ÉÓÎÕÔØ ÄÏ
1611+ ÔÁÊÍÁÕÔÁ.
1612+ óÐÁÓÉÂÏ Alan Batie.
1613+
1614+ *) éÓÐÒÁ×ÌÅÎÉÅ: nginx ÎÅ ÐÏÄÄÅÒÖÉ×ÁÌ ÐÅÒÅÄÁÞÕ chunk'ÁÍÉ ÄÌÑ 201-ÙÈ
1615+ ÏÔ×ÅÔÏ×.
1616+ óÐÁÓÉÂÏ Julian Reich.
1617+
1618+
1619 éÚÍÅÎÅÎÉÑ × nginx 0.7.65 01.02.2010
1620
1621 *) âÅÚÏÐÁÓÎÏÓÔØ: ÔÅÐÅÒØ nginx/Windows ÉÇÎÏÒÉÒÕÅÔ ÐÒÏÂÅÌÙ × ËÏÎÃÅ URI.
1622@@ -178,7 +302,7 @@
1623
1624 *) äÏÂÁ×ÌÅÎÉÅ: ÄÉÒÅËÔÉ×Ù limit_req_log_level É limit_conn_log_level.
1625
1626- *) éÓÐÒÁ×ÌÅÎÉÅ: ôÅÐÅÒØ ÄÉÒÅËÔÉ×Á limit_req ÓÏÏÔ×ÅÔÓÔ×ÕÅÔ ÁÌÇÏÒÉÔÍÕ
1627+ *) éÓÐÒÁ×ÌÅÎÉÅ: ÔÅÐÅÒØ ÄÉÒÅËÔÉ×Á limit_req ÓÏÏÔ×ÅÔÓÔ×ÕÅÔ ÁÌÇÏÒÉÔÍÕ
1628 leaky bucket.
1629 óÐÁÓÉÂÏ íÁËÓÉÍÕ äÕÎÉÎÕ.
1630
1631@@ -1648,7 +1772,7 @@
1632 óÐÁÓÉÂÏ áÎÄÒÅÀ îÉÇÍÁÔÕÌÉÎÕ.
1633
1634 *) éÓÐÒÁ×ÌÅÎÉÅ: ngx_http_memcached_module ÎÅ ÕÓÔÁÎÁ×ÌÉ×ÁÌ
1635- upstream_response_time.
1636+ $upstream_response_time.
1637 óÐÁÓÉÂÏ íÁËÓÉÍÕ äÕÎÉÎÕ.
1638
1639 *) éÓÐÒÁ×ÌÅÎÉÅ: ÒÁÂÏÞÉÊ ÐÒÏÃÅÓÓ ÍÏÇ ÚÁÃÉËÌÉÔØÓÑ ÐÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ
1640
1641=== modified file 'auto/cc/conf'
1642--- auto/cc/conf 2007-02-19 10:30:07 +0000
1643+++ auto/cc/conf 2010-07-21 11:15:58 +0000
1644@@ -104,6 +104,7 @@
1645 fi
1646
1647 CFLAGS="$CFLAGS $NGX_CC_OPT"
1648+NGX_TEST_LD_OPT="$NGX_LD_OPT"
1649
1650
1651 if [ "$NGX_PLATFORM" != win32 ]; then
1652
1653=== modified file 'auto/cc/gcc'
1654--- auto/cc/gcc 2009-10-19 23:22:06 +0000
1655+++ auto/cc/gcc 2010-07-21 11:15:58 +0000
1656@@ -51,8 +51,6 @@
1657 #NGX_GCC_OPT="-Os"
1658 NGX_GCC_OPT="-O"
1659
1660-CFLAGS="$CFLAGS $NGX_GCC_OPT"
1661-
1662 #CFLAGS="$CFLAGS -fomit-frame-pointer"
1663
1664 case $CPU in
1665
1666=== modified file 'auto/feature'
1667--- auto/feature 2008-09-02 20:48:58 +0000
1668+++ auto/feature 2010-07-21 11:15:58 +0000
1669@@ -39,7 +39,7 @@
1670
1671
1672 ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS $ngx_feature_inc_path \
1673- -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs"
1674+ -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_TEST_LD_OPT $ngx_feature_libs"
1675
1676 ngx_feature_inc_path=
1677
1678
1679=== modified file 'auto/lib/openssl/conf'
1680--- auto/lib/openssl/conf 2010-03-03 23:50:36 +0000
1681+++ auto/lib/openssl/conf 2010-07-21 11:15:58 +0000
1682@@ -19,6 +19,8 @@
1683
1684 # libeay32.lib requires gdi32.lib
1685 CORE_LIBS="$CORE_LIBS gdi32.lib"
1686+ # OpenSSL 1.0.0 requires crypt32.lib
1687+ CORE_LIBS="$CORE_LIBS crypt32.lib"
1688 ;;
1689
1690 *)
1691
1692=== modified file 'auto/lib/openssl/make'
1693--- auto/lib/openssl/make 2010-03-03 23:50:36 +0000
1694+++ auto/lib/openssl/make 2010-07-21 11:15:58 +0000
1695@@ -57,7 +57,7 @@
1696 && \$(MAKE) clean \\
1697 && ./config --prefix=$ngx_prefix no-shared $OPENSSL_OPT \\
1698 && \$(MAKE) \\
1699- && \$(MAKE) install
1700+ && \$(MAKE) install LIBDIR=lib
1701
1702 END
1703
1704
1705=== modified file 'auto/lib/openssl/makefile.bcc'
1706--- auto/lib/openssl/makefile.bcc 2009-10-19 23:22:06 +0000
1707+++ auto/lib/openssl/makefile.bcc 2010-07-21 11:15:58 +0000
1708@@ -5,8 +5,7 @@
1709 all:
1710 cd $(OPENSSL)
1711
1712- perl Configure BC-32 no-shared --prefix=openssl -DNO_SYS_TYPES_H \
1713- $(OPENSSL_OPT)
1714+ perl Configure BC-32 no-shared --prefix=openssl $(OPENSSL_OPT)
1715
1716 ms\do_nasm
1717
1718
1719=== modified file 'auto/lib/openssl/makefile.msvc'
1720--- auto/lib/openssl/makefile.msvc 2009-10-19 23:22:06 +0000
1721+++ auto/lib/openssl/makefile.msvc 2010-07-21 11:15:58 +0000
1722@@ -5,8 +5,7 @@
1723 all:
1724 cd $(OPENSSL)
1725
1726- perl Configure VC-WIN32 no-shared --prefix=openssl -DNO_SYS_TYPES_H \
1727- $(OPENSSL_OPT)
1728+ perl Configure VC-WIN32 no-shared --prefix=openssl $(OPENSSL_OPT)
1729
1730 ms\do_ms
1731
1732
1733=== modified file 'auto/lib/zlib/make'
1734--- auto/lib/zlib/make 2009-10-19 23:22:06 +0000
1735+++ auto/lib/zlib/make 2010-07-21 11:15:58 +0000
1736@@ -53,7 +53,7 @@
1737
1738 $ZLIB/libz.a: $NGX_MAKEFILE
1739 cd $ZLIB \\
1740- && \$(MAKE) clean \\
1741+ && \$(MAKE) distclean \\
1742 && cp contrib/asm586/match.S . \\
1743 && CFLAGS="$ZLIB_OPT -DASMV" CC="\$(CC)" \\
1744 ./configure \\
1745@@ -70,7 +70,7 @@
1746
1747 $ZLIB/libz.a: $NGX_MAKEFILE
1748 cd $ZLIB \\
1749- && \$(MAKE) clean \\
1750+ && \$(MAKE) distclean \\
1751 && cp contrib/asm686/match.S . \\
1752 && CFLAGS="$ZLIB_OPT -DASMV" CC="\$(CC)" \\
1753 ./configure \\
1754@@ -103,7 +103,7 @@
1755
1756 $ZLIB/libz.a: $NGX_MAKEFILE
1757 cd $ZLIB \\
1758- && \$(MAKE) clean \\
1759+ && \$(MAKE) distclean \\
1760 && CFLAGS="$ZLIB_OPT" CC="\$(CC)" \\
1761 ./configure \\
1762 && \$(MAKE) libz.a
1763
1764=== modified file 'auto/modules'
1765--- auto/modules 2009-11-30 13:34:00 +0000
1766+++ auto/modules 2010-07-21 11:15:58 +0000
1767@@ -101,8 +101,8 @@
1768 # ngx_http_range_header_filter
1769 # ngx_http_gzip_filter
1770 # ngx_http_postpone_filter
1771+# ngx_http_ssi_filter
1772 # ngx_http_charset_filter
1773-# ngx_http_ssi_filter
1774 # ngx_http_xslt_filter
1775 # ngx_http_image_filter_filter
1776 # ngx_http_sub_filter
1777@@ -130,19 +130,19 @@
1778 HTTP_SRCS="$HTTP_SRCS $HTTP_POSTPONE_FILTER_SRCS"
1779 fi
1780
1781+if [ $HTTP_SSI = YES ]; then
1782+ have=NGX_HTTP_SSI . auto/have
1783+ HTTP_FILTER_MODULES="$HTTP_FILTER_MODULES $HTTP_SSI_FILTER_MODULE"
1784+ HTTP_DEPS="$HTTP_DEPS $HTTP_SSI_DEPS"
1785+ HTTP_SRCS="$HTTP_SRCS $HTTP_SSI_SRCS"
1786+fi
1787+
1788 if [ $HTTP_CHARSET = YES ]; then
1789 have=NGX_HTTP_CHARSET . auto/have
1790 HTTP_FILTER_MODULES="$HTTP_FILTER_MODULES $HTTP_CHARSET_FILTER_MODULE"
1791 HTTP_SRCS="$HTTP_SRCS $HTTP_CHARSET_SRCS"
1792 fi
1793
1794-if [ $HTTP_SSI = YES ]; then
1795- have=NGX_HTTP_SSI . auto/have
1796- HTTP_FILTER_MODULES="$HTTP_FILTER_MODULES $HTTP_SSI_FILTER_MODULE"
1797- HTTP_DEPS="$HTTP_DEPS $HTTP_SSI_DEPS"
1798- HTTP_SRCS="$HTTP_SRCS $HTTP_SSI_SRCS"
1799-fi
1800-
1801 if [ $HTTP_XSLT = YES ]; then
1802 USE_LIBXSLT=YES
1803 HTTP_FILTER_MODULES="$HTTP_FILTER_MODULES $HTTP_XSLT_FILTER_MODULE"
1804
1805=== modified file 'auto/unix'
1806--- auto/unix 2009-10-19 23:22:06 +0000
1807+++ auto/unix 2010-07-21 11:15:58 +0000
1808@@ -133,6 +133,16 @@
1809 . auto/feature
1810
1811
1812+ngx_feature="sys_errlist[]"
1813+ngx_feature_name="NGX_HAVE_SYS_ERRLIST"
1814+ngx_feature_run=yes
1815+ngx_feature_incs="#include <stdio.h>"
1816+ngx_feature_path=
1817+ngx_feature_libs=
1818+ngx_feature_test="int n = sys_nerr; const char *p = sys_errlist[1];"
1819+. auto/feature
1820+
1821+
1822 ngx_feature="localtime_r()"
1823 ngx_feature_name="NGX_HAVE_LOCALTIME_R"
1824 ngx_feature_run=no
1825
1826=== added file 'debian/README.Debian'
1827--- debian/README.Debian 1970-01-01 00:00:00 +0000
1828+++ debian/README.Debian 2010-07-21 11:15:58 +0000
1829@@ -0,0 +1,9 @@
1830+README for Debian
1831+-----------------
1832+
1833+ Files under /var/www/ are not supported as per Debian Policy.
1834+ Please see: http://lintian.debian.org/tags/dir-or-file-in-var-www.html and,
1835+ http://www.pathname.com/fhs/pub/fhs-2.3.html#THEVARHIERARCHY for more
1836+ details and explanations.
1837+
1838+ -- Kartik Mistry <kartik@debian.org> Fri, 05 Mar 2010 13:31:15 +0530
1839
1840=== modified file 'debian/changelog'
1841--- debian/changelog 2010-03-05 01:36:05 +0000
1842+++ debian/changelog 2010-07-21 11:15:58 +0000
1843@@ -1,3 +1,104 @@
1844+nginx (0.7.67-2ubuntu1) maverick; urgency=low
1845+
1846+ * Merge from Debian unstable (LP: #608172) Remaining changes:
1847+ + debian/rules:
1848+ with-http_dav_module
1849+ with-http_geoip_module
1850+ with-http_gzip_static_module
1851+ with-http_realip_module
1852+ with-http_sub_module
1853+ + .pc/applied-patches
1854+ fix_reloading_ipv6.diff
1855+
1856+ -- Mikhail Turov <groldster@gmail.com> Wed, 21 Jul 2010 11:57:53 +0100
1857+
1858+nginx (0.7.67-2) unstable; urgency=low
1859+
1860+ * debian/conf/sites-available/default:
1861+ + Removed reference to SSLv2 protocol (Closes: #589139)
1862+ * debian/control:
1863+ + Updated Standards-Version to 3.9.0
1864+ * debian/copyright:
1865+ + Don't point to BSD license file, included exact upstream version of
1866+ license text
1867+ + Added missing copyright owner for contrib/ scripts
1868+ + debian/* license is same as upstream now as discussed with co-maintainers
1869+
1870+ -- Kartik Mistry <kartik@debian.org> Mon, 19 Jul 2010 10:36:32 +0530
1871+
1872+nginx (0.7.67-1) unstable; urgency=low
1873+
1874+ * New upstream release
1875+
1876+ -- Kartik Mistry <kartik@debian.org> Wed, 16 Jun 2010 01:26:51 +0530
1877+
1878+nginx (0.7.65-7) unstable; urgency=low
1879+
1880+ [Kartik Mistry]
1881+ * debian/rules:
1882+ + Enabled HTTPSubModule module in configure (Closes: #584828)
1883+ + Arranged configure options in better manner
1884+
1885+ -- Kartik Mistry <kartik@debian.org> Mon, 07 Jun 2010 14:33:24 +0530
1886+
1887+nginx (0.7.65-6) unstable; urgency=low
1888+
1889+ [Kartik Mistry]
1890+ * debian/README.Debian:
1891+ + Fixed typo and somewhat better wordings
1892+ * debian/conf/mime.types:
1893+ + Added entry to support 7zip files (Closes: #580423)
1894+ * debian/init.d:
1895+ + Do not print config testing info until an error found, Thanks to Ubuntu
1896+ bug 568293
1897+ * debian/copyright:
1898+ + Updated as per DEP-5 specification
1899+
1900+ -- Kartik Mistry <kartik@debian.org> Sat, 22 May 2010 01:41:33 +0530
1901+
1902+nginx (0.7.65-5) unstable; urgency=low
1903+
1904+ [Kartik Mistry]
1905+ * debian/patches/fix_reloading_ipv6.diff:
1906+ + Added patch to fix reloading with IPv6 addresses, Thanks to
1907+ Matthias-Christian Ott <ott@mirix.org> for patch (Closes: #577456)
1908+
1909+ -- Kartik Mistry <kartik@debian.org> Wed, 14 Apr 2010 11:36:48 +0530
1910+
1911+nginx (0.7.65-4) unstable; urgency=low
1912+
1913+ [Kartik Mistry]
1914+ * debian/conf/sites-available/default:
1915+ + Really listen for both IPv4 and IPv6 addresses. Thanks to Nikolaus
1916+ Schulz <microschulz@web.de> for notice (Closes: #574983)
1917+ * debian/control, debian/rules:
1918+ + Added GeoIP support, Thanks to Caetano Carezzato
1919+ <caetano@vision.ime.usp.br> (Closes: #575280)
1920+ * debian/conf/mime.types:
1921+ + Added svg entry to mime.types, Jeremy Lal <kapouer@melix.org>
1922+ (Closes: #575155)
1923+
1924+ -- Kartik Mistry <kartik@debian.org> Thu, 25 Mar 2010 00:21:50 +0530
1925+
1926+nginx (0.7.65-3) unstable; urgency=medium
1927+
1928+ [Kartik Mistry]
1929+ * Urgency set to medium due to Release Goal
1930+ * debian/conf/sites-available/default:
1931+ + Listen for both IPv4 and IPv6 addresses by default (Closes: #574983)
1932+
1933+ -- Kartik Mistry <kartik@debian.org> Tue, 23 Mar 2010 10:30:18 +0530
1934+
1935+nginx (0.7.65-2) unstable; urgency=low
1936+
1937+ * debian/README.Debian:
1938+ + Added explanation about not installing files in /var/www/
1939+ (Closes: #572513)
1940+ * debian/rules:
1941+ + Readded realip module support (Closes: #507419)
1942+
1943+ -- Kartik Mistry <kartik@debian.org> Sat, 06 Mar 2010 13:14:48 +0530
1944+
1945 nginx (0.7.65-1ubuntu2) lucid; urgency=low
1946
1947 * Re-enable http_realip_module (debian/rules).
1948
1949=== modified file 'debian/conf/mime.types'
1950--- debian/conf/mime.types 2007-12-08 11:27:54 +0000
1951+++ debian/conf/mime.types 2010-07-21 11:15:58 +0000
1952@@ -20,6 +20,7 @@
1953 image/x-icon ico;
1954 image/x-jng jng;
1955 image/x-ms-bmp bmp;
1956+ image/svg+xml svg svgz;
1957
1958 application/java-archive jar war ear;
1959 application/mac-binhex40 hqx;
1960@@ -31,6 +32,7 @@
1961 application/vnd.ms-powerpoint ppt;
1962 application/vnd.wap.wmlc wmlc;
1963 application/vnd.wap.xhtml+xml xhtml;
1964+ application/x-7z-compressed 7z;
1965 application/x-cocoa cco;
1966 application/x-java-archive-diff jardiff;
1967 application/x-java-jnlp-file jnlp;
1968
1969=== modified file 'debian/conf/sites-available/default'
1970--- debian/conf/sites-available/default 2010-02-01 23:44:21 +0000
1971+++ debian/conf/sites-available/default 2010-07-21 11:15:58 +0000
1972@@ -5,13 +5,16 @@
1973 # statements for each of your virtual hosts
1974
1975 server {
1976- listen 80 default;
1977+
1978+ listen 80; ## listen for ipv4
1979+ listen [::]:80 default ipv6only=on; ## listen for ipv6
1980+
1981 server_name localhost;
1982
1983 access_log /var/log/nginx/localhost.access.log;
1984
1985 location / {
1986- root /var/www/nginx-default;
1987+ root /var/www;
1988 index index.html index.htm;
1989 }
1990
1991@@ -86,8 +89,8 @@
1992
1993 #ssl_session_timeout 5m;
1994
1995-#ssl_protocols SSLv2 SSLv3 TLSv1;
1996-#ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
1997+#ssl_protocols SSLv3 TLSv1;
1998+#ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
1999 #ssl_prefer_server_ciphers on;
2000
2001 #location / {
2002
2003=== modified file 'debian/control'
2004--- debian/control 2010-03-03 23:50:36 +0000
2005+++ debian/control 2010-07-21 11:15:58 +0000
2006@@ -7,10 +7,11 @@
2007 Kartik Mistry <kartik@debian.org>
2008 Build-Depends: debhelper (>= 7),
2009 autotools-dev,
2010+ libgeoip-dev,
2011 libssl-dev,
2012 libpcre3-dev,
2013 zlib1g-dev
2014-Standards-Version: 3.8.4
2015+Standards-Version: 3.9.0
2016 Homepage: http://nginx.net
2017 Vcs-Svn: svn://svn.debian.org/svn/collab-maint/deb-maint/nginx/trunk
2018 Vcs-Browser: http://svn.debian.org/wsvn/collab-maint/deb-maint/nginx/trunk
2019
2020=== modified file 'debian/copyright'
2021--- debian/copyright 2010-02-05 11:20:28 +0000
2022+++ debian/copyright 2010-07-21 11:15:58 +0000
2023@@ -1,39 +1,40 @@
2024-This package was debianized by Jose Parrella <joseparrella@cantv.net> on
2025-Tue, 5 Sep 2006 11:33:34 -0400.
2026-
2027-It was downloaded from http://nginx.net/
2028-
2029+Format-Specification: http://svn.debian.org/wsvn/dep/web/deps/dep5.mdwn?op=file&rev=135
2030+Name: nginx
2031+Maintainer: Jose Parrella <joseparrella@cantv.net>
2032+Source: http://nginx.net/
2033 Upstream Author: Igor Sysoev <igor@sysoev.ru>
2034
2035-Copyright © 2002-2010 Igor Sysoev <igor@sysoev.ru>
2036-
2037+Files: *
2038+Copyright: © 2002-2010, Igor Sysoev <igor@sysoev.ru>
2039 License: BSD
2040-
2041- Redistribution and use in source and binary forms, with or without
2042- modification, are permitted provided that the following conditions
2043- are met:
2044- 1. Redistributions of source code must retain the above copyright
2045- notice, this list of conditions and the following disclaimer.
2046- 2. Redistributions in binary form must reproduce the above copyright
2047- notice, this list of conditions and the following disclaimer in the
2048- documentation and/or other materials provided with the distribution.
2049-
2050- THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2051- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2052- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2053- ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2054- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2055- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2056- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2057- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2058- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2059- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2060- SUCH DAMAGE.
2061-
2062-On Debian systems, the complete text of the BSD License can be found in
2063-`/usr/share/common-licenses/BSD'.
2064-
2065-The Debian packaging is © 2006-2010, Jose Parrella <joseparrella@cantv.net>,
2066-Fabio Tranchitella <kobold@debian.org> and © 2009-2010, Kartik Mistry
2067-<kartik@debian.org> and is licensed under the GPL-2 or later, see
2068-`/usr/share/common-licenses/GPL-2' and `/usr/share/common-licenses/GPL-3'.
2069+ Redistribution and use in source and binary forms, with or without
2070+ modification, are permitted provided that the following conditions are met:
2071+ .
2072+ 1. Redistributions of source code must retain the above copyright notice, this
2073+ list of conditions and the following disclaimer.
2074+ 2. Redistributions in binary form must reproduce the above copyright notice,
2075+ this list of conditions and the following disclaimer in the documentation
2076+ and/or other materials provided with the distribution.
2077+ .
2078+ THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
2079+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
2080+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
2081+ DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
2082+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
2083+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
2084+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
2085+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2086+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
2087+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2088+
2089+Files: contrib/geo2nginx.pl
2090+Copyright: © 2005, Andrei Nigmatulin
2091+
2092+Files: modules/nginx-upstream-fair/ngx_http_upstream_fair_module.c
2093+Copyright: © 2007, Igor Sysoev, Grzegorz Nosek
2094+
2095+Files: debian/*
2096+Copyright: © 2006-2010, Jose Parrella <joseparrella@cantv.net>,
2097+ Fabio Tranchitella <kobold@debian.org>
2098+ © 2009-2010, Kartik Mistry <kartik@debian.org>
2099+License: Same as upstream license.
2100
2101=== modified file 'debian/init.d'
2102--- debian/init.d 2010-03-03 23:50:36 +0000
2103+++ debian/init.d 2010-07-21 11:15:58 +0000
2104@@ -27,10 +27,11 @@
2105 . /lib/lsb/init-functions
2106
2107 test_nginx_config() {
2108- if nginx -t $DAEMON_OPTS
2109+ if $DAEMON -t $DAEMON_OPTS >/dev/null 2>&1
2110 then
2111 return 0
2112 else
2113+ $DAEMON -t $DAEMON_OPTS
2114 return $?
2115 fi
2116 }
2117
2118=== added file 'debian/patches/fix_reloading_ipv6.diff'
2119--- debian/patches/fix_reloading_ipv6.diff 1970-01-01 00:00:00 +0000
2120+++ debian/patches/fix_reloading_ipv6.diff 2010-07-21 11:15:58 +0000
2121@@ -0,0 +1,15 @@
2122+Description: Patch to fix reloading IPv6 addresses
2123+Debian Bug: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=577456
2124+Author: Matthias-Christian Ott <ott@mirix.org>
2125+
2126+--- nginx-0.7.65.orig/src/core/ngx_cycle.c 2010-04-13 10:07:14.000000000 +0530
2127++++ nginx-0.7.65/src/core/ngx_cycle.c 2010-04-13 10:09:59.000000000 +0530
2128+@@ -847,7 +847,7 @@
2129+ sin61 = (struct sockaddr_in6 *) sa1;
2130+ sin62 = (struct sockaddr_in6 *) sa2;
2131+
2132+- if (sin61->sin6_port != sin61->sin6_port) {
2133++ if (sin61->sin6_port != sin62->sin6_port) {
2134+ return NGX_DECLINED;
2135+ }
2136+
2137
2138=== modified file 'debian/patches/nginx-upstream-fair.diff' (properties changed: +x to -x)
2139=== modified file 'debian/patches/series'
2140--- debian/patches/series 2010-02-01 23:44:21 +0000
2141+++ debian/patches/series 2010-07-21 11:15:58 +0000
2142@@ -1,2 +1,3 @@
2143 nginx-upstream-fair.diff
2144 dlopen.diff
2145+fix_reloading_ipv6.diff
2146
2147=== modified file 'debian/rules'
2148--- debian/rules 2010-03-05 01:36:05 +0000
2149+++ debian/rules 2010-07-21 11:15:58 +0000
2150@@ -23,19 +23,24 @@
2151 endif
2152 ./configure --conf-path=/etc/nginx/nginx.conf \
2153 --error-log-path=/var/log/nginx/error.log \
2154- --pid-path=/var/run/nginx.pid \
2155- --lock-path=/var/lock/nginx.lock \
2156+ --http-client-body-temp-path=/var/lib/nginx/body \
2157+ --http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
2158 --http-log-path=/var/log/nginx/access.log \
2159- --http-client-body-temp-path=/var/lib/nginx/body \
2160 --http-proxy-temp-path=/var/lib/nginx/proxy \
2161- --http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
2162+ --lock-path=/var/lock/nginx.lock \
2163+ --pid-path=/var/run/nginx.pid \
2164 --with-debug \
2165+ --with-http_dav_module \
2166+ --with-http_flv_module \
2167+ --with-http_geoip_module \
2168+ --with-http_gzip_static_module \
2169+ --with-http_realip_module \
2170 --with-http_stub_status_module \
2171- --with-http_flv_module \
2172 --with-http_ssl_module \
2173 --with-http_dav_module \
2174 --with-http_gzip_static_module \
2175 --with-http_realip_module \
2176+ --with-http_sub_module \
2177 --with-mail \
2178 --with-mail_ssl_module \
2179 --with-ipv6 \
2180
2181=== modified file 'src/core/nginx.h'
2182--- src/core/nginx.h 2010-03-03 23:50:36 +0000
2183+++ src/core/nginx.h 2010-07-21 11:15:58 +0000
2184@@ -8,8 +8,8 @@
2185 #define _NGINX_H_INCLUDED_
2186
2187
2188-#define nginx_version 7065
2189-#define NGINX_VERSION "0.7.65"
2190+#define nginx_version 7067
2191+#define NGINX_VERSION "0.7.67"
2192 #define NGINX_VER "nginx/" NGINX_VERSION
2193
2194 #define NGINX_VAR "NGINX"
2195
2196=== modified file 'src/core/ngx_cycle.c'
2197--- src/core/ngx_cycle.c 2009-11-30 13:34:00 +0000
2198+++ src/core/ngx_cycle.c 2010-07-21 11:15:58 +0000
2199@@ -63,7 +63,7 @@
2200 tp = ngx_timeofday();
2201 tp->sec = 0;
2202
2203- ngx_time_update(0, 0);
2204+ ngx_time_update();
2205
2206
2207 log = old_cycle->log;
2208@@ -847,7 +847,7 @@
2209 sin61 = (struct sockaddr_in6 *) sa1;
2210 sin62 = (struct sockaddr_in6 *) sa2;
2211
2212- if (sin61->sin6_port != sin61->sin6_port) {
2213+ if (sin61->sin6_port != sin62->sin6_port) {
2214 return NGX_DECLINED;
2215 }
2216
2217
2218=== modified file 'src/core/ngx_file.c'
2219--- src/core/ngx_file.c 2010-03-03 23:50:36 +0000
2220+++ src/core/ngx_file.c 2010-07-21 11:15:58 +0000
2221@@ -762,10 +762,12 @@
2222 size -= n;
2223 }
2224
2225- if (ngx_set_file_time(to, nfd, cf->time) != NGX_OK) {
2226- ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,
2227- ngx_set_file_time_n " \"%s\" failed", to);
2228- goto failed;
2229+ if (cf->time != -1) {
2230+ if (ngx_set_file_time(to, nfd, cf->time) != NGX_OK) {
2231+ ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,
2232+ ngx_set_file_time_n " \"%s\" failed", to);
2233+ goto failed;
2234+ }
2235 }
2236
2237 rc = NGX_OK;
2238
2239=== modified file 'src/core/ngx_open_file_cache.c'
2240--- src/core/ngx_open_file_cache.c 2010-03-03 23:50:36 +0000
2241+++ src/core/ngx_open_file_cache.c 2010-07-21 11:15:58 +0000
2242@@ -487,7 +487,14 @@
2243 }
2244
2245 if (!of->log) {
2246- fd = ngx_open_file(name, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0);
2247+
2248+ /*
2249+ * Use non-blocking open() not to hang on FIFO files, etc.
2250+ * This flag has no effect on a regular files.
2251+ */
2252+
2253+ fd = ngx_open_file(name, NGX_FILE_RDONLY|NGX_FILE_NONBLOCK,
2254+ NGX_FILE_OPEN, 0);
2255
2256 } else {
2257 fd = ngx_open_file(name, NGX_FILE_APPEND, NGX_FILE_CREATE_OR_OPEN,
2258
2259=== modified file 'src/core/ngx_string.c'
2260--- src/core/ngx_string.c 2010-03-03 23:50:36 +0000
2261+++ src/core/ngx_string.c 2010-07-21 11:15:58 +0000
2262@@ -1277,13 +1277,13 @@
2263 0xffffffff /* 1111 1111 1111 1111 1111 1111 1111 1111 */
2264 };
2265
2266- /* " ", "#", "%", "+", "?", %00-%1F, %7F-%FF */
2267+ /* " ", "#", "%", "&", "+", "?", %00-%1F, %7F-%FF */
2268
2269 static uint32_t args[] = {
2270 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
2271
2272 /* ?>=< ;:98 7654 3210 /.-, +*)( '&%$ #"! */
2273- 0x80000829, /* 1000 0000 0000 0000 0000 1000 0010 1001 */
2274+ 0x80000869, /* 1000 0000 0000 0000 0000 1000 0110 1001 */
2275
2276 /* _^]\ [ZYX WVUT SRQP ONML KJIH GFED CBA@ */
2277 0x00000000, /* 0000 0000 0000 0000 0000 0000 0000 0000 */
2278
2279=== modified file 'src/core/ngx_times.c'
2280--- src/core/ngx_times.c 2009-10-19 23:22:06 +0000
2281+++ src/core/ngx_times.c 2010-07-21 11:15:58 +0000
2282@@ -28,6 +28,17 @@
2283 volatile ngx_str_t ngx_cached_http_time;
2284 volatile ngx_str_t ngx_cached_http_log_time;
2285
2286+#if !(NGX_WIN32)
2287+
2288+/*
2289+ * locatime() and localtime_r() are not Async-Signal-Safe functions, therefore,
2290+ * they must not be called by a signal handler, so we use the cached
2291+ * GMT offset value. Fortunately the value is changed only two times a year.
2292+ */
2293+
2294+static ngx_int_t cached_gmtoff;
2295+#endif
2296+
2297 static ngx_time_t cached_time[NGX_TIME_SLOTS];
2298 static u_char cached_err_log_time[NGX_TIME_SLOTS]
2299 [sizeof("1970/09/28 12:00:00")];
2300@@ -50,15 +61,17 @@
2301
2302 ngx_cached_time = &cached_time[0];
2303
2304- ngx_time_update(0, 0);
2305+ ngx_time_update();
2306 }
2307
2308
2309 void
2310-ngx_time_update(time_t sec, ngx_uint_t msec)
2311+ngx_time_update(void)
2312 {
2313 u_char *p0, *p1, *p2;
2314 ngx_tm_t tm, gmt;
2315+ time_t sec;
2316+ ngx_uint_t msec;
2317 ngx_time_t *tp;
2318 struct timeval tv;
2319
2320@@ -66,12 +79,10 @@
2321 return;
2322 }
2323
2324- if (sec == 0) {
2325- ngx_gettimeofday(&tv);
2326+ ngx_gettimeofday(&tv);
2327
2328- sec = tv.tv_sec;
2329- msec = tv.tv_usec / 1000;
2330- }
2331+ sec = tv.tv_sec;
2332+ msec = tv.tv_usec / 1000;
2333
2334 ngx_current_msec = (ngx_msec_t) sec * 1000 + msec;
2335
2336@@ -112,12 +123,14 @@
2337 #elif (NGX_HAVE_GMTOFF)
2338
2339 ngx_localtime(sec, &tm);
2340- tp->gmtoff = (ngx_int_t) (tm.ngx_tm_gmtoff / 60);
2341+ cached_gmtoff = (ngx_int_t) (tm.ngx_tm_gmtoff / 60);
2342+ tp->gmtoff = cached_gmtoff;
2343
2344 #else
2345
2346 ngx_localtime(sec, &tm);
2347- tp->gmtoff = ngx_timezone(tm.ngx_tm_isdst);
2348+ cached_gmtoff = ngx_timezone(tm.ngx_tm_isdst);
2349+ tp->gmtoff = cached_gmtoff;
2350
2351 #endif
2352
2353@@ -151,6 +164,57 @@
2354 }
2355
2356
2357+#if !(NGX_WIN32)
2358+
2359+void
2360+ngx_time_sigsafe_update(void)
2361+{
2362+ u_char *p;
2363+ ngx_tm_t tm;
2364+ time_t sec;
2365+ ngx_time_t *tp;
2366+ struct timeval tv;
2367+
2368+ if (!ngx_trylock(&ngx_time_lock)) {
2369+ return;
2370+ }
2371+
2372+ ngx_gettimeofday(&tv);
2373+
2374+ sec = tv.tv_sec;
2375+
2376+ tp = &cached_time[slot];
2377+
2378+ if (tp->sec == sec) {
2379+ ngx_unlock(&ngx_time_lock);
2380+ return;
2381+ }
2382+
2383+ if (slot == NGX_TIME_SLOTS - 1) {
2384+ slot = 0;
2385+ } else {
2386+ slot++;
2387+ }
2388+
2389+ ngx_gmtime(sec + cached_gmtoff * 60, &tm);
2390+
2391+ p = &cached_err_log_time[slot][0];
2392+
2393+ (void) ngx_sprintf(p, "%4d/%02d/%02d %02d:%02d:%02d",
2394+ tm.ngx_tm_year, tm.ngx_tm_mon,
2395+ tm.ngx_tm_mday, tm.ngx_tm_hour,
2396+ tm.ngx_tm_min, tm.ngx_tm_sec);
2397+
2398+ ngx_memory_barrier();
2399+
2400+ ngx_cached_err_log_time.data = p;
2401+
2402+ ngx_unlock(&ngx_time_lock);
2403+}
2404+
2405+#endif
2406+
2407+
2408 u_char *
2409 ngx_http_time(u_char *buf, time_t t)
2410 {
2411
2412=== modified file 'src/core/ngx_times.h'
2413--- src/core/ngx_times.h 2009-10-19 23:22:06 +0000
2414+++ src/core/ngx_times.h 2010-07-21 11:15:58 +0000
2415@@ -20,7 +20,8 @@
2416
2417
2418 void ngx_time_init(void);
2419-void ngx_time_update(time_t sec, ngx_uint_t msec);
2420+void ngx_time_update(void);
2421+void ngx_time_sigsafe_update(void);
2422 u_char *ngx_http_time(u_char *buf, time_t t);
2423 u_char *ngx_http_cookie_time(u_char *buf, time_t t);
2424 void ngx_gmtime(time_t t, ngx_tm_t *tp);
2425
2426=== modified file 'src/event/modules/ngx_devpoll_module.c'
2427--- src/event/modules/ngx_devpoll_module.c 2009-11-08 09:53:46 +0000
2428+++ src/event/modules/ngx_devpoll_module.c 2010-07-21 11:15:58 +0000
2429@@ -375,8 +375,8 @@
2430 err = 0;
2431 }
2432
2433- if (flags & NGX_UPDATE_TIME) {
2434- ngx_time_update(0, 0);
2435+ if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) {
2436+ ngx_time_update();
2437 }
2438
2439 if (err) {
2440
2441=== modified file 'src/event/modules/ngx_epoll_module.c'
2442--- src/event/modules/ngx_epoll_module.c 2009-11-08 09:53:46 +0000
2443+++ src/event/modules/ngx_epoll_module.c 2010-07-21 11:15:58 +0000
2444@@ -407,8 +407,8 @@
2445 err = 0;
2446 }
2447
2448- if (flags & NGX_UPDATE_TIME) {
2449- ngx_time_update(0, 0);
2450+ if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) {
2451+ ngx_time_update();
2452 }
2453
2454 if (err) {
2455
2456=== modified file 'src/event/modules/ngx_eventport_module.c'
2457--- src/event/modules/ngx_eventport_module.c 2009-11-08 09:53:46 +0000
2458+++ src/event/modules/ngx_eventport_module.c 2010-07-21 11:15:58 +0000
2459@@ -405,7 +405,7 @@
2460 err = ngx_errno;
2461
2462 if (flags & NGX_UPDATE_TIME) {
2463- ngx_time_update(0, 0);
2464+ ngx_time_update();
2465 }
2466
2467 if (n == -1) {
2468@@ -439,7 +439,7 @@
2469 for (i = 0; i < events; i++) {
2470
2471 if (event_list[i].portev_source == PORT_SOURCE_TIMER) {
2472- ngx_time_update(0, 0);
2473+ ngx_time_update();
2474 continue;
2475 }
2476
2477
2478=== modified file 'src/event/modules/ngx_kqueue_module.c'
2479--- src/event/modules/ngx_kqueue_module.c 2009-11-30 13:34:00 +0000
2480+++ src/event/modules/ngx_kqueue_module.c 2010-07-21 11:15:58 +0000
2481@@ -543,8 +543,8 @@
2482 err = 0;
2483 }
2484
2485- if (flags & NGX_UPDATE_TIME) {
2486- ngx_time_update(0, 0);
2487+ if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) {
2488+ ngx_time_update();
2489 }
2490
2491 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
2492@@ -595,7 +595,7 @@
2493 #if (NGX_HAVE_TIMER_EVENT)
2494
2495 if (event_list[i].filter == EVFILT_TIMER) {
2496- ngx_time_update(0, 0);
2497+ ngx_time_update();
2498 continue;
2499 }
2500
2501
2502=== modified file 'src/event/modules/ngx_poll_module.c'
2503--- src/event/modules/ngx_poll_module.c 2007-12-08 11:27:54 +0000
2504+++ src/event/modules/ngx_poll_module.c 2010-07-21 11:15:58 +0000
2505@@ -266,8 +266,8 @@
2506 err = 0;
2507 }
2508
2509- if (flags & NGX_UPDATE_TIME) {
2510- ngx_time_update(0, 0);
2511+ if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) {
2512+ ngx_time_update();
2513 }
2514
2515 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
2516
2517=== modified file 'src/event/modules/ngx_rtsig_module.c'
2518--- src/event/modules/ngx_rtsig_module.c 2009-11-08 09:53:46 +0000
2519+++ src/event/modules/ngx_rtsig_module.c 2010-07-21 11:15:58 +0000
2520@@ -323,7 +323,7 @@
2521 "rtsig signo:%d", signo);
2522
2523 if (flags & NGX_UPDATE_TIME) {
2524- ngx_time_update(0, 0);
2525+ ngx_time_update();
2526 }
2527
2528 if (err == NGX_EAGAIN) {
2529@@ -349,7 +349,7 @@
2530 signo, si.si_fd, si.si_band);
2531
2532 if (flags & NGX_UPDATE_TIME) {
2533- ngx_time_update(0, 0);
2534+ ngx_time_update();
2535 }
2536
2537 rtscf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_rtsig_module);
2538@@ -419,7 +419,7 @@
2539
2540 } else if (signo == SIGALRM) {
2541
2542- ngx_time_update(0, 0);
2543+ ngx_time_update();
2544
2545 return NGX_OK;
2546
2547@@ -671,7 +671,7 @@
2548 }
2549
2550 if (flags & NGX_UPDATE_TIME) {
2551- ngx_time_update(0, 0);
2552+ ngx_time_update();
2553 }
2554
2555 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
2556
2557=== modified file 'src/event/modules/ngx_select_module.c'
2558--- src/event/modules/ngx_select_module.c 2009-10-19 23:22:06 +0000
2559+++ src/event/modules/ngx_select_module.c 2010-07-21 11:15:58 +0000
2560@@ -266,8 +266,8 @@
2561 err = 0;
2562 }
2563
2564- if (flags & NGX_UPDATE_TIME) {
2565- ngx_time_update(0, 0);
2566+ if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) {
2567+ ngx_time_update();
2568 }
2569
2570 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
2571
2572=== modified file 'src/event/modules/ngx_win32_select_module.c'
2573--- src/event/modules/ngx_win32_select_module.c 2009-10-19 23:22:06 +0000
2574+++ src/event/modules/ngx_win32_select_module.c 2010-07-21 11:15:58 +0000
2575@@ -273,7 +273,7 @@
2576 }
2577
2578 if (flags & NGX_UPDATE_TIME) {
2579- ngx_time_update(0, 0);
2580+ ngx_time_update();
2581 }
2582
2583 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
2584
2585=== modified file 'src/event/ngx_event.c'
2586--- src/event/ngx_event.c 2009-11-30 13:34:00 +0000
2587+++ src/event/ngx_event.c 2010-07-21 11:15:58 +0000
2588@@ -562,8 +562,6 @@
2589 {
2590 ngx_event_timer_alarm = 1;
2591
2592- ngx_time_update(0, 0);
2593-
2594 #if 1
2595 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0, "timer signal");
2596 #endif
2597
2598=== modified file 'src/event/ngx_event_openssl.c'
2599--- src/event/ngx_event_openssl.c 2010-03-03 23:50:36 +0000
2600+++ src/event/ngx_event_openssl.c 2010-07-21 11:15:58 +0000
2601@@ -106,6 +106,8 @@
2602
2603 ENGINE_load_builtin_engines();
2604
2605+ OpenSSL_add_all_algorithms();
2606+
2607 ngx_ssl_connection_index = SSL_get_ex_new_index(0, NULL, NULL, NULL, NULL);
2608
2609 if (ngx_ssl_connection_index == -1) {
2610@@ -559,6 +561,9 @@
2611 #if (NGX_DEBUG)
2612 {
2613 char buf[129], *s, *d;
2614+#if OPENSSL_VERSION_NUMBER >= 0x1000000fL
2615+ const
2616+#endif
2617 SSL_CIPHER *cipher;
2618
2619 cipher = SSL_get_current_cipher(c->ssl->connection);
2620@@ -1308,10 +1313,14 @@
2621
2622 /* handshake failures */
2623 if (n == SSL_R_DIGEST_CHECK_FAILED /* 149 */
2624+ || n == SSL_R_LENGTH_MISMATCH /* 159 */
2625 || n == SSL_R_NO_CIPHERS_PASSED /* 182 */
2626+ || n == SSL_R_NO_CIPHERS_SPECIFIED /* 183 */
2627 || n == SSL_R_NO_SHARED_CIPHER /* 193 */
2628+ || n == SSL_R_RECORD_LENGTH_MISMATCH /* 213 */
2629 || n == SSL_R_UNEXPECTED_MESSAGE /* 244 */
2630 || n == SSL_R_UNEXPECTED_RECORD /* 245 */
2631+ || n == SSL_R_UNKNOWN_ALERT_TYPE /* 246 */
2632 || n == SSL_R_UNKNOWN_PROTOCOL /* 252 */
2633 || n == SSL_R_WRONG_VERSION_NUMBER /* 267 */
2634 || n == SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC /* 281 */
2635@@ -1424,6 +1433,8 @@
2636 return NGX_OK;
2637 }
2638
2639+ SSL_CTX_set_session_id_context(ssl->ctx, sess_ctx->data, sess_ctx->len);
2640+
2641 if (builtin_session_cache == NGX_SSL_NONE_SCACHE) {
2642
2643 /*
2644@@ -1455,8 +1466,6 @@
2645
2646 SSL_CTX_set_session_cache_mode(ssl->ctx, cache_mode);
2647
2648- SSL_CTX_set_session_id_context(ssl->ctx, sess_ctx->data, sess_ctx->len);
2649-
2650 if (builtin_session_cache != NGX_SSL_NO_BUILTIN_SCACHE) {
2651
2652 if (builtin_session_cache != NGX_SSL_DFLT_BUILTIN_SCACHE) {
2653@@ -2311,5 +2320,6 @@
2654 static void
2655 ngx_openssl_exit(ngx_cycle_t *cycle)
2656 {
2657+ EVP_cleanup();
2658 ENGINE_cleanup();
2659 }
2660
2661=== modified file 'src/event/ngx_event_openssl.h'
2662--- src/event/ngx_event_openssl.h 2010-03-03 23:50:36 +0000
2663+++ src/event/ngx_event_openssl.h 2010-07-21 11:15:58 +0000
2664@@ -15,6 +15,7 @@
2665 #include <openssl/err.h>
2666 #include <openssl/conf.h>
2667 #include <openssl/engine.h>
2668+#include <openssl/evp.h>
2669
2670 #define NGX_SSL_NAME "OpenSSL"
2671
2672
2673=== modified file 'src/http/modules/ngx_http_autoindex_module.c'
2674--- src/http/modules/ngx_http_autoindex_module.c 2009-11-30 13:34:00 +0000
2675+++ src/http/modules/ngx_http_autoindex_module.c 2010-07-21 11:15:58 +0000
2676@@ -160,10 +160,6 @@
2677 return NGX_DECLINED;
2678 }
2679
2680- if (r->zero_in_uri) {
2681- return NGX_DECLINED;
2682- }
2683-
2684 if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {
2685 return NGX_DECLINED;
2686 }
2687
2688=== modified file 'src/http/modules/ngx_http_chunked_filter_module.c'
2689--- src/http/modules/ngx_http_chunked_filter_module.c 2009-10-19 23:22:06 +0000
2690+++ src/http/modules/ngx_http_chunked_filter_module.c 2010-07-21 11:15:58 +0000
2691@@ -50,9 +50,10 @@
2692 static ngx_int_t
2693 ngx_http_chunked_header_filter(ngx_http_request_t *r)
2694 {
2695+ ngx_http_core_loc_conf_t *clcf;
2696+
2697 if (r->headers_out.status == NGX_HTTP_NOT_MODIFIED
2698 || r->headers_out.status == NGX_HTTP_NO_CONTENT
2699- || r->headers_out.status == NGX_HTTP_CREATED
2700 || r != r->main
2701 || (r->method & NGX_HTTP_HEAD))
2702 {
2703@@ -64,7 +65,14 @@
2704 r->keepalive = 0;
2705
2706 } else {
2707- r->chunked = 1;
2708+ clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
2709+
2710+ if (clcf->chunked_transfer_encoding) {
2711+ r->chunked = 1;
2712+
2713+ } else {
2714+ r->keepalive = 0;
2715+ }
2716 }
2717 }
2718
2719
2720=== modified file 'src/http/modules/ngx_http_dav_module.c'
2721--- src/http/modules/ngx_http_dav_module.c 2009-11-30 13:34:00 +0000
2722+++ src/http/modules/ngx_http_dav_module.c 2010-07-21 11:15:58 +0000
2723@@ -146,10 +146,6 @@
2724 ngx_int_t rc;
2725 ngx_http_dav_loc_conf_t *dlcf;
2726
2727- if (r->zero_in_uri) {
2728- return NGX_DECLINED;
2729- }
2730-
2731 dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_module);
2732
2733 if (!(r->method & dlcf->methods)) {
2734@@ -325,13 +321,13 @@
2735 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2736 "http delete filename: \"%s\"", path.data);
2737
2738- if (ngx_file_info(path.data, &fi) == NGX_FILE_ERROR) {
2739+ if (ngx_link_info(path.data, &fi) == NGX_FILE_ERROR) {
2740 err = ngx_errno;
2741
2742 rc = (err == NGX_ENOTDIR) ? NGX_HTTP_CONFLICT : NGX_HTTP_NOT_FOUND;
2743
2744 return ngx_http_dav_error(r->connection->log, err,
2745- rc, ngx_file_info_n, path.data);
2746+ rc, ngx_link_info_n, path.data);
2747 }
2748
2749 if (ngx_is_dir(&fi)) {
2750@@ -358,7 +354,7 @@
2751
2752 /*
2753 * we do not need to test (r->uri.data[r->uri.len - 1] == '/')
2754- * because ngx_file_info("/file/") returned NGX_ENOTDIR above
2755+ * because ngx_link_info("/file/") returned NGX_ENOTDIR above
2756 */
2757
2758 depth = ngx_http_dav_depth(r, 0);
2759@@ -685,12 +681,12 @@
2760 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2761 "http copy to: \"%s\"", copy.path.data);
2762
2763- if (ngx_file_info(copy.path.data, &fi) == NGX_FILE_ERROR) {
2764+ if (ngx_link_info(copy.path.data, &fi) == NGX_FILE_ERROR) {
2765 err = ngx_errno;
2766
2767 if (err != NGX_ENOENT) {
2768 return ngx_http_dav_error(r->connection->log, err,
2769- NGX_HTTP_NOT_FOUND, ngx_file_info_n,
2770+ NGX_HTTP_NOT_FOUND, ngx_link_info_n,
2771 copy.path.data);
2772 }
2773
2774@@ -719,9 +715,9 @@
2775 dir = ngx_is_dir(&fi);
2776 }
2777
2778- if (ngx_file_info(path.data, &fi) == NGX_FILE_ERROR) {
2779+ if (ngx_link_info(path.data, &fi) == NGX_FILE_ERROR) {
2780 return ngx_http_dav_error(r->connection->log, ngx_errno,
2781- NGX_HTTP_NOT_FOUND, ngx_file_info_n,
2782+ NGX_HTTP_NOT_FOUND, ngx_link_info_n,
2783 path.data);
2784 }
2785
2786
2787=== modified file 'src/http/modules/ngx_http_fastcgi_module.c'
2788--- src/http/modules/ngx_http_fastcgi_module.c 2010-03-03 23:50:36 +0000
2789+++ src/http/modules/ngx_http_fastcgi_module.c 2010-07-21 11:15:58 +0000
2790@@ -333,6 +333,13 @@
2791 0,
2792 &ngx_http_fastcgi_module },
2793
2794+ { ngx_string("fastcgi_no_cache"),
2795+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
2796+ ngx_http_no_cache_set_slot,
2797+ NGX_HTTP_LOC_CONF_OFFSET,
2798+ offsetof(ngx_http_fastcgi_loc_conf_t, upstream.no_cache),
2799+ NULL },
2800+
2801 { ngx_string("fastcgi_cache_valid"),
2802 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
2803 ngx_http_file_cache_valid_set_slot,
2804@@ -1890,6 +1897,7 @@
2805 #if (NGX_HTTP_CACHE)
2806 conf->upstream.cache = NGX_CONF_UNSET_PTR;
2807 conf->upstream.cache_min_uses = NGX_CONF_UNSET_UINT;
2808+ conf->upstream.no_cache = NGX_CONF_UNSET_PTR;
2809 conf->upstream.cache_valid = NGX_CONF_UNSET_PTR;
2810 #endif
2811
2812@@ -2111,6 +2119,9 @@
2813
2814 conf->upstream.cache_methods |= NGX_HTTP_GET|NGX_HTTP_HEAD;
2815
2816+ ngx_conf_merge_ptr_value(conf->upstream.no_cache,
2817+ prev->upstream.no_cache, NULL);
2818+
2819 ngx_conf_merge_ptr_value(conf->upstream.cache_valid,
2820 prev->upstream.cache_valid, NULL);
2821
2822
2823=== modified file 'src/http/modules/ngx_http_flv_module.c'
2824--- src/http/modules/ngx_http_flv_module.c 2009-10-19 23:22:06 +0000
2825+++ src/http/modules/ngx_http_flv_module.c 2010-07-21 11:15:58 +0000
2826@@ -80,10 +80,6 @@
2827 return NGX_DECLINED;
2828 }
2829
2830- if (r->zero_in_uri) {
2831- return NGX_DECLINED;
2832- }
2833-
2834 rc = ngx_http_discard_request_body(r);
2835
2836 if (rc != NGX_OK) {
2837
2838=== modified file 'src/http/modules/ngx_http_geo_module.c'
2839--- src/http/modules/ngx_http_geo_module.c 2009-11-30 13:34:00 +0000
2840+++ src/http/modules/ngx_http_geo_module.c 2010-07-21 11:15:58 +0000
2841@@ -589,7 +589,7 @@
2842 ngx_array_t *a;
2843 ngx_http_geo_range_t *range;
2844
2845- for (n = start; n <= end; n += 0x10000) {
2846+ for (n = start; n <= end; n = (n + 0x10000) & 0xffff0000) {
2847
2848 h = n >> 16;
2849
2850
2851=== modified file 'src/http/modules/ngx_http_geoip_module.c'
2852--- src/http/modules/ngx_http_geoip_module.c 2009-11-08 09:53:46 +0000
2853+++ src/http/modules/ngx_http_geoip_module.c 2010-07-21 11:15:58 +0000
2854@@ -30,6 +30,9 @@
2855 ngx_http_variable_value_t *v, uintptr_t data);
2856 static ngx_int_t ngx_http_geoip_city_variable(ngx_http_request_t *r,
2857 ngx_http_variable_value_t *v, uintptr_t data);
2858+static ngx_int_t ngx_http_geoip_city_float_variable(ngx_http_request_t *r,
2859+ ngx_http_variable_value_t *v, uintptr_t data);
2860+static GeoIPRecord *ngx_http_geoip_get_city_record(ngx_http_request_t *r);
2861
2862 static ngx_int_t ngx_http_geoip_add_variables(ngx_conf_t *cf);
2863 static void *ngx_http_geoip_create_conf(ngx_conf_t *cf);
2864@@ -93,23 +96,32 @@
2865
2866 static ngx_http_variable_t ngx_http_geoip_vars[] = {
2867
2868- { ngx_string("geoip_country_code"), NULL, ngx_http_geoip_country_variable,
2869+ { ngx_string("geoip_country_code"), NULL,
2870+ ngx_http_geoip_country_variable,
2871 (uintptr_t) GeoIP_country_code_by_ipnum, 0, 0 },
2872
2873- { ngx_string("geoip_country_code3"), NULL, ngx_http_geoip_country_variable,
2874+ { ngx_string("geoip_country_code3"), NULL,
2875+ ngx_http_geoip_country_variable,
2876 (uintptr_t) GeoIP_country_code3_by_ipnum, 0, 0 },
2877
2878- { ngx_string("geoip_country_name"), NULL, ngx_http_geoip_country_variable,
2879+ { ngx_string("geoip_country_name"), NULL,
2880+ ngx_http_geoip_country_variable,
2881 (uintptr_t) GeoIP_country_name_by_ipnum, 0, 0 },
2882
2883- { ngx_string("geoip_city_country_code"), NULL, ngx_http_geoip_city_variable,
2884+ { ngx_string("geoip_city_continent_code"), NULL,
2885+ ngx_http_geoip_city_variable,
2886+ offsetof(GeoIPRecord, continent_code), 0, 0 },
2887+
2888+ { ngx_string("geoip_city_country_code"), NULL,
2889+ ngx_http_geoip_city_variable,
2890 offsetof(GeoIPRecord, country_code), 0, 0 },
2891
2892 { ngx_string("geoip_city_country_code3"), NULL,
2893 ngx_http_geoip_city_variable,
2894 offsetof(GeoIPRecord, country_code3), 0, 0 },
2895
2896- { ngx_string("geoip_city_country_name"), NULL, ngx_http_geoip_city_variable,
2897+ { ngx_string("geoip_city_country_name"), NULL,
2898+ ngx_http_geoip_city_variable,
2899 offsetof(GeoIPRecord, country_name), 0, 0 },
2900
2901 { ngx_string("geoip_region"), NULL,
2902@@ -124,6 +136,14 @@
2903 ngx_http_geoip_city_variable,
2904 offsetof(GeoIPRecord, postal_code), 0, 0 },
2905
2906+ { ngx_string("geoip_latitude"), NULL,
2907+ ngx_http_geoip_city_float_variable,
2908+ offsetof(GeoIPRecord, latitude), 0, 0 },
2909+
2910+ { ngx_string("geoip_longitude"), NULL,
2911+ ngx_http_geoip_city_float_variable,
2912+ offsetof(GeoIPRecord, longitude), 0, 0 },
2913+
2914 { ngx_null_string, NULL, NULL, 0, 0, 0 }
2915 };
2916
2917@@ -179,34 +199,16 @@
2918 ngx_http_geoip_city_variable(ngx_http_request_t *r,
2919 ngx_http_variable_value_t *v, uintptr_t data)
2920 {
2921- u_long addr;
2922- char *val;
2923- size_t len;
2924- GeoIPRecord *gr;
2925- struct sockaddr_in *sin;
2926- ngx_http_geoip_conf_t *gcf;
2927-
2928- gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip_module);
2929-
2930- if (gcf->city == NULL) {
2931- goto not_found;
2932- }
2933-
2934- if (r->connection->sockaddr->sa_family != AF_INET) {
2935- goto not_found;
2936- }
2937-
2938- sin = (struct sockaddr_in *) r->connection->sockaddr;
2939- addr = ntohl(sin->sin_addr.s_addr);
2940-
2941- gr = GeoIP_record_by_ipnum(gcf->city, addr);
2942-
2943+ char *val;
2944+ size_t len;
2945+ GeoIPRecord *gr;
2946+
2947+ gr = ngx_http_geoip_get_city_record(r);
2948 if (gr == NULL) {
2949 goto not_found;
2950 }
2951
2952 val = *(char **) ((char *) gr + data);
2953-
2954 if (val == NULL) {
2955 goto no_value;
2956 }
2957@@ -243,6 +245,56 @@
2958
2959
2960 static ngx_int_t
2961+ngx_http_geoip_city_float_variable(ngx_http_request_t *r,
2962+ ngx_http_variable_value_t *v, uintptr_t data)
2963+{
2964+ float val;
2965+ GeoIPRecord *gr;
2966+
2967+ gr = ngx_http_geoip_get_city_record(r);
2968+ if (gr == NULL) {
2969+ v->not_found = 1;
2970+ return NGX_OK;
2971+ }
2972+
2973+ v->data = ngx_pnalloc(r->pool, NGX_INT64_LEN + 5);
2974+ if (v->data == NULL) {
2975+ GeoIPRecord_delete(gr);
2976+ return NGX_ERROR;
2977+ }
2978+
2979+ val = *(float *) ((char *) gr + data);
2980+
2981+ v->len = ngx_sprintf(v->data, "%.4f", val) - v->data;
2982+
2983+ GeoIPRecord_delete(gr);
2984+
2985+ return NGX_OK;
2986+}
2987+
2988+
2989+static GeoIPRecord *
2990+ngx_http_geoip_get_city_record(ngx_http_request_t *r)
2991+{
2992+ u_long addr;
2993+ struct sockaddr_in *sin;
2994+ ngx_http_geoip_conf_t *gcf;
2995+
2996+ gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip_module);
2997+
2998+ if (gcf->city && r->connection->sockaddr->sa_family == AF_INET) {
2999+
3000+ sin = (struct sockaddr_in *) r->connection->sockaddr;
3001+ addr = ntohl(sin->sin_addr.s_addr);
3002+
3003+ return GeoIP_record_by_ipnum(gcf->city, addr);
3004+ }
3005+
3006+ return NULL;
3007+}
3008+
3009+
3010+static ngx_int_t
3011 ngx_http_geoip_add_variables(ngx_conf_t *cf)
3012 {
3013 ngx_http_variable_t *var, *v;
3014
3015=== modified file 'src/http/modules/ngx_http_gzip_static_module.c'
3016--- src/http/modules/ngx_http_gzip_static_module.c 2010-03-03 23:50:36 +0000
3017+++ src/http/modules/ngx_http_gzip_static_module.c 2010-07-21 11:15:58 +0000
3018@@ -89,10 +89,6 @@
3019 return NGX_DECLINED;
3020 }
3021
3022- if (r->zero_in_uri) {
3023- return NGX_DECLINED;
3024- }
3025-
3026 gzcf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_static_module);
3027
3028 if (!gzcf->enable) {
3029@@ -179,7 +175,7 @@
3030 #if !(NGX_WIN32) /* the not regular files are probably Unix specific */
3031
3032 if (!of.is_file) {
3033- ngx_log_error(NGX_LOG_CRIT, log, ngx_errno,
3034+ ngx_log_error(NGX_LOG_CRIT, log, 0,
3035 "\"%s\" is not a regular file", path.data);
3036
3037 return NGX_HTTP_NOT_FOUND;
3038
3039=== modified file 'src/http/modules/ngx_http_image_filter_module.c'
3040--- src/http/modules/ngx_http_image_filter_module.c 2009-11-30 13:34:00 +0000
3041+++ src/http/modules/ngx_http_image_filter_module.c 2010-07-21 11:15:58 +0000
3042@@ -63,6 +63,7 @@
3043
3044 ngx_uint_t phase;
3045 ngx_uint_t type;
3046+ ngx_uint_t force;
3047 } ngx_http_image_filter_ctx_t;
3048
3049
3050@@ -501,7 +502,8 @@
3051
3052 if (rc == NGX_OK
3053 && ctx->width <= ctx->max_width
3054- && ctx->height <= ctx->max_height)
3055+ && ctx->height <= ctx->max_height
3056+ && !ctx->force)
3057 {
3058 return ngx_http_image_asis(r, ctx);
3059 }
3060@@ -601,6 +603,7 @@
3061 ngx_http_image_size(ngx_http_request_t *r, ngx_http_image_filter_ctx_t *ctx)
3062 {
3063 u_char *p, *last;
3064+ size_t len, app;
3065 ngx_uint_t width, height;
3066
3067 p = ctx->image;
3068@@ -611,26 +614,38 @@
3069
3070 p += 2;
3071 last = ctx->image + ctx->length - 10;
3072+ width = 0;
3073+ height = 0;
3074+ app = 0;
3075
3076 while (p < last) {
3077
3078 if (p[0] == 0xff && p[1] != 0xff) {
3079
3080 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
3081- "JPEG: %02xd %02xd", *p, *(p + 1));
3082+ "JPEG: %02xd %02xd", p[0], p[1]);
3083
3084 p++;
3085
3086- if (*p == 0xc0 || *p == 0xc1 || *p == 0xc2 || *p == 0xc3
3087- || *p == 0xc9 || *p == 0xca || *p == 0xcb)
3088+ if ((*p == 0xc0 || *p == 0xc1 || *p == 0xc2 || *p == 0xc3
3089+ || *p == 0xc9 || *p == 0xca || *p == 0xcb)
3090+ && (width == 0 || height == 0))
3091 {
3092- goto found;
3093+ width = p[6] * 256 + p[7];
3094+ height = p[4] * 256 + p[5];
3095 }
3096
3097 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
3098 "JPEG: %02xd %02xd", p[1], p[2]);
3099
3100- p += p[1] * 256 + p[2];
3101+ len = p[1] * 256 + p[2];
3102+
3103+ if (*p >= 0xe1 && *p <= 0xef) {
3104+ /* application data, e.g., EXIF, Adobe XMP, etc. */
3105+ app += len;
3106+ }
3107+
3108+ p += len;
3109
3110 continue;
3111 }
3112@@ -638,12 +653,16 @@
3113 p++;
3114 }
3115
3116- return NGX_DECLINED;
3117-
3118- found:
3119-
3120- width = p[6] * 256 + p[7];
3121- height = p[4] * 256 + p[5];
3122+ if (width == 0 || height == 0) {
3123+ return NGX_DECLINED;
3124+ }
3125+
3126+ if (ctx->length / 20 < app) {
3127+ /* force conversion if application data consume more than 5% */
3128+ ctx->force = 1;
3129+ ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
3130+ "app data size: %uz", app);
3131+ }
3132
3133 break;
3134
3135@@ -708,7 +727,8 @@
3136
3137 conf = ngx_http_get_module_loc_conf(r, ngx_http_image_filter_module);
3138
3139- if ((ngx_uint_t) sx <= ctx->max_width
3140+ if (!ctx->force
3141+ && (ngx_uint_t) sx <= ctx->max_width
3142 && (ngx_uint_t) sy <= ctx->max_height)
3143 {
3144 gdImageDestroy(src);
3145
3146=== modified file 'src/http/modules/ngx_http_index_module.c'
3147--- src/http/modules/ngx_http_index_module.c 2010-03-03 23:50:36 +0000
3148+++ src/http/modules/ngx_http_index_module.c 2010-07-21 11:15:58 +0000
3149@@ -116,10 +116,6 @@
3150 return NGX_DECLINED;
3151 }
3152
3153- if (r->zero_in_uri) {
3154- return NGX_DECLINED;
3155- }
3156-
3157 ilcf = ngx_http_get_module_loc_conf(r, ngx_http_index_module);
3158 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
3159
3160
3161=== modified file 'src/http/modules/ngx_http_memcached_module.c'
3162--- src/http/modules/ngx_http_memcached_module.c 2009-11-30 13:34:00 +0000
3163+++ src/http/modules/ngx_http_memcached_module.c 2010-07-21 11:15:58 +0000
3164@@ -423,15 +423,20 @@
3165
3166 if (ngx_strncmp(b->last,
3167 ngx_http_memcached_end + NGX_HTTP_MEMCACHED_END - ctx->rest,
3168- ctx->rest)
3169+ bytes)
3170 != 0)
3171 {
3172 ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0,
3173 "memcached sent invalid trailer");
3174+
3175+ u->length = 0;
3176+ ctx->rest = 0;
3177+
3178+ return NGX_OK;
3179 }
3180
3181- u->length = 0;
3182- ctx->rest = 0;
3183+ u->length -= bytes;
3184+ ctx->rest -= bytes;
3185
3186 return NGX_OK;
3187 }
3188
3189=== modified file 'src/http/modules/ngx_http_proxy_module.c'
3190--- src/http/modules/ngx_http_proxy_module.c 2010-03-03 23:50:36 +0000
3191+++ src/http/modules/ngx_http_proxy_module.c 2010-07-21 11:15:58 +0000
3192@@ -357,6 +357,13 @@
3193 0,
3194 &ngx_http_proxy_module },
3195
3196+ { ngx_string("proxy_no_cache"),
3197+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
3198+ ngx_http_no_cache_set_slot,
3199+ NGX_HTTP_LOC_CONF_OFFSET,
3200+ offsetof(ngx_http_proxy_loc_conf_t, upstream.no_cache),
3201+ NULL },
3202+
3203 { ngx_string("proxy_cache_valid"),
3204 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
3205 ngx_http_file_cache_valid_set_slot,
3206@@ -630,6 +637,7 @@
3207 u->process_header = ngx_http_proxy_process_status_line;
3208 u->abort_request = ngx_http_proxy_abort_request;
3209 u->finalize_request = ngx_http_proxy_finalize_request;
3210+ r->state = 0;
3211
3212 if (plcf->redirects) {
3213 u->rewrite_redirect = ngx_http_proxy_rewrite_redirect;
3214@@ -1191,6 +1199,7 @@
3215 ctx->status_end = NULL;
3216
3217 r->upstream->process_header = ngx_http_proxy_process_status_line;
3218+ r->state = 0;
3219
3220 return NGX_OK;
3221 }
3222@@ -1906,7 +1915,7 @@
3223 * conf->body_set_len = NULL;
3224 * conf->body_set = NULL;
3225 * conf->body_source = { 0, NULL };
3226- * conf->rewrite_locations = NULL;
3227+ * conf->redirects = NULL;
3228 */
3229
3230 conf->upstream.store = NGX_CONF_UNSET;
3231@@ -1931,6 +1940,7 @@
3232 #if (NGX_HTTP_CACHE)
3233 conf->upstream.cache = NGX_CONF_UNSET_PTR;
3234 conf->upstream.cache_min_uses = NGX_CONF_UNSET_UINT;
3235+ conf->upstream.no_cache = NGX_CONF_UNSET_PTR;
3236 conf->upstream.cache_valid = NGX_CONF_UNSET_PTR;
3237 #endif
3238
3239@@ -2155,6 +2165,9 @@
3240 |NGX_HTTP_UPSTREAM_FT_OFF;
3241 }
3242
3243+ ngx_conf_merge_ptr_value(conf->upstream.no_cache,
3244+ prev->upstream.no_cache, NULL);
3245+
3246 ngx_conf_merge_ptr_value(conf->upstream.cache_valid,
3247 prev->upstream.cache_valid, NULL);
3248
3249@@ -2747,9 +2760,16 @@
3250 }
3251
3252 if (ngx_strcmp(value[1].data, "default") == 0) {
3253+ if (plcf->proxy_lengths) {
3254+ ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3255+ "\"proxy_redirect default\" may not be used "
3256+ "with \"proxy_pass\" directive with variables");
3257+ return NGX_CONF_ERROR;
3258+ }
3259+
3260 if (plcf->url.data == NULL) {
3261 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
3262- "\"proxy_rewrite_location default\" must go "
3263+ "\"proxy_redirect default\" must go "
3264 "after the \"proxy_pass\" directive");
3265 return NGX_CONF_ERROR;
3266 }
3267
3268=== modified file 'src/http/modules/ngx_http_random_index_module.c'
3269--- src/http/modules/ngx_http_random_index_module.c 2010-03-03 23:50:36 +0000
3270+++ src/http/modules/ngx_http_random_index_module.c 2010-07-21 11:15:58 +0000
3271@@ -86,10 +86,6 @@
3272 return NGX_DECLINED;
3273 }
3274
3275- if (r->zero_in_uri) {
3276- return NGX_DECLINED;
3277- }
3278-
3279 if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD|NGX_HTTP_POST))) {
3280 return NGX_DECLINED;
3281 }
3282
3283=== modified file 'src/http/modules/ngx_http_referer_module.c'
3284--- src/http/modules/ngx_http_referer_module.c 2009-11-27 11:10:18 +0000
3285+++ src/http/modules/ngx_http_referer_module.c 2010-07-21 11:15:58 +0000
3286@@ -124,18 +124,27 @@
3287 len = r->headers_in.referer->value.len;
3288 ref = r->headers_in.referer->value.data;
3289
3290- if (len < sizeof("http://i.ru") - 1
3291- || (ngx_strncasecmp(ref, (u_char *) "http://", 7) != 0))
3292- {
3293- if (rlcf->blocked_referer) {
3294- goto valid;
3295+ if (len >= sizeof("http://i.ru") - 1) {
3296+ last = ref + len;
3297+
3298+ if (ngx_strncasecmp(ref, (u_char *) "http://", 7) == 0) {
3299+ ref += 7;
3300+ goto valid_scheme;
3301+
3302+ } else if (ngx_strncasecmp(ref, (u_char *) "https://", 8) == 0) {
3303+ ref += 8;
3304+ goto valid_scheme;
3305 }
3306-
3307- goto invalid;
3308- }
3309-
3310- last = ref + len;
3311- ref += 7;
3312+ }
3313+
3314+ if (rlcf->blocked_referer) {
3315+ goto valid;
3316+ }
3317+
3318+ goto invalid;
3319+
3320+valid_scheme:
3321+
3322 i = 0;
3323 key = 0;
3324
3325
3326=== modified file 'src/http/modules/ngx_http_rewrite_module.c'
3327--- src/http/modules/ngx_http_rewrite_module.c 2009-11-30 13:34:00 +0000
3328+++ src/http/modules/ngx_http_rewrite_module.c 2010-07-21 11:15:58 +0000
3329@@ -340,13 +340,10 @@
3330
3331 last = 0;
3332
3333- if (ngx_strncmp(value[2].data, "http://", sizeof("http://") - 1) == 0) {
3334- regex->status = NGX_HTTP_MOVED_TEMPORARILY;
3335- regex->redirect = 1;
3336- last = 1;
3337- }
3338-
3339- if (ngx_strncmp(value[2].data, "https://", sizeof("https://") - 1) == 0) {
3340+ if (ngx_strncmp(value[2].data, "http://", sizeof("http://") - 1) == 0
3341+ || ngx_strncmp(value[2].data, "https://", sizeof("https://") - 1) == 0
3342+ || ngx_strncmp(value[2].data, "$scheme", sizeof("$scheme") - 1) == 0)
3343+ {
3344 regex->status = NGX_HTTP_MOVED_TEMPORARILY;
3345 regex->redirect = 1;
3346 last = 1;
3347
3348=== modified file 'src/http/modules/ngx_http_ssi_filter_module.c'
3349--- src/http/modules/ngx_http_ssi_filter_module.c 2009-11-30 13:34:00 +0000
3350+++ src/http/modules/ngx_http_ssi_filter_module.c 2010-07-21 11:15:58 +0000
3351@@ -14,7 +14,6 @@
3352
3353 #define NGX_HTTP_SSI_ADD_PREFIX 1
3354 #define NGX_HTTP_SSI_ADD_ZERO 2
3355-#define NGX_HTTP_SSI_EXPR_TEST 4
3356
3357
3358 typedef struct {
3359@@ -1701,8 +1700,7 @@
3360 val = ngx_http_ssi_get_variable(r, &var, key);
3361
3362 if (val == NULL) {
3363- vv = ngx_http_get_variable(r, &var, key,
3364- flags & NGX_HTTP_SSI_EXPR_TEST);
3365+ vv = ngx_http_get_variable(r, &var, key);
3366 if (vv == NULL) {
3367 return NGX_ERROR;
3368 }
3369@@ -2061,9 +2059,9 @@
3370 out = data;
3371
3372 if (!r->header_sent) {
3373- if (ngx_http_set_content_type(r) != NGX_OK) {
3374- return NGX_ERROR;
3375- }
3376+ r->headers_out.content_type_len =
3377+ r->parent->headers_out.content_type_len;
3378+ r->headers_out.content_type = r->parent->headers_out.content_type;
3379
3380 if (ngx_http_send_header(r) == NGX_ERROR) {
3381 return NGX_ERROR;
3382@@ -2110,7 +2108,7 @@
3383 value = ngx_http_ssi_get_variable(r, var, key);
3384
3385 if (value == NULL) {
3386- vv = ngx_http_get_variable(r, var, key, 1);
3387+ vv = ngx_http_get_variable(r, var, key);
3388
3389 if (vv == NULL) {
3390 return NGX_HTTP_SSI_ERROR;
3391@@ -2161,11 +2159,10 @@
3392 }
3393 }
3394
3395+ p = value->data;
3396+
3397 switch (ctx->encoding) {
3398
3399- case NGX_HTTP_SSI_NO_ENCODING:
3400- break;
3401-
3402 case NGX_HTTP_SSI_URL_ENCODING:
3403 len = 2 * ngx_escape_uri(NULL, value->data, value->len,
3404 NGX_ESCAPE_HTML);
3405@@ -2177,11 +2174,9 @@
3406 }
3407
3408 (void) ngx_escape_uri(p, value->data, value->len, NGX_ESCAPE_HTML);
3409-
3410- value->len += len;
3411- value->data = p;
3412 }
3413
3414+ len += value->len;
3415 break;
3416
3417 case NGX_HTTP_SSI_ENTITY_ENCODING:
3418@@ -2194,11 +2189,13 @@
3419 }
3420
3421 (void) ngx_escape_html(p, value->data, value->len);
3422-
3423- value->len += len;
3424- value->data = p;
3425 }
3426
3427+ len += value->len;
3428+ break;
3429+
3430+ default: /* NGX_HTTP_SSI_NO_ENCODING */
3431+ len = value->len;
3432 break;
3433 }
3434
3435@@ -2213,8 +2210,8 @@
3436 }
3437
3438 b->memory = 1;
3439- b->pos = value->data;
3440- b->last = value->data + value->len;
3441+ b->pos = p;
3442+ b->last = p + len;
3443
3444 cl->buf = b;
3445 cl->next = NULL;
3446@@ -2362,7 +2359,7 @@
3447 p++;
3448 }
3449
3450- flags = (p == last) ? NGX_HTTP_SSI_EXPR_TEST : 0;
3451+ flags = 0;
3452
3453 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
3454 "left: \"%V\"", &left);
3455@@ -2614,8 +2611,7 @@
3456 return NGX_ERROR;
3457 }
3458
3459- v->len = ngx_sprintf(v->data, "%T", tp->sec + (gmt ? 0 : tp->gmtoff))
3460- - v->data;
3461+ v->len = ngx_sprintf(v->data, "%T", tp->sec) - v->data;
3462
3463 return NGX_OK;
3464 }
3465
3466=== modified file 'src/http/modules/ngx_http_static_module.c'
3467--- src/http/modules/ngx_http_static_module.c 2009-10-19 23:22:06 +0000
3468+++ src/http/modules/ngx_http_static_module.c 2010-07-21 11:15:58 +0000
3469@@ -66,10 +66,6 @@
3470 return NGX_DECLINED;
3471 }
3472
3473- if (r->zero_in_uri) {
3474- return NGX_DECLINED;
3475- }
3476-
3477 log = r->connection->log;
3478
3479 /*
3480@@ -188,7 +184,7 @@
3481 #if !(NGX_WIN32) /* the not regular files are probably Unix specific */
3482
3483 if (!of.is_file) {
3484- ngx_log_error(NGX_LOG_CRIT, log, ngx_errno,
3485+ ngx_log_error(NGX_LOG_CRIT, log, 0,
3486 "\"%s\" is not a regular file", path.data);
3487
3488 return NGX_HTTP_NOT_FOUND;
3489
3490=== modified file 'src/http/modules/ngx_http_userid_filter_module.c'
3491--- src/http/modules/ngx_http_userid_filter_module.c 2009-11-30 13:34:00 +0000
3492+++ src/http/modules/ngx_http_userid_filter_module.c 2010-07-21 11:15:58 +0000
3493@@ -545,7 +545,7 @@
3494 {
3495 ngx_http_variable_t *var;
3496
3497- var = ngx_http_add_variable(cf, &ngx_http_userid_got, NGX_HTTP_VAR_NOHASH);
3498+ var = ngx_http_add_variable(cf, &ngx_http_userid_got, 0);
3499 if (var == NULL) {
3500 return NGX_ERROR;
3501 }
3502
3503=== modified file 'src/http/modules/perl/nginx.pm'
3504--- src/http/modules/perl/nginx.pm 2010-03-03 23:50:36 +0000
3505+++ src/http/modules/perl/nginx.pm 2010-07-21 11:15:58 +0000
3506@@ -47,7 +47,7 @@
3507 HTTP_INSUFFICIENT_STORAGE
3508 );
3509
3510-our $VERSION = '0.7.65';
3511+our $VERSION = '0.7.67';
3512
3513 require XSLoader;
3514 XSLoader::load('nginx', $VERSION);
3515
3516=== modified file 'src/http/modules/perl/nginx.xs'
3517--- src/http/modules/perl/nginx.xs 2009-10-19 23:22:06 +0000
3518+++ src/http/modules/perl/nginx.xs 2010-07-21 11:15:58 +0000
3519@@ -847,7 +847,7 @@
3520
3521 #endif
3522
3523- vv = ngx_http_get_variable(r, &var, hash, 1);
3524+ vv = ngx_http_get_variable(r, &var, hash);
3525 if (vv == NULL) {
3526 XSRETURN_UNDEF;
3527 }
3528@@ -901,9 +901,6 @@
3529 XSRETURN_UNDEF;
3530 }
3531
3532- ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
3533- "variable \"%V\" not found", &var);
3534-
3535 XSRETURN_UNDEF;
3536 }
3537
3538
3539=== modified file 'src/http/modules/perl/ngx_http_perl_module.c'
3540--- src/http/modules/perl/ngx_http_perl_module.c 2010-03-03 23:50:36 +0000
3541+++ src/http/modules/perl/ngx_http_perl_module.c 2010-07-21 11:15:58 +0000
3542@@ -30,12 +30,6 @@
3543 } ngx_http_perl_variable_t;
3544
3545
3546-typedef struct {
3547- SV *sv;
3548- PerlInterpreter *perl;
3549-} ngx_http_perl_cleanup_t;
3550-
3551-
3552 #if (NGX_HTTP_SSI)
3553 static ngx_int_t ngx_http_perl_ssi(ngx_http_request_t *r,
3554 ngx_http_ssi_ctx_t *ssi_ctx, ngx_str_t **params);
3555@@ -174,10 +168,6 @@
3556 static ngx_int_t
3557 ngx_http_perl_handler(ngx_http_request_t *r)
3558 {
3559- if (r->zero_in_uri) {
3560- return NGX_HTTP_NOT_FOUND;
3561- }
3562-
3563 ngx_http_perl_handle_request(r);
3564
3565 return NGX_DONE;
3566
3567=== modified file 'src/http/ngx_http_cache.h'
3568--- src/http/ngx_http_cache.h 2009-11-30 13:34:00 +0000
3569+++ src/http/ngx_http_cache.h 2010-07-21 11:15:58 +0000
3570@@ -133,6 +133,11 @@
3571 char *ngx_http_file_cache_valid_set_slot(ngx_conf_t *cf, ngx_command_t *cmd,
3572 void *conf);
3573
3574+ngx_int_t ngx_http_cache(ngx_http_request_t *r, ngx_array_t *no_cache);
3575+char *ngx_http_no_cache_set_slot(ngx_conf_t *cf, ngx_command_t *cmd,
3576+ void *conf);
3577+
3578+
3579 extern ngx_str_t ngx_http_cache_status[];
3580
3581
3582
3583=== modified file 'src/http/ngx_http_copy_filter_module.c'
3584--- src/http/ngx_http_copy_filter_module.c 2009-10-19 23:22:06 +0000
3585+++ src/http/ngx_http_copy_filter_module.c 2010-07-21 11:15:58 +0000
3586@@ -104,7 +104,9 @@
3587 ctx->output_filter = (ngx_output_chain_filter_pt) ngx_http_next_filter;
3588 ctx->filter_ctx = r;
3589
3590- r->request_output = 1;
3591+ if (in && in->buf && ngx_buf_size(in->buf)) {
3592+ r->request_output = 1;
3593+ }
3594 }
3595
3596 rc = ngx_output_chain(ctx, in);
3597
3598=== modified file 'src/http/ngx_http_core_module.c'
3599--- src/http/ngx_http_core_module.c 2010-03-03 23:50:36 +0000
3600+++ src/http/ngx_http_core_module.c 2010-07-21 11:15:58 +0000
3601@@ -560,6 +560,13 @@
3602 offsetof(ngx_http_core_loc_conf_t, if_modified_since),
3603 &ngx_http_core_if_modified_since },
3604
3605+ { ngx_string("chunked_transfer_encoding"),
3606+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
3607+ ngx_conf_set_flag_slot,
3608+ NGX_HTTP_LOC_CONF_OFFSET,
3609+ offsetof(ngx_http_core_loc_conf_t, chunked_transfer_encoding),
3610+ NULL },
3611+
3612 { ngx_string("error_page"),
3613 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
3614 |NGX_CONF_2MORE,
3615@@ -744,14 +751,24 @@
3616 break;
3617 }
3618
3619- if (r->keepalive && r->headers_in.msie && r->method == NGX_HTTP_POST) {
3620-
3621- /*
3622- * MSIE may wait for some time if an response for
3623- * a POST request was sent over a keepalive connection
3624- */
3625-
3626- r->keepalive = 0;
3627+ if (r->keepalive) {
3628+
3629+ if (r->headers_in.msie6) {
3630+ if (r->method == NGX_HTTP_POST) {
3631+ /*
3632+ * MSIE may wait for some time if an response for
3633+ * a POST request was sent over a keepalive connection
3634+ */
3635+ r->keepalive = 0;
3636+ }
3637+
3638+ } else if (r->headers_in.safari) {
3639+ /*
3640+ * Safari may send a POST request to a closed keepalive
3641+ * connection and stalls for some time
3642+ */
3643+ r->keepalive = 0;
3644+ }
3645 }
3646
3647 if (r->headers_in.content_length_n > 0) {
3648@@ -1288,7 +1305,7 @@
3649
3650 /* no content handler was found */
3651
3652- if (r->uri.data[r->uri.len - 1] == '/' && !r->zero_in_uri) {
3653+ if (r->uri.data[r->uri.len - 1] == '/') {
3654
3655 if (ngx_http_map_uri_to_path(r, &path, &root, 0) != NULL) {
3656 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
3657@@ -2076,7 +2093,6 @@
3658 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
3659 "http subrequest \"%V?%V\"", uri, &sr->args);
3660
3661- sr->zero_in_uri = (flags & NGX_HTTP_ZERO_IN_URI) != 0;
3662 sr->subrequest_in_memory = (flags & NGX_HTTP_SUBREQUEST_IN_MEMORY) != 0;
3663 sr->waited = (flags & NGX_HTTP_SUBREQUEST_WAITED) != 0;
3664
3665@@ -2944,6 +2960,7 @@
3666 lcf->log_subrequest = NGX_CONF_UNSET;
3667 lcf->recursive_error_pages = NGX_CONF_UNSET;
3668 lcf->server_tokens = NGX_CONF_UNSET;
3669+ lcf->chunked_transfer_encoding = NGX_CONF_UNSET;
3670 lcf->types_hash_max_size = NGX_CONF_UNSET_UINT;
3671 lcf->types_hash_bucket_size = NGX_CONF_UNSET_UINT;
3672
3673@@ -3181,6 +3198,8 @@
3674 ngx_conf_merge_value(conf->recursive_error_pages,
3675 prev->recursive_error_pages, 0);
3676 ngx_conf_merge_value(conf->server_tokens, prev->server_tokens, 1);
3677+ ngx_conf_merge_value(conf->chunked_transfer_encoding,
3678+ prev->chunked_transfer_encoding, 1);
3679
3680 ngx_conf_merge_ptr_value(conf->open_file_cache,
3681 prev->open_file_cache, NULL);
3682
3683=== modified file 'src/http/ngx_http_core_module.h'
3684--- src/http/ngx_http_core_module.h 2009-11-30 13:34:00 +0000
3685+++ src/http/ngx_http_core_module.h 2010-07-21 11:15:58 +0000
3686@@ -358,6 +358,7 @@
3687 ngx_flag_t log_subrequest; /* log_subrequest */
3688 ngx_flag_t recursive_error_pages; /* recursive_error_pages */
3689 ngx_flag_t server_tokens; /* server_tokens */
3690+ ngx_flag_t chunked_transfer_encoding; /* chunked_transfer_encoding */
3691
3692 #if (NGX_HTTP_GZIP)
3693 ngx_flag_t gzip_vary; /* gzip_vary */
3694
3695=== modified file 'src/http/ngx_http_file_cache.c'
3696--- src/http/ngx_http_file_cache.c 2010-03-03 23:50:36 +0000
3697+++ src/http/ngx_http_file_cache.c 2010-07-21 11:15:58 +0000
3698@@ -1128,7 +1128,7 @@
3699
3700 if (cache->files++ > 100) {
3701
3702- ngx_time_update(0, 0);
3703+ ngx_time_update();
3704
3705 elapsed = ngx_abs((ngx_msec_int_t) (ngx_current_msec - cache->last));
3706
3707@@ -1145,7 +1145,7 @@
3708
3709 ngx_msleep(200);
3710
3711- ngx_time_update(0, 0);
3712+ ngx_time_update();
3713 }
3714
3715 cache->last = ngx_current_msec;
3716@@ -1604,3 +1604,69 @@
3717
3718 return NGX_CONF_OK;
3719 }
3720+
3721+
3722+ngx_int_t
3723+ngx_http_cache(ngx_http_request_t *r, ngx_array_t *no_cache)
3724+{
3725+ ngx_str_t val;
3726+ ngx_uint_t i;
3727+ ngx_http_complex_value_t *cv;
3728+
3729+ cv = no_cache->elts;
3730+
3731+ for (i = 0; i < no_cache->nelts; i++) {
3732+ if (ngx_http_complex_value(r, &cv[i], &val) != NGX_OK) {
3733+ return NGX_ERROR;
3734+ }
3735+
3736+ if (val.len && val.data[0] != '0') {
3737+ return NGX_DECLINED;
3738+ }
3739+ }
3740+
3741+ return NGX_OK;
3742+}
3743+
3744+
3745+char *
3746+ngx_http_no_cache_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
3747+{
3748+ char *p = conf;
3749+
3750+ ngx_str_t *value;
3751+ ngx_uint_t i;
3752+ ngx_array_t **a;
3753+ ngx_http_complex_value_t *cv;
3754+ ngx_http_compile_complex_value_t ccv;
3755+
3756+ a = (ngx_array_t **) (p + cmd->offset);
3757+
3758+ if (*a == NGX_CONF_UNSET_PTR) {
3759+ *a = ngx_array_create(cf->pool, 1, sizeof(ngx_http_complex_value_t));
3760+ if (*a == NULL) {
3761+ return NGX_CONF_ERROR;
3762+ }
3763+ }
3764+
3765+ value = cf->args->elts;
3766+
3767+ for (i = 1; i < cf->args->nelts; i++) {
3768+ cv = ngx_array_push(*a);
3769+ if (cv == NULL) {
3770+ return NGX_CONF_ERROR;
3771+ }
3772+
3773+ ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
3774+
3775+ ccv.cf = cf;
3776+ ccv.value = &value[i];
3777+ ccv.complex_value = cv;
3778+
3779+ if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
3780+ return NGX_CONF_ERROR;
3781+ }
3782+ }
3783+
3784+ return NGX_CONF_OK;
3785+}
3786
3787=== modified file 'src/http/ngx_http_header_filter_module.c'
3788--- src/http/ngx_http_header_filter_module.c 2010-03-03 23:50:36 +0000
3789+++ src/http/ngx_http_header_filter_module.c 2010-07-21 11:15:58 +0000
3790@@ -538,8 +538,8 @@
3791
3792 r->headers_out.location->value.len = b->last - p;
3793 r->headers_out.location->value.data = p;
3794- r->headers_out.location->key.len = sizeof("Location: ") - 1;
3795- r->headers_out.location->key.data = (u_char *) "Location: ";
3796+ r->headers_out.location->key.len = sizeof("Location") - 1;
3797+ r->headers_out.location->key.data = (u_char *) "Location";
3798
3799 *b->last++ = CR; *b->last++ = LF;
3800 }
3801
3802=== modified file 'src/http/ngx_http_parse.c'
3803--- src/http/ngx_http_parse.c 2009-11-30 13:34:00 +0000
3804+++ src/http/ngx_http_parse.c 2010-07-21 11:15:58 +0000
3805@@ -438,8 +438,7 @@
3806 r->plus_in_uri = 1;
3807 break;
3808 case '\0':
3809- r->zero_in_uri = 1;
3810- break;
3811+ return NGX_HTTP_PARSE_INVALID_REQUEST;
3812 default:
3813 state = sw_check_uri;
3814 break;
3815@@ -496,8 +495,7 @@
3816 r->plus_in_uri = 1;
3817 break;
3818 case '\0':
3819- r->zero_in_uri = 1;
3820- break;
3821+ return NGX_HTTP_PARSE_INVALID_REQUEST;
3822 }
3823 break;
3824
3825@@ -526,8 +524,7 @@
3826 r->complex_uri = 1;
3827 break;
3828 case '\0':
3829- r->zero_in_uri = 1;
3830- break;
3831+ return NGX_HTTP_PARSE_INVALID_REQUEST;
3832 }
3833 break;
3834
3835@@ -1202,7 +1199,7 @@
3836 ch = *p++;
3837
3838 } else if (ch == '\0') {
3839- r->zero_in_uri = 1;
3840+ return NGX_HTTP_PARSE_INVALID_REQUEST;
3841 }
3842
3843 state = quoted_state;
3844@@ -1304,8 +1301,7 @@
3845 }
3846
3847 if (ch == '\0') {
3848- *flags |= NGX_HTTP_ZERO_IN_URI;
3849- continue;
3850+ goto unsafe;
3851 }
3852
3853 if (ngx_path_separator(ch) && len > 2) {
3854@@ -1449,34 +1445,19 @@
3855 void
3856 ngx_http_split_args(ngx_http_request_t *r, ngx_str_t *uri, ngx_str_t *args)
3857 {
3858- u_char ch, *p, *last;
3859-
3860- p = uri->data;
3861-
3862- last = p + uri->len;
3863-
3864- args->len = 0;
3865-
3866- while (p < last) {
3867-
3868- ch = *p++;
3869-
3870- if (ch == '?') {
3871- args->len = last - p;
3872- args->data = p;
3873-
3874- uri->len = p - 1 - uri->data;
3875-
3876- if (ngx_strlchr(p, last, '\0') != NULL) {
3877- r->zero_in_uri = 1;
3878- }
3879-
3880- return;
3881- }
3882-
3883- if (ch == '\0') {
3884- r->zero_in_uri = 1;
3885- continue;
3886- }
3887+ u_char *p, *last;
3888+
3889+ last = uri->data + uri->len;
3890+
3891+ p = ngx_strlchr(uri->data, last, '?');
3892+
3893+ if (p) {
3894+ uri->len = p - uri->data;
3895+ p++;
3896+ args->len = last - p;
3897+ args->data = p;
3898+
3899+ } else {
3900+ args->len = 0;
3901 }
3902 }
3903
3904=== modified file 'src/http/ngx_http_request.c'
3905--- src/http/ngx_http_request.c 2010-03-03 23:50:36 +0000
3906+++ src/http/ngx_http_request.c 2010-07-21 11:15:58 +0000
3907@@ -784,16 +784,31 @@
3908
3909 p = r->uri.data + r->uri.len - 1;
3910
3911- if (*p == '.' || *p == ' ') {
3912-
3913- while (--p > r->uri.data && (*p == '.' || *p == ' ')) {
3914- /* void */
3915- }
3916-
3917+ while (p > r->uri.data) {
3918+
3919+ if (*p == ' ') {
3920+ p--;
3921+ continue;
3922+ }
3923+
3924+ if (*p == '.') {
3925+ p--;
3926+ continue;
3927+ }
3928+
3929+ if (ngx_strncasecmp(p - 6, (u_char *) "::$data", 7) == 0) {
3930+ p -= 7;
3931+ continue;
3932+ }
3933+
3934+ break;
3935+ }
3936+
3937+ if (p != r->uri.data + r->uri.len - 1) {
3938 r->uri.len = p + 1 - r->uri.data;
3939-
3940 ngx_http_set_exten(r);
3941 }
3942+
3943 }
3944 #endif
3945
3946@@ -1443,6 +1458,12 @@
3947 if (ngx_strstrn(user_agent, "Gecko/", 6 - 1)) {
3948 r->headers_in.gecko = 1;
3949
3950+ } else if (ngx_strstrn(user_agent, "Chrome/", 7 - 1)) {
3951+ r->headers_in.chrome = 1;
3952+
3953+ } else if (ngx_strstrn(user_agent, "Safari/", 7 - 1)) {
3954+ r->headers_in.safari = 1;
3955+
3956 } else if (ngx_strstrn(user_agent, "Konqueror", 9 - 1)) {
3957 r->headers_in.konqueror = 1;
3958 }
3959
3960=== modified file 'src/http/ngx_http_request.h'
3961--- src/http/ngx_http_request.h 2010-03-03 23:50:36 +0000
3962+++ src/http/ngx_http_request.h 2010-07-21 11:15:58 +0000
3963@@ -57,7 +57,7 @@
3964 #define NGX_HTTP_PARSE_INVALID_HEADER 13
3965
3966
3967-#define NGX_HTTP_ZERO_IN_URI 1
3968+/* unused 1 */
3969 #define NGX_HTTP_SUBREQUEST_IN_MEMORY 2
3970 #define NGX_HTTP_SUBREQUEST_WAITED 4
3971 #define NGX_HTTP_LOG_UNSAFE 8
3972@@ -220,6 +220,8 @@
3973 unsigned msie6:1;
3974 unsigned opera:1;
3975 unsigned gecko:1;
3976+ unsigned chrome:1;
3977+ unsigned safari:1;
3978 unsigned konqueror:1;
3979 } ngx_http_headers_in_t;
3980
3981@@ -428,9 +430,6 @@
3982 /* URI with "+" */
3983 unsigned plus_in_uri:1;
3984
3985- /* URI with "\0" or "%00" */
3986- unsigned zero_in_uri:1;
3987-
3988 unsigned invalid_header:1;
3989
3990 unsigned valid_location:1;
3991
3992=== modified file 'src/http/ngx_http_special_response.c'
3993--- src/http/ngx_http_special_response.c 2009-10-19 23:22:06 +0000
3994+++ src/http/ngx_http_special_response.c 2010-07-21 11:15:58 +0000
3995@@ -31,13 +31,13 @@
3996 ;
3997
3998
3999-static u_char ngx_http_msie_stub[] =
4000-"<!-- The padding to disable MSIE's friendly error page -->" CRLF
4001-"<!-- The padding to disable MSIE's friendly error page -->" CRLF
4002-"<!-- The padding to disable MSIE's friendly error page -->" CRLF
4003-"<!-- The padding to disable MSIE's friendly error page -->" CRLF
4004-"<!-- The padding to disable MSIE's friendly error page -->" CRLF
4005-"<!-- The padding to disable MSIE's friendly error page -->" CRLF
4006+static u_char ngx_http_msie_padding[] =
4007+"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF
4008+"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF
4009+"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF
4010+"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF
4011+"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF
4012+"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF
4013 ;
4014
4015
4016@@ -517,8 +517,6 @@
4017
4018 r->err_status = overwrite;
4019
4020- r->zero_in_uri = 0;
4021-
4022 if (ngx_http_complex_value(r, &err_page->value, &uri) != NGX_OK) {
4023 return NGX_ERROR;
4024 }
4025@@ -598,12 +596,12 @@
4026 r->headers_out.content_length_n = ngx_http_error_pages[err].len
4027 + len;
4028 if (clcf->msie_padding
4029- && r->headers_in.msie
4030+ && (r->headers_in.msie || r->headers_in.chrome)
4031 && r->http_version >= NGX_HTTP_VERSION_10
4032 && err >= NGX_HTTP_LEVEL_300)
4033 {
4034 r->headers_out.content_length_n +=
4035- sizeof(ngx_http_msie_stub) - 1;
4036+ sizeof(ngx_http_msie_padding) - 1;
4037 msie_padding = 1;
4038 }
4039
4040@@ -671,8 +669,8 @@
4041 }
4042
4043 b->memory = 1;
4044- b->pos = ngx_http_msie_stub;
4045- b->last = ngx_http_msie_stub + sizeof(ngx_http_msie_stub) - 1;
4046+ b->pos = ngx_http_msie_padding;
4047+ b->last = ngx_http_msie_padding + sizeof(ngx_http_msie_padding) - 1;
4048
4049 out[1].next = &out[2];
4050 out[2].buf = b;
4051
4052=== modified file 'src/http/ngx_http_upstream.c'
4053--- src/http/ngx_http_upstream.c 2010-03-03 23:50:36 +0000
4054+++ src/http/ngx_http_upstream.c 2010-07-21 11:15:58 +0000
4055@@ -363,8 +363,6 @@
4056
4057 if (u && u->cleanup) {
4058 ngx_http_upstream_cleanup(r);
4059- *u->cleanup = NULL;
4060- u->cleanup = NULL;
4061 }
4062
4063 u = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_t));
4064@@ -587,6 +585,13 @@
4065 ngx_int_t rc;
4066 ngx_http_cache_t *c;
4067
4068+ if (u->conf->no_cache) {
4069+ rc = ngx_http_cache(r, u->conf->no_cache);
4070+ if (rc != NGX_OK) {
4071+ return rc;
4072+ }
4073+ }
4074+
4075 if (!(r->method & u->conf->cache_methods)) {
4076 return NGX_DECLINED;
4077 }
4078@@ -1775,10 +1780,6 @@
4079 return NGX_DONE;
4080 }
4081
4082- if (flags & NGX_HTTP_ZERO_IN_URI) {
4083- r->zero_in_uri = 1;
4084- }
4085-
4086 if (r->method != NGX_HTTP_HEAD) {
4087 r->method = NGX_HTTP_GET;
4088 }
4089@@ -3004,16 +3005,18 @@
4090 return NGX_OK;
4091 }
4092
4093- last = h->value.data + h->value.len;
4094+ p = h->value.data;
4095+ last = p + h->value.len;
4096
4097- if (ngx_strlcasestrn(h->value.data, last, (u_char *) "no-cache", 8 - 1)
4098- != NULL)
4099+ if (ngx_strlcasestrn(p, last, (u_char *) "no-cache", 8 - 1) != NULL
4100+ || ngx_strlcasestrn(p, last, (u_char *) "no-store", 8 - 1) != NULL
4101+ || ngx_strlcasestrn(p, last, (u_char *) "private", 7 - 1) != NULL)
4102 {
4103 u->cacheable = 0;
4104 return NGX_OK;
4105 }
4106
4107- p = ngx_strlcasestrn(h->value.data, last, (u_char *) "max-age=", 8 - 1);
4108+ p = ngx_strlcasestrn(p, last, (u_char *) "max-age=", 8 - 1);
4109
4110 if (p == NULL) {
4111 return NGX_OK;
4112
4113=== modified file 'src/http/ngx_http_upstream.h'
4114--- src/http/ngx_http_upstream.h 2009-11-30 13:34:00 +0000
4115+++ src/http/ngx_http_upstream.h 2010-07-21 11:15:58 +0000
4116@@ -160,6 +160,7 @@
4117 ngx_uint_t cache_methods;
4118
4119 ngx_array_t *cache_valid;
4120+ ngx_array_t *no_cache; /* ngx_http_complex_value_t */
4121 #endif
4122
4123 ngx_array_t *store_lengths;
4124
4125=== modified file 'src/http/ngx_http_variables.c'
4126--- src/http/ngx_http_variables.c 2010-03-03 23:50:36 +0000
4127+++ src/http/ngx_http_variables.c 2010-07-21 11:15:58 +0000
4128@@ -196,7 +196,8 @@
4129 { ngx_string("server_name"), NULL, ngx_http_variable_server_name, 0, 0, 0 },
4130
4131 { ngx_string("request_method"), NULL,
4132- ngx_http_variable_request_method, 0, 0, 0 },
4133+ ngx_http_variable_request_method, 0,
4134+ NGX_HTTP_VAR_NOCACHEABLE, 0 },
4135
4136 { ngx_string("remote_user"), NULL, ngx_http_variable_remote_user, 0, 0, 0 },
4137
4138@@ -440,8 +441,7 @@
4139
4140
4141 ngx_http_variable_value_t *
4142-ngx_http_get_variable(ngx_http_request_t *r, ngx_str_t *name, ngx_uint_t key,
4143- ngx_uint_t nowarn)
4144+ngx_http_get_variable(ngx_http_request_t *r, ngx_str_t *name, ngx_uint_t key)
4145 {
4146 ngx_http_variable_t *v;
4147 ngx_http_variable_value_t *vv;
4148@@ -453,7 +453,7 @@
4149
4150 if (v) {
4151 if (v->flags & NGX_HTTP_VAR_INDEXED) {
4152- return ngx_http_get_indexed_variable(r, v->index);
4153+ return ngx_http_get_flushed_variable(r, v->index);
4154
4155 } else {
4156
4157@@ -494,7 +494,7 @@
4158 return NULL;
4159 }
4160
4161- if (ngx_strncmp(name->data, "upstream_http_", 10) == 0) {
4162+ if (ngx_strncmp(name->data, "upstream_http_", 14) == 0) {
4163
4164 if (ngx_http_upstream_header_variable(r, vv, (uintptr_t) name)
4165 == NGX_OK)
4166@@ -525,11 +525,6 @@
4167
4168 vv->not_found = 1;
4169
4170- if (nowarn == 0) {
4171- ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
4172- "unknown \"%V\" variable", name);
4173- }
4174-
4175 return vv;
4176 }
4177
4178@@ -1781,6 +1776,7 @@
4179 if (ngx_strncmp(v[i].name.data, "arg_", 4) == 0) {
4180 v[i].get_handler = ngx_http_variable_argument;
4181 v[i].data = (uintptr_t) &v[i].name;
4182+ v[i].flags = NGX_HTTP_VAR_NOCACHEABLE;
4183
4184 continue;
4185 }
4186
4187=== modified file 'src/http/ngx_http_variables.h'
4188--- src/http/ngx_http_variables.h 2009-10-19 23:22:06 +0000
4189+++ src/http/ngx_http_variables.h 2010-07-21 11:15:58 +0000
4190@@ -50,7 +50,7 @@
4191 ngx_uint_t index);
4192
4193 ngx_http_variable_value_t *ngx_http_get_variable(ngx_http_request_t *r,
4194- ngx_str_t *name, ngx_uint_t key, ngx_uint_t nowarn);
4195+ ngx_str_t *name, ngx_uint_t key);
4196
4197 ngx_int_t ngx_http_variable_unknown_header(ngx_http_variable_value_t *v,
4198 ngx_str_t *var, ngx_list_part_t *part, size_t prefix);
4199
4200=== modified file 'src/mail/ngx_mail_pop3_handler.c'
4201--- src/mail/ngx_mail_pop3_handler.c 2009-10-19 23:22:06 +0000
4202+++ src/mail/ngx_mail_pop3_handler.c 2010-07-21 11:15:58 +0000
4203@@ -188,7 +188,6 @@
4204
4205 default:
4206 rc = NGX_MAIL_PARSE_INVALID_COMMAND;
4207- s->mail_state = ngx_pop3_start;
4208 break;
4209 }
4210
4211@@ -215,7 +214,6 @@
4212
4213 default:
4214 rc = NGX_MAIL_PARSE_INVALID_COMMAND;
4215- s->mail_state = ngx_pop3_start;
4216 break;
4217 }
4218
4219
4220=== modified file 'src/mail/ngx_mail_proxy_module.c'
4221--- src/mail/ngx_mail_proxy_module.c 2009-11-30 13:34:00 +0000
4222+++ src/mail/ngx_mail_proxy_module.c 2010-07-21 11:15:58 +0000
4223@@ -726,7 +726,7 @@
4224
4225 b->last += n;
4226
4227- if (b->last - b->pos < 5) {
4228+ if (b->last - b->pos < 4) {
4229 return NGX_AGAIN;
4230 }
4231
4232
4233=== modified file 'src/os/unix/ngx_errno.h'
4234--- src/os/unix/ngx_errno.h 2009-11-30 13:34:00 +0000
4235+++ src/os/unix/ngx_errno.h 2010-07-21 11:15:58 +0000
4236@@ -64,10 +64,22 @@
4237
4238 /* Solaris and Tru64 UNIX have thread-safe strerror() */
4239
4240-#define ngx_strerror_r(err, errstr, size) \
4241+#define ngx_strerror_r(err, errstr, size) \
4242 ngx_cpystrn(errstr, (u_char *) strerror(err), size)
4243
4244 #endif
4245
4246
4247+#if (NGX_HAVE_SYS_ERRLIST)
4248+
4249+#define ngx_sigsafe_strerror(err) \
4250+ (err > 0 && err < sys_nerr) ? sys_errlist[err] : "Unknown error"
4251+
4252+#else
4253+
4254+#define ngx_sigsafe_strerror(err) ""
4255+
4256+#endif
4257+
4258+
4259 #endif /* _NGX_ERRNO_H_INCLUDED_ */
4260
4261=== modified file 'src/os/unix/ngx_files.h'
4262--- src/os/unix/ngx_files.h 2010-03-03 23:50:36 +0000
4263+++ src/os/unix/ngx_files.h 2010-07-21 11:15:58 +0000
4264@@ -64,6 +64,7 @@
4265 #define NGX_FILE_OPEN 0
4266 #define NGX_FILE_TRUNCATE O_CREAT|O_TRUNC
4267 #define NGX_FILE_APPEND O_WRONLY|O_APPEND
4268+#define NGX_FILE_NONBLOCK O_NONBLOCK
4269
4270 #define NGX_FILE_DEFAULT_ACCESS 0644
4271 #define NGX_FILE_OWNER_ACCESS 0600
4272@@ -138,6 +139,9 @@
4273 #define ngx_fd_info(fd, sb) fstat(fd, sb)
4274 #define ngx_fd_info_n "fstat()"
4275
4276+#define ngx_link_info(file, sb) lstat((const char *) file, sb)
4277+#define ngx_link_info_n "lstat()"
4278+
4279 #define ngx_is_dir(sb) (S_ISDIR((sb)->st_mode))
4280 #define ngx_is_file(sb) (S_ISREG((sb)->st_mode))
4281 #define ngx_is_link(sb) (S_ISLNK((sb)->st_mode))
4282
4283=== modified file 'src/os/unix/ngx_process.c'
4284--- src/os/unix/ngx_process.c 2009-11-30 13:34:00 +0000
4285+++ src/os/unix/ngx_process.c 2010-07-21 11:15:58 +0000
4286@@ -315,7 +315,7 @@
4287 }
4288 }
4289
4290- ngx_time_update(0, 0);
4291+ ngx_time_sigsafe_update();
4292
4293 action = "";
4294
4295@@ -476,16 +476,17 @@
4296 */
4297
4298 if (err == NGX_ECHILD) {
4299- ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, errno,
4300- "waitpid() failed");
4301+ ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0,
4302+ "waitpid() failed (%d: %s)",
4303+ err, ngx_sigsafe_strerror(err));
4304 return;
4305 }
4306
4307 #endif
4308
4309- ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, errno,
4310- "waitpid() failed");
4311-
4312+ ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,
4313+ "waitpid() failed (%d: %s)",
4314+ err, ngx_sigsafe_strerror(err));
4315 return;
4316 }
4317
4318
4319=== modified file 'src/os/unix/ngx_process_cycle.c'
4320--- src/os/unix/ngx_process_cycle.c 2010-03-03 23:50:36 +0000
4321+++ src/os/unix/ngx_process_cycle.c 2010-07-21 11:15:58 +0000
4322@@ -168,7 +168,7 @@
4323
4324 sigsuspend(&set);
4325
4326- ngx_time_update(0, 0);
4327+ ngx_time_update();
4328
4329 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
4330 "wake up, sigio %i", sigio);
4331@@ -1337,7 +1337,7 @@
4332
4333 next = (n <= next) ? n : next;
4334
4335- ngx_time_update(0, 0);
4336+ ngx_time_update();
4337 }
4338 }
4339
4340@@ -1367,7 +1367,7 @@
4341
4342 if (path[i]->loader) {
4343 path[i]->loader(path[i]->data);
4344- ngx_time_update(0, 0);
4345+ ngx_time_update();
4346 }
4347 }
4348

Subscribers

People subscribed via source and target branches