Compare commits

..

42 Commits

Author SHA1 Message Date
d1bc0aafaa upgrade version number to 1.1.13.1 2012-01-20 00:47:14 +08:00
8ccb6abbb2 Merge remote-tracking branch 'origin/master' into nginx-1.1.x 2012-01-20 00:44:45 +08:00
fd80fa22ef Merge branch 'nginx-1.1.x' of github.com:agentzh/ngx_openresty into nginx-1.1.x 2012-01-19 18:12:58 +08:00
2bffe13e20 added patches for nginx 1.1.13. 2012-01-19 18:11:53 +08:00
92e0dd7abf Merge commit 'v1.1.12.5' into nginx-1.1.x 2012-01-19 17:56:42 +08:00
86af3896ba bumped version number to 1.1.12.5 2012-01-19 17:56:16 +08:00
065bf15551 Merge commit 'v1.1.12.5' into nginx-1.1.x 2012-01-19 17:51:25 +08:00
d9782b738d remove upstream_keepalive from util/configure 2012-01-19 17:50:24 +08:00
5abfef061a merge nginx-1.1.x version (util/ver) 2012-01-19 17:20:19 +08:00
7ce68bd980 bumped version number to 1.1.12.4, with v1.0.10.44 merged 2012-01-19 17:17:12 +08:00
cbb2c2f247 Merge commit 'v1.0.10.44' into nginx-1.1.12
Conflicts:
	util/ver
2012-01-19 17:16:24 +08:00
e96bacd8fd remove ngx_http_upstream_keepalive in util/configure 2012-01-18 19:44:24 +08:00
8479638467 merged master to nginx-1.1.x. 2012-01-18 13:17:51 +08:00
880010cf91 bumped version number to 1.1.12.3. 2012-01-10 17:58:47 +08:00
111c045db9 bumped version number to 1.1.12.2. 2012-01-10 17:58:20 +08:00
fc61696e25 no longer bundle ngx_http_upstream_keepalive because it is already in the nginx core. 2012-01-10 17:57:46 +08:00
1982776375 merged master to nginx-1.1.x. 2012-01-10 17:28:35 +08:00
53499aeca1 bumped version number to 1.1.12. 2011-12-29 13:16:29 +08:00
b2b220e332 merged master into nginx-1.1.x. 2011-12-29 13:12:41 +08:00
fea60f101b updated nginx-1.1.5-variable_header_ignore_no_hash.patch. 2011-11-09 17:45:23 +08:00
eb48103b54 resolved conflicts while merging from master to nginx-1.1.x. 2011-11-09 17:44:16 +08:00
3c74f263bc updated the patch. 2011-11-08 22:25:49 +08:00
f54c295fd8 upgraded patches for 1.1.5. 2011-11-08 22:18:30 +08:00
8eb28a55d3 updated variable_header_ignore_no_hash.patch for nginx 1.1.5. 2011-11-08 22:04:33 +08:00
bf26312dc0 resolved conflicts while merging from master. 2011-11-08 22:03:43 +08:00
e48b3196fe resolved conflicts while merging "master" to "nginx-1.1.x". 2011-10-13 21:27:14 +08:00
39a5983eef merged master down to nginx-1.1.x branch. 2011-10-11 07:41:19 +08:00
71c3005938 Merge branch 'master' into nginx-1.1.x 2011-10-10 16:22:48 +08:00
54ed6f5afd Merge branch 'master' into nginx-1.1.x 2011-10-10 16:09:25 +08:00
5dfca9ea1f Merge branch 'master' into nginx-1.1.x 2011-10-10 16:00:49 +08:00
ef57a37301 Merge branch 'master' into nginx-1.1.x 2011-10-09 17:57:01 +08:00
fd858205d3 Merge branch 'master' into nginx-1.1.x 2011-10-09 17:00:27 +08:00
480a7a2e49 Merge branch 'master' into nginx-1.1.x 2011-10-09 16:05:51 +08:00
6fbf4031fb Merge branch 'master' into nginx-1.1.x 2011-10-09 08:54:39 +08:00
2bf6bb8a20 Merge branch 'master' into nginx-1.1.x 2011-10-08 22:57:38 +08:00
8f9e508c20 Merge branch 'master' into nginx-1.1.x 2011-10-08 22:16:39 +08:00
36cd84e64c Merge branch 'master' into nginx-1.1.x 2011-10-08 22:08:45 +08:00
cf199f5274 Merge branch 'master' into nginx-1.1.x 2011-10-08 17:48:24 +08:00
0c3a564c8e upgraded to nginx core 1.1.5. 2011-10-08 17:05:16 +08:00
afd4039007 merged master down to nginx-1.1.x branch. 2011-10-08 02:33:01 +08:00
4619fbf426 checked in the variable_header_ignore_no_hash patch. 2011-09-30 11:44:01 -07:00
237638cdfc initial checkin for nginx 1.1.4. 2011-09-23 18:53:51 +08:00
47 changed files with 4265 additions and 390 deletions

View File

@ -0,0 +1,117 @@
diff -ur nginx-1.1.12/src/http/ngx_http_request_body.c nginx-1.1.12-patched/src/http/ngx_http_request_body.c
--- nginx-1.1.12/src/http/ngx_http_request_body.c 2011-09-30 22:36:19.000000000 +0800
+++ nginx-1.1.12-patched/src/http/ngx_http_request_body.c 2011-10-21 21:54:08.460350482 +0800
@@ -38,7 +38,7 @@
r->main->count++;
- if (r->request_body || r->discard_body) {
+ if (r->request_body || r->discard_body || r->content_length_n == 0) {
post_handler(r);
return NGX_OK;
}
@@ -440,7 +440,7 @@
ssize_t size;
ngx_event_t *rev;
- if (r != r->main || r->discard_body) {
+ if (r != r->main || r->discard_body || r->content_length_n == 0) {
return NGX_OK;
}
@@ -456,20 +456,22 @@
ngx_del_timer(rev);
}
- if (r->headers_in.content_length_n <= 0 || r->request_body) {
+ r->content_length_n = r->headers_in.content_length_n;
+
+ if (r->content_length_n <= 0 || r->request_body) {
return NGX_OK;
}
size = r->header_in->last - r->header_in->pos;
if (size) {
- if (r->headers_in.content_length_n > size) {
+ if (r->content_length_n > size) {
r->header_in->pos += size;
- r->headers_in.content_length_n -= size;
+ r->content_length_n -= size;
} else {
- r->header_in->pos += (size_t) r->headers_in.content_length_n;
- r->headers_in.content_length_n = 0;
+ r->header_in->pos += (size_t) r->content_length_n;
+ r->content_length_n = 0;
return NGX_OK;
}
}
@@ -568,7 +570,7 @@
"http read discarded body");
for ( ;; ) {
- if (r->headers_in.content_length_n == 0) {
+ if (r->content_length_n == 0) {
r->read_event_handler = ngx_http_block_reading;
return NGX_OK;
}
@@ -577,9 +579,9 @@
return NGX_AGAIN;
}
- size = (r->headers_in.content_length_n > NGX_HTTP_DISCARD_BUFFER_SIZE) ?
+ size = (r->content_length_n > NGX_HTTP_DISCARD_BUFFER_SIZE) ?
NGX_HTTP_DISCARD_BUFFER_SIZE:
- (size_t) r->headers_in.content_length_n;
+ (size_t) r->content_length_n;
n = r->connection->recv(r->connection, buffer, size);
@@ -596,7 +598,7 @@
return NGX_OK;
}
- r->headers_in.content_length_n -= n;
+ r->content_length_n -= n;
}
}
Only in nginx-1.1.12-patched/src/http: ngx_http_request_body.c~
diff -ur nginx-1.1.12/src/http/ngx_http_request.c nginx-1.1.12-patched/src/http/ngx_http_request.c
--- nginx-1.1.12/src/http/ngx_http_request.c 2011-09-30 22:36:19.000000000 +0800
+++ nginx-1.1.12-patched/src/http/ngx_http_request.c 2011-10-21 19:06:38.404350692 +0800
@@ -286,6 +286,8 @@
r->pipeline = hc->pipeline;
+ r->content_length_n = -1;
+
if (hc->nbusy) {
r->header_in = hc->busy[0];
}
@@ -297,6 +299,8 @@
return;
}
+ r->content_length_n = -1;
+
hc->request = r;
}
Only in nginx-1.1.12-patched/src/http: ngx_http_request.c~
diff -ur nginx-1.1.12/src/http/ngx_http_request.h nginx-1.1.12-patched/src/http/ngx_http_request.h
--- nginx-1.1.12/src/http/ngx_http_request.h 2011-08-29 18:39:23.000000000 +0800
+++ nginx-1.1.12-patched/src/http/ngx_http_request.h 2011-10-21 17:26:13.203807584 +0800
@@ -366,6 +366,9 @@
ngx_pool_t *pool;
ngx_buf_t *header_in;
+ off_t content_length_n;
+ /* for discarding request body */
+
ngx_http_headers_in_t headers_in;
ngx_http_headers_out_t headers_out;
Only in nginx-1.1.12-patched/src/http: ngx_http_request.h~
Only in nginx-1.1.12-patched/src/http: tags

View File

@ -0,0 +1,20 @@
--- nginx-1.1.12/src/event/modules/ngx_epoll_module.c 2011-09-30 22:12:53.000000000 +0800
+++ nginx-1.1.12-patched/src/event/modules/ngx_epoll_module.c 2011-11-30 11:08:46.775817019 +0800
@@ -682,6 +682,17 @@
wev = c->write;
if ((revents & EPOLLOUT) && wev->active) {
+ if (c->fd == -1 || wev->instance != instance) {
+
+ /*
+ * the stale event from a file descriptor
+ * that was just closed in this iteration
+ */
+
+ ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
+ "epoll: stale event %p", c);
+ continue;
+ }
if (flags & NGX_POST_THREAD_EVENTS) {
wev->posted_ready = 1;

View File

@ -0,0 +1,69 @@
# HG changeset patch
# User Maxim Dounin <mdounin@mdounin.ru>
# Date 1315324342 -14400
# Node ID 4cf0af103bc382a78f894302d1706929a79df4bb
# Parent d603ce98fada855f0100b422b7b5672fd22fabea
Gzip filter: handle empty flush buffers.
Empty flush buffers are legitimate and may happen e.g. due to $r->flush()
calls in embedded perl. If there are no data buffered in zlib deflate()
will return Z_BUF_ERROR (i.e. no progress possible) without adding anything
to output. Don't treat Z_BUF_ERROR as fatal and correctly send empty flush
buffer if we have no data in output at all.
See this thread for details:
http://mailman.nginx.org/pipermail/nginx/2010-November/023693.html
diff --git a/src/http/modules/ngx_http_gzip_filter_module.c b/src/http/modules/ngx_http_gzip_filter_module.c
--- a/src/http/modules/ngx_http_gzip_filter_module.c
+++ b/src/http/modules/ngx_http_gzip_filter_module.c
@@ -758,6 +758,7 @@ static ngx_int_t
ngx_http_gzip_filter_deflate(ngx_http_request_t *r, ngx_http_gzip_ctx_t *ctx)
{
int rc;
+ ngx_buf_t *b;
ngx_chain_t *cl;
ngx_http_gzip_conf_t *conf;
@@ -769,7 +770,7 @@ ngx_http_gzip_filter_deflate(ngx_http_re
rc = deflate(&ctx->zstream, ctx->flush);
- if (rc != Z_OK && rc != Z_STREAM_END) {
+ if (rc != Z_OK && rc != Z_STREAM_END && rc != Z_BUF_ERROR) {
ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
"deflate() failed: %d, %d", ctx->flush, rc);
return NGX_ERROR;
@@ -818,8 +819,6 @@ ngx_http_gzip_filter_deflate(ngx_http_re
if (ctx->flush == Z_SYNC_FLUSH) {
- ctx->zstream.avail_out = 0;
- ctx->out_buf->flush = 1;
ctx->flush = Z_NO_FLUSH;
cl = ngx_alloc_chain_link(r->pool);
@@ -827,7 +826,22 @@ ngx_http_gzip_filter_deflate(ngx_http_re
return NGX_ERROR;
}
- cl->buf = ctx->out_buf;
+ b = ctx->out_buf;
+
+ if (ngx_buf_size(b) == 0) {
+
+ b = ngx_calloc_buf(ctx->request->pool);
+ if (b == NULL) {
+ return NGX_ERROR;
+ }
+
+ } else {
+ ctx->zstream.avail_out = 0;
+ }
+
+ b->flush = 1;
+
+ cl->buf = b;
cl->next = NULL;
*ctx->last_out = cl;
ctx->last_out = &cl->next;

View File

@ -0,0 +1,115 @@
--- nginx-1.1.12/src/http/modules/ngx_http_log_module.c 2011-11-01 21:24:50.000000000 +0800
+++ nginx-1.1.12-patched/src/http/modules/ngx_http_log_module.c 2011-11-10 16:17:29.599039534 +0800
@@ -61,6 +61,8 @@
time_t open_file_cache_valid;
ngx_uint_t open_file_cache_min_uses;
+ ngx_flag_t escape_non_ascii;
+
ngx_uint_t off; /* unsigned off:1 */
} ngx_http_log_loc_conf_t;
@@ -104,7 +106,8 @@
uintptr_t data);
static u_char *ngx_http_log_variable(ngx_http_request_t *r, u_char *buf,
ngx_http_log_op_t *op);
-static uintptr_t ngx_http_log_escape(u_char *dst, u_char *src, size_t size);
+static uintptr_t ngx_http_log_escape(ngx_http_log_loc_conf_t *lcf, u_char *dst,
+ u_char *src, size_t size);
static void *ngx_http_log_create_main_conf(ngx_conf_t *cf);
@@ -146,6 +149,13 @@
0,
NULL },
+ { ngx_string("log_escape_non_ascii"),
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
+ ngx_conf_set_flag_slot,
+ NGX_HTTP_LOC_CONF_OFFSET,
+ offsetof(ngx_http_log_loc_conf_t, escape_non_ascii),
+ NULL },
+
ngx_null_command
};
@@ -637,6 +647,7 @@
ngx_http_log_variable_getlen(ngx_http_request_t *r, uintptr_t data)
{
uintptr_t len;
+ ngx_http_log_loc_conf_t *lcf;
ngx_http_variable_value_t *value;
value = ngx_http_get_indexed_variable(r, data);
@@ -645,7 +656,9 @@
return 1;
}
- len = ngx_http_log_escape(NULL, value->data, value->len);
+ lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module);
+
+ len = ngx_http_log_escape(lcf, NULL, value->data, value->len);
value->escape = len ? 1 : 0;
@@ -656,6 +669,7 @@
static u_char *
ngx_http_log_variable(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)
{
+ ngx_http_log_loc_conf_t *lcf;
ngx_http_variable_value_t *value;
value = ngx_http_get_indexed_variable(r, op->data);
@@ -669,16 +683,18 @@
return ngx_cpymem(buf, value->data, value->len);
} else {
- return (u_char *) ngx_http_log_escape(buf, value->data, value->len);
+ lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module);
+ return (u_char *) ngx_http_log_escape(lcf, buf, value->data, value->len);
}
}
static uintptr_t
-ngx_http_log_escape(u_char *dst, u_char *src, size_t size)
+ngx_http_log_escape(ngx_http_log_loc_conf_t *lcf, u_char *dst, u_char *src,
+ size_t size)
{
- ngx_uint_t n;
- static u_char hex[] = "0123456789ABCDEF";
+ ngx_uint_t n;
+ static u_char hex[] = "0123456789ABCDEF";
static uint32_t escape[] = {
0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
@@ -698,6 +714,12 @@
0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
};
+ if (lcf->escape_non_ascii) {
+ ngx_memset(&escape[4], 0xff, sizeof(uint32_t) * 4);
+
+ } else {
+ ngx_memzero(&escape[4], sizeof(uint32_t) * 4);
+ }
if (dst == NULL) {
@@ -781,6 +803,7 @@
}
conf->open_file_cache = NGX_CONF_UNSET_PTR;
+ conf->escape_non_ascii = NGX_CONF_UNSET;
return conf;
}
@@ -796,6 +819,8 @@
ngx_http_log_fmt_t *fmt;
ngx_http_log_main_conf_t *lmcf;
+ ngx_conf_merge_value(conf->escape_non_ascii, prev->escape_non_ascii, 1);
+
if (conf->open_file_cache == NGX_CONF_UNSET_PTR) {
conf->open_file_cache = prev->open_file_cache;

View File

@ -0,0 +1,12 @@
--- nginx-1.1.12/src/http/ngx_http_core_module.c 2011-09-27 19:14:02.000000000 +0800
+++ nginx-1.1.12-patched/src/http/ngx_http_core_module.c 2011-10-13 15:02:24.414550532 +0800
@@ -2542,6 +2542,9 @@
r->content_handler = NULL;
r->loc_conf = (*clcfp)->loc_conf;
+ /* clear the modules contexts */
+ ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module);
+
ngx_http_update_location_config(r);
cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);

View File

@ -0,0 +1,24 @@
diff -ur nginx-1.1.12/auto/cc/gcc nginx-1.1.12-patched/auto/cc/gcc
--- nginx-1.1.12/auto/cc/gcc 2011-06-27 19:53:00.205737804 +0800
+++ nginx-1.1.12-patched/auto/cc/gcc 2011-06-27 19:53:13.837741087 +0800
@@ -169,7 +169,7 @@
# stop on warning
-CFLAGS="$CFLAGS -Werror"
+#CFLAGS="$CFLAGS -Werror"
# debug
CFLAGS="$CFLAGS -g"
diff -ur nginx-1.1.12/auto/cc/icc nginx-1.1.12-patched/auto/cc/icc
--- nginx-1.1.12/auto/cc/icc 2011-06-27 19:52:56.370157068 +0800
+++ nginx-1.1.12-patched/auto/cc/icc 2011-06-27 19:53:19.508916811 +0800
@@ -139,7 +139,7 @@
esac
# stop on warning
-CFLAGS="$CFLAGS -Werror"
+#CFLAGS="$CFLAGS -Werror"
# debug
CFLAGS="$CFLAGS -g"

View File

@ -0,0 +1,90 @@
--- nginx-1.1.12/src/http/ngx_http_core_module.c 2010-12-14 18:38:42.000000000 +0800
+++ nginx-1.1.12-patched/src/http/ngx_http_core_module.c 2011-01-30 19:24:34.956354518 +0800
@@ -57,6 +57,8 @@
void *conf);
static char *ngx_http_core_error_page(ngx_conf_t *cf, ngx_command_t *cmd,
void *conf);
+static char *ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd,
+ void *conf);
static char *ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd,
void *conf);
static char *ngx_http_core_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd,
@@ -614,6 +616,14 @@
0,
NULL },
+ { ngx_string("no_error_pages"),
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
+ |NGX_CONF_NOARGS,
+ ngx_http_core_no_error_pages,
+ NGX_HTTP_LOC_CONF_OFFSET,
+ 0,
+ NULL },
+
{ ngx_string("try_files"),
NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_2MORE,
ngx_http_core_try_files,
@@ -3052,7 +3062,6 @@
* clcf->types = NULL;
* clcf->default_type = { 0, NULL };
* clcf->error_log = NULL;
- * clcf->error_pages = NULL;
* clcf->try_files = NULL;
* clcf->client_body_path = NULL;
* clcf->regex = NULL;
@@ -3062,6 +3071,7 @@
* clcf->gzip_proxied = 0;
*/
+ clcf->error_pages = NGX_CONF_UNSET_PTR;
clcf->client_max_body_size = NGX_CONF_UNSET;
clcf->client_body_buffer_size = NGX_CONF_UNSET_SIZE;
clcf->client_body_timeout = NGX_CONF_UNSET_MSEC;
@@ -3250,9 +3260,7 @@
}
}
- if (conf->error_pages == NULL && prev->error_pages) {
- conf->error_pages = prev->error_pages;
- }
+ ngx_conf_merge_ptr_value(conf->error_pages, prev->error_pages, NULL);
ngx_conf_merge_str_value(conf->default_type,
prev->default_type, "text/plain");
@@ -3988,6 +3996,10 @@
ngx_http_compile_complex_value_t ccv;
if (clcf->error_pages == NULL) {
+ return "conflicts with \"no_error_pages\"";
+ }
+
+ if (clcf->error_pages == NGX_CONF_UNSET_PTR) {
clcf->error_pages = ngx_array_create(cf->pool, 4,
sizeof(ngx_http_err_page_t));
if (clcf->error_pages == NULL) {
@@ -4095,6 +4107,25 @@
static char *
+ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
+{
+ ngx_http_core_loc_conf_t *clcf = conf;
+
+ if (clcf->error_pages == NULL) {
+ return "is duplicate";
+ }
+
+ if (clcf->error_pages != NGX_CONF_UNSET_PTR) {
+ return "conflicts with \"error_page\"";
+ }
+
+ clcf->error_pages = NULL;
+
+ return NGX_CONF_OK;
+}
+
+
+static char *
ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
ngx_http_core_loc_conf_t *clcf = conf;

View File

@ -0,0 +1,504 @@
diff -ur nginx-1.1.12/src/core/nginx.h nginx-1.1.12-patched/src/core/nginx.h
--- nginx-1.1.12/src/core/nginx.h 2011-08-29 17:30:22.000000000 +0800
+++ nginx-1.1.12-patched/src/core/nginx.h 2011-09-13 12:11:03.135622101 +0800
@@ -10,7 +10,7 @@
#define nginx_version 1001012
#define NGINX_VERSION "1.1.12"
-#define NGINX_VER "ngx_openresty/" NGINX_VERSION ".unknown"
+#define NGINX_VER "ngx_openresty/" NGINX_VERSION ".unknown (no pool)"
#define NGINX_VAR "NGINX"
diff -ur nginx-1.1.12/src/core/ngx_array.c nginx-1.1.12-patched/src/core/ngx_array.c
--- nginx-1.1.12/src/core/ngx_array.c 2008-06-17 23:00:30.000000000 +0800
+++ nginx-1.1.12-patched/src/core/ngx_array.c 2011-09-14 12:02:56.263128538 +0800
@@ -39,13 +39,7 @@
p = a->pool;
- if ((u_char *) a->elts + a->size * a->nalloc == p->d.last) {
- p->d.last -= a->size * a->nalloc;
- }
-
- if ((u_char *) a + sizeof(ngx_array_t) == p->d.last) {
- p->d.last = (u_char *) a;
- }
+ ngx_pfree(p, a);
}
@@ -64,29 +58,17 @@
p = a->pool;
- if ((u_char *) a->elts + size == p->d.last
- && p->d.last + a->size <= p->d.end)
- {
- /*
- * the array allocation is the last in the pool
- * and there is space for new allocation
- */
-
- p->d.last += a->size;
- a->nalloc++;
-
- } else {
- /* allocate a new array */
-
- new = ngx_palloc(p, 2 * size);
- if (new == NULL) {
- return NULL;
- }
-
- ngx_memcpy(new, a->elts, size);
- a->elts = new;
- a->nalloc *= 2;
+ /* allocate a new array */
+
+ new = ngx_palloc(p, 2 * size);
+ if (new == NULL) {
+ return NULL;
}
+
+ ngx_memcpy(new, a->elts, size);
+ a->elts = new;
+ a->nalloc *= 2;
+
}
elt = (u_char *) a->elts + a->size * a->nelts;
@@ -100,43 +82,25 @@
ngx_array_push_n(ngx_array_t *a, ngx_uint_t n)
{
void *elt, *new;
- size_t size;
ngx_uint_t nalloc;
ngx_pool_t *p;
- size = n * a->size;
-
if (a->nelts + n > a->nalloc) {
/* the array is full */
p = a->pool;
- if ((u_char *) a->elts + a->size * a->nalloc == p->d.last
- && p->d.last + size <= p->d.end)
- {
- /*
- * the array allocation is the last in the pool
- * and there is space for new allocation
- */
-
- p->d.last += size;
- a->nalloc += n;
-
- } else {
- /* allocate a new array */
-
- nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);
-
- new = ngx_palloc(p, nalloc * a->size);
- if (new == NULL) {
- return NULL;
- }
-
- ngx_memcpy(new, a->elts, a->nelts * a->size);
- a->elts = new;
- a->nalloc = nalloc;
+ nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);
+
+ new = ngx_palloc(p, nalloc * a->size);
+ if (new == NULL) {
+ return NULL;
}
+
+ ngx_memcpy(new, a->elts, a->nelts * a->size);
+ a->elts = new;
+ a->nalloc = nalloc;
}
elt = (u_char *) a->elts + a->size * a->nelts;
diff -ur nginx-1.1.12/src/core/ngx_palloc.c nginx-1.1.12-patched/src/core/ngx_palloc.c
--- nginx-1.1.12/src/core/ngx_palloc.c 2009-12-17 20:25:46.000000000 +0800
+++ nginx-1.1.12-patched/src/core/ngx_palloc.c 2011-09-14 12:03:41.663126519 +0800
@@ -8,24 +8,31 @@
#include <ngx_core.h>
-static void *ngx_palloc_block(ngx_pool_t *pool, size_t size);
static void *ngx_palloc_large(ngx_pool_t *pool, size_t size);
ngx_pool_t *
ngx_create_pool(size_t size, ngx_log_t *log)
{
- ngx_pool_t *p;
+ ngx_pool_t *p;
+ ngx_pool_data_t *d;
- p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);
+ size = sizeof(ngx_pool_t);
+ p = ngx_alloc(size, log);
if (p == NULL) {
return NULL;
}
- p->d.last = (u_char *) p + sizeof(ngx_pool_t);
- p->d.end = (u_char *) p + size;
- p->d.next = NULL;
- p->d.failed = 0;
+ d = ngx_alloc(sizeof(ngx_pool_data_t), log);
+
+ if (d == NULL) {
+ return NULL;
+ }
+
+ d->next = d;
+ d->prev = d;
+ d->alloc = NULL;
+ p->d = d;
size = size - sizeof(ngx_pool_t);
p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;
@@ -43,7 +50,7 @@
void
ngx_destroy_pool(ngx_pool_t *pool)
{
- ngx_pool_t *p, *n;
+ ngx_pool_data_t *d, *n;
ngx_pool_large_t *l;
ngx_pool_cleanup_t *c;
@@ -55,7 +62,7 @@
}
}
- for (l = pool->large; l; l = l->next) {
+ for (l = pool->large; l ; l = l->next) {
ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);
@@ -71,34 +78,45 @@
* so we can not use this log while the free()ing the pool
*/
- for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {
+ for (d = pool->d, n = d->next; ; d = n, n = n->next) {
ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
- "free: %p, unused: %uz", p, p->d.end - p->d.last);
+ "free: %p", d);
- if (n == NULL) {
+ if (n == pool->d) {
break;
}
}
#endif
+ if (pool->d->next == pool->d) {
+ ngx_free(pool->d);
+ } else {
+ for (d = pool->d, n = d->next; ; d = n, n = n->next) {
+ if (d->alloc) {
+ ngx_free(d->alloc);
+ }
+ ngx_free(d);
- for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {
- ngx_free(p);
-
- if (n == NULL) {
- break;
+ if (n == pool->d) {
+ break;
+ }
}
}
+
+ ngx_free(pool);
}
void
ngx_reset_pool(ngx_pool_t *pool)
{
- ngx_pool_t *p;
- ngx_pool_large_t *l;
+ ngx_pool_data_t *p, *tmp;
+ ngx_pool_large_t *l;
+
+ for (l = pool->large; l ; l = l->next) {
+
+ ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);
- for (l = pool->large; l; l = l->next) {
if (l->alloc) {
ngx_free(l->alloc);
}
@@ -106,109 +124,65 @@
pool->large = NULL;
- for (p = pool; p; p = p->d.next) {
- p->d.last = (u_char *) p + sizeof(ngx_pool_t);
+ p = pool->d->next;
+ while (p != pool->d) {
+ tmp = p;
+ ngx_free(p->alloc);
+ p->prev->next = p->next;
+ p->next->prev = p->prev;
+ p = p->next;
+ ngx_free(tmp);
}
-}
+ ngx_free(pool->d->alloc);
+ pool->d->alloc = NULL;
+
+}
void *
-ngx_palloc(ngx_pool_t *pool, size_t size)
+ngx_malloc(ngx_pool_t *pool, size_t size)
{
- u_char *m;
- ngx_pool_t *p;
-
- if (size <= pool->max) {
+ ngx_pool_data_t *new;
+ void *m;
- p = pool->current;
-
- do {
- m = ngx_align_ptr(p->d.last, NGX_ALIGNMENT);
-
- if ((size_t) (p->d.end - m) >= size) {
- p->d.last = m + size;
-
- return m;
- }
-
- p = p->d.next;
-
- } while (p);
+ m = ngx_alloc(size, pool->log);
+ if (m == NULL) {
+ return NULL;
+ }
- return ngx_palloc_block(pool, size);
+ new = ngx_alloc(sizeof(ngx_pool_data_t), pool->log);
+ if (new == NULL){
+ ngx_free(m);
+ return NULL;
}
- return ngx_palloc_large(pool, size);
+ new->alloc = m;
+ new->next = pool->d;
+ new->prev = pool->d->prev;
+ pool->d->prev->next = new;
+ pool->d->prev = new;
+ return m;
}
-
void *
-ngx_pnalloc(ngx_pool_t *pool, size_t size)
+ngx_palloc(ngx_pool_t *pool, size_t size)
{
- u_char *m;
- ngx_pool_t *p;
-
- if (size <= pool->max) {
-
- p = pool->current;
-
- do {
- m = p->d.last;
-
- if ((size_t) (p->d.end - m) >= size) {
- p->d.last = m + size;
-
- return m;
- }
-
- p = p->d.next;
-
- } while (p);
-
- return ngx_palloc_block(pool, size);
+ if (size <= 1024) {
+ return ngx_malloc(pool, size);
}
return ngx_palloc_large(pool, size);
}
-static void *
-ngx_palloc_block(ngx_pool_t *pool, size_t size)
+void *
+ngx_pnalloc(ngx_pool_t *pool, size_t size)
{
- u_char *m;
- size_t psize;
- ngx_pool_t *p, *new, *current;
-
- psize = (size_t) (pool->d.end - (u_char *) pool);
-
- m = ngx_memalign(NGX_POOL_ALIGNMENT, psize, pool->log);
- if (m == NULL) {
- return NULL;
- }
-
- new = (ngx_pool_t *) m;
-
- new->d.end = m + psize;
- new->d.next = NULL;
- new->d.failed = 0;
-
- m += sizeof(ngx_pool_data_t);
- m = ngx_align_ptr(m, NGX_ALIGNMENT);
- new->d.last = m + size;
-
- current = pool->current;
-
- for (p = current; p->d.next; p = p->d.next) {
- if (p->d.failed++ > 4) {
- current = p->d.next;
- }
+ if (size <= 1024) {
+ return ngx_malloc(pool, size);
}
- p->d.next = new;
-
- pool->current = current ? current : new;
-
- return m;
+ return ngx_palloc_large(pool, size);
}
@@ -216,7 +190,6 @@
ngx_palloc_large(ngx_pool_t *pool, size_t size)
{
void *p;
- ngx_uint_t n;
ngx_pool_large_t *large;
p = ngx_alloc(size, pool->log);
@@ -224,20 +197,7 @@
return NULL;
}
- n = 0;
-
- for (large = pool->large; large; large = large->next) {
- if (large->alloc == NULL) {
- large->alloc = p;
- return p;
- }
-
- if (n++ > 3) {
- break;
- }
- }
-
- large = ngx_palloc(pool, sizeof(ngx_pool_large_t));
+ large = ngx_malloc(pool, sizeof(ngx_pool_large_t));
if (large == NULL) {
ngx_free(p);
return NULL;
@@ -262,7 +222,7 @@
return NULL;
}
- large = ngx_palloc(pool, sizeof(ngx_pool_large_t));
+ large = ngx_malloc(pool, sizeof(ngx_pool_large_t));
if (large == NULL) {
ngx_free(p);
return NULL;
@@ -279,17 +239,41 @@
ngx_int_t
ngx_pfree(ngx_pool_t *pool, void *p)
{
- ngx_pool_large_t *l;
+ ngx_pool_large_t *l;
+ ngx_pool_large_t *ll;
+ ngx_pool_data_t *d, *n;
- for (l = pool->large; l; l = l->next) {
+ for (l = pool->large, ll = l; l; ll = l, l = l->next) {
if (p == l->alloc) {
ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
"free: %p", l->alloc);
ngx_free(l->alloc);
l->alloc = NULL;
+ if (l == pool->large) {
+ pool->large = NULL;
+ }
+
+ ll->next = l->next;
+ p = l;
+ break;
+ }
+ }
+ for (d = pool->d, n = d->next; ; d = n, n = d->next) {
+ if (p == d->alloc) {
+ ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", d->alloc);
+ if (d->alloc) {
+ ngx_free(d->alloc);
+ }
+ d->alloc = NULL;
+ d->prev->next = d->next;
+ d->next->prev = d->prev;
+ ngx_free(d);
return NGX_OK;
}
+ if (d->next == pool->d) {
+ break;
+ }
}
return NGX_DECLINED;
diff -ur nginx-1.1.12/src/core/ngx_palloc.h nginx-1.1.12-patched/src/core/ngx_palloc.h
--- nginx-1.1.12/src/core/ngx_palloc.h 2009-12-17 20:25:46.000000000 +0800
+++ nginx-1.1.12-patched/src/core/ngx_palloc.h 2011-09-13 12:11:03.155622101 +0800
@@ -38,6 +38,7 @@
typedef struct ngx_pool_large_s ngx_pool_large_t;
+typedef struct ngx_pool_data_s ngx_pool_data_t;
struct ngx_pool_large_s {
ngx_pool_large_t *next;
@@ -45,16 +46,15 @@
};
-typedef struct {
- u_char *last;
- u_char *end;
- ngx_pool_t *next;
- ngx_uint_t failed;
-} ngx_pool_data_t;
+struct ngx_pool_data_s{
+ ngx_pool_data_t *next;
+ ngx_pool_data_t *prev;
+ void *alloc;
+};
struct ngx_pool_s {
- ngx_pool_data_t d;
+ ngx_pool_data_t *d;
size_t max;
ngx_pool_t *current;
ngx_chain_t *chain;

View File

@ -0,0 +1,27 @@
# HG changeset patch
# User Maxim Dounin <mdounin@mdounin.ru>
# Date 1309799136 -14400
# Node ID 99e276bba8596bc4df9e638482ee413f4c6bf700
# Parent e7b2f945d55ae44a2295facf9e3336dc4633e5b5
Core: fix body with request_body_in_single_buf.
If there were preread data and request body was big enough first part
of request body was duplicated.
See report here:
http://nginx.org/pipermail/nginx/2011-July/027756.html
diff --git a/src/http/ngx_http_request_body.c b/src/http/ngx_http_request_body.c
--- a/src/http/ngx_http_request_body.c
+++ b/src/http/ngx_http_request_body.c
@@ -372,7 +372,9 @@ ngx_http_do_read_client_request_body(ngx
}
}
- if (r->request_body_in_file_only && rb->bufs->next) {
+ if (rb->bufs->next
+ && (r->request_body_in_file_only || r->request_body_in_single_buf))
+ {
rb->bufs = rb->bufs->next;
}

View File

@ -0,0 +1,17 @@
# HG changeset patch
# User Maxim Dounin <mdounin@mdounin.ru>
# Date 1309776931 -14400
# Node ID e7b2f945d55ae44a2295facf9e3336dc4633e5b5
# Parent 610e909bb9e29766188aa86fae3abe0bd3432940
Core: fix body if it's preread and there are extra data.
--- nginx-1.1.12/src/http/ngx_http_request_body.c 2011-07-05 12:11:21.619264633 +0800
+++ nginx-1.1.12-patched/src/http/ngx_http_request_body.c 2011-07-05 12:14:30.694321554 +0800
@@ -141,6 +141,7 @@
/* the whole request body was pre-read */
+ b->last = b->pos + r->headers_in.content_length_n;
r->header_in->pos += (size_t) r->headers_in.content_length_n;
r->request_length += r->headers_in.content_length_n;

View File

@ -0,0 +1,26 @@
diff -ur lz-nginx-1.1.12/nginx-1.1.12/src/core/nginx.h lz-nginx-1.1.12-patched/nginx-1.1.12/src/core/nginx.h
--- lz-nginx-1.1.12/nginx-1.1.12/src/core/nginx.h 2010-02-12 17:31:01.000000000 +0800
+++ lz-nginx-1.1.12-patched/nginx-1.1.12/src/core/nginx.h 2010-03-30 10:52:13.240702627 +0800
@@ -10,7 +10,7 @@
#define nginx_version 1001012
#define NGINX_VERSION "1.1.12"
-#define NGINX_VER "nginx/" NGINX_VERSION
+#define NGINX_VER "ngx_openresty/" NGINX_VERSION ".unknown"
#define NGINX_VAR "NGINX"
#define NGX_OLDPID_EXT ".oldbin"
Only in lz-nginx-1.1.12-patched/nginx-1.1.12/src/core: nginx.h.orig
Only in lz-nginx-1.1.12-patched/nginx-1.1.12/src/core: nginx.h.rej
diff -ur lz-nginx-1.1.12/nginx-1.1.12/src/http/ngx_http_header_filter_module.c lz-nginx-1.1.12-patched/nginx-1.1.12/src/http/ngx_http_header_filter_module.c
--- lz-nginx-1.1.12/nginx-1.1.12/src/http/ngx_http_header_filter_module.c 2010-03-03 23:14:04.000000000 +0800
+++ lz-nginx-1.1.12-patched/nginx-1.1.12/src/http/ngx_http_header_filter_module.c 2010-03-30 10:52:53.670909405 +0800
@@ -45,7 +45,7 @@
};
-static char ngx_http_server_string[] = "Server: nginx" CRLF;
+static char ngx_http_server_string[] = "Server: ngx_openresty" CRLF;
static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;

View File

@ -0,0 +1,40 @@
# HG changeset patch
# User Maxim Dounin <mdounin@mdounin.ru>
# Date 1309187571 -14400
# Node ID 283a416b2235d5383c12a975edc8866f007fb628
# Parent f5fc40783ddcbf4db33859ee2a9bce54cf32c350
Core: protect from subrequest loops.
Without protection subrequest loop results in r->count overflow and
SIGSEGV. Protection was broken in 0.7.25.
Note that this also limits number of parallel subrequests. This
wasn't exactly the case before 0.7.25 as local subrequests were
completed directly.
See here for details:
http://nginx.org/pipermail/nginx-ru/2010-February/032184.html
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
--- a/src/http/ngx_http_core_module.c
+++ b/src/http/ngx_http_core_module.c
@@ -2287,7 +2287,6 @@ ngx_http_subrequest(ngx_http_request_t *
sr->start_sec = tp->sec;
sr->start_msec = tp->msec;
- r->main->subrequests++;
r->main->count++;
*psr = sr;
diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c
--- a/src/http/ngx_http_request.c
+++ b/src/http/ngx_http_request.c
@@ -1981,6 +1981,7 @@ ngx_http_finalize_request(ngx_http_reque
if (r == c->data) {
r->main->count--;
+ r->main->subrequests++;
if (!r->logged) {

View File

@ -0,0 +1,73 @@
--- nginx-1.1.12/src/http/ngx_http_variables.c 2011-05-30 20:36:17.000000000 +0800
+++ nginx-1.1.12-patched/src/http/ngx_http_variables.c 2011-11-08 22:21:55.229247198 +0800
@@ -648,7 +648,17 @@
a = (ngx_array_t *) ((char *) r + data);
- n = a->nelts;
+ h = a->elts;
+ n = 0;
+
+ for (i = 0; i < a->nelts; i++) {
+
+ if (h[i]->hash == 0) {
+ continue;
+ }
+
+ n++;
+ }
if (n == 0) {
v->not_found = 1;
@@ -659,9 +669,7 @@
v->no_cacheable = 0;
v->not_found = 0;
- h = a->elts;
-
- if (n == 1) {
+ if (n == 1 && a->nelts == 1) {
v->len = (*h)->value.len;
v->data = (*h)->value.data;
@@ -670,7 +678,12 @@
len = - (ssize_t) (sizeof("; ") - 1);
- for (i = 0; i < n; i++) {
+ for (i = 0; i < a->nelts; i++) {
+
+ if (h[i]->hash == 0) {
+ continue;
+ }
+
len += h[i]->value.len + sizeof("; ") - 1;
}
@@ -683,9 +696,14 @@
v->data = p;
for (i = 0; /* void */ ; i++) {
+
+ if (h[i]->hash == 0) {
+ continue;
+ }
+
p = ngx_copy(p, h[i]->value.data, h[i]->value.len);
- if (i == n - 1) {
+ if (--n == 0) {
break;
}
@@ -738,6 +756,10 @@
i = 0;
}
+ if (header[i].hash == 0) {
+ continue;
+ }
+
for (n = 0; n + prefix < var->len && n < header[i].key.len; n++) {
ch = header[i].key.data[n];

View File

@ -0,0 +1,117 @@
diff -ur nginx-1.1.13/src/http/ngx_http_request_body.c nginx-1.1.13-patched/src/http/ngx_http_request_body.c
--- nginx-1.1.13/src/http/ngx_http_request_body.c 2011-09-30 22:36:19.000000000 +0800
+++ nginx-1.1.13-patched/src/http/ngx_http_request_body.c 2011-10-21 21:54:08.460350482 +0800
@@ -38,7 +38,7 @@
r->main->count++;
- if (r->request_body || r->discard_body) {
+ if (r->request_body || r->discard_body || r->content_length_n == 0) {
post_handler(r);
return NGX_OK;
}
@@ -440,7 +440,7 @@
ssize_t size;
ngx_event_t *rev;
- if (r != r->main || r->discard_body) {
+ if (r != r->main || r->discard_body || r->content_length_n == 0) {
return NGX_OK;
}
@@ -456,20 +456,22 @@
ngx_del_timer(rev);
}
- if (r->headers_in.content_length_n <= 0 || r->request_body) {
+ r->content_length_n = r->headers_in.content_length_n;
+
+ if (r->content_length_n <= 0 || r->request_body) {
return NGX_OK;
}
size = r->header_in->last - r->header_in->pos;
if (size) {
- if (r->headers_in.content_length_n > size) {
+ if (r->content_length_n > size) {
r->header_in->pos += size;
- r->headers_in.content_length_n -= size;
+ r->content_length_n -= size;
} else {
- r->header_in->pos += (size_t) r->headers_in.content_length_n;
- r->headers_in.content_length_n = 0;
+ r->header_in->pos += (size_t) r->content_length_n;
+ r->content_length_n = 0;
return NGX_OK;
}
}
@@ -568,7 +570,7 @@
"http read discarded body");
for ( ;; ) {
- if (r->headers_in.content_length_n == 0) {
+ if (r->content_length_n == 0) {
r->read_event_handler = ngx_http_block_reading;
return NGX_OK;
}
@@ -577,9 +579,9 @@
return NGX_AGAIN;
}
- size = (r->headers_in.content_length_n > NGX_HTTP_DISCARD_BUFFER_SIZE) ?
+ size = (r->content_length_n > NGX_HTTP_DISCARD_BUFFER_SIZE) ?
NGX_HTTP_DISCARD_BUFFER_SIZE:
- (size_t) r->headers_in.content_length_n;
+ (size_t) r->content_length_n;
n = r->connection->recv(r->connection, buffer, size);
@@ -596,7 +598,7 @@
return NGX_OK;
}
- r->headers_in.content_length_n -= n;
+ r->content_length_n -= n;
}
}
Only in nginx-1.1.13-patched/src/http: ngx_http_request_body.c~
diff -ur nginx-1.1.13/src/http/ngx_http_request.c nginx-1.1.13-patched/src/http/ngx_http_request.c
--- nginx-1.1.13/src/http/ngx_http_request.c 2011-09-30 22:36:19.000000000 +0800
+++ nginx-1.1.13-patched/src/http/ngx_http_request.c 2011-10-21 19:06:38.404350692 +0800
@@ -286,6 +286,8 @@
r->pipeline = hc->pipeline;
+ r->content_length_n = -1;
+
if (hc->nbusy) {
r->header_in = hc->busy[0];
}
@@ -297,6 +299,8 @@
return;
}
+ r->content_length_n = -1;
+
hc->request = r;
}
Only in nginx-1.1.13-patched/src/http: ngx_http_request.c~
diff -ur nginx-1.1.13/src/http/ngx_http_request.h nginx-1.1.13-patched/src/http/ngx_http_request.h
--- nginx-1.1.13/src/http/ngx_http_request.h 2011-08-29 18:39:23.000000000 +0800
+++ nginx-1.1.13-patched/src/http/ngx_http_request.h 2011-10-21 17:26:13.203807584 +0800
@@ -366,6 +366,9 @@
ngx_pool_t *pool;
ngx_buf_t *header_in;
+ off_t content_length_n;
+ /* for discarding request body */
+
ngx_http_headers_in_t headers_in;
ngx_http_headers_out_t headers_out;
Only in nginx-1.1.13-patched/src/http: ngx_http_request.h~
Only in nginx-1.1.13-patched/src/http: tags

View File

@ -0,0 +1,20 @@
--- nginx-1.1.13/src/event/modules/ngx_epoll_module.c 2011-09-30 22:12:53.000000000 +0800
+++ nginx-1.1.13-patched/src/event/modules/ngx_epoll_module.c 2011-11-30 11:08:46.775817019 +0800
@@ -682,6 +682,17 @@
wev = c->write;
if ((revents & EPOLLOUT) && wev->active) {
+ if (c->fd == -1 || wev->instance != instance) {
+
+ /*
+ * the stale event from a file descriptor
+ * that was just closed in this iteration
+ */
+
+ ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
+ "epoll: stale event %p", c);
+ continue;
+ }
if (flags & NGX_POST_THREAD_EVENTS) {
wev->posted_ready = 1;

View File

@ -0,0 +1,69 @@
# HG changeset patch
# User Maxim Dounin <mdounin@mdounin.ru>
# Date 1315324342 -14400
# Node ID 4cf0af103bc382a78f894302d1706929a79df4bb
# Parent d603ce98fada855f0100b422b7b5672fd22fabea
Gzip filter: handle empty flush buffers.
Empty flush buffers are legitimate and may happen e.g. due to $r->flush()
calls in embedded perl. If there are no data buffered in zlib deflate()
will return Z_BUF_ERROR (i.e. no progress possible) without adding anything
to output. Don't treat Z_BUF_ERROR as fatal and correctly send empty flush
buffer if we have no data in output at all.
See this thread for details:
http://mailman.nginx.org/pipermail/nginx/2010-November/023693.html
diff --git a/src/http/modules/ngx_http_gzip_filter_module.c b/src/http/modules/ngx_http_gzip_filter_module.c
--- a/src/http/modules/ngx_http_gzip_filter_module.c
+++ b/src/http/modules/ngx_http_gzip_filter_module.c
@@ -758,6 +758,7 @@ static ngx_int_t
ngx_http_gzip_filter_deflate(ngx_http_request_t *r, ngx_http_gzip_ctx_t *ctx)
{
int rc;
+ ngx_buf_t *b;
ngx_chain_t *cl;
ngx_http_gzip_conf_t *conf;
@@ -769,7 +770,7 @@ ngx_http_gzip_filter_deflate(ngx_http_re
rc = deflate(&ctx->zstream, ctx->flush);
- if (rc != Z_OK && rc != Z_STREAM_END) {
+ if (rc != Z_OK && rc != Z_STREAM_END && rc != Z_BUF_ERROR) {
ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
"deflate() failed: %d, %d", ctx->flush, rc);
return NGX_ERROR;
@@ -818,8 +819,6 @@ ngx_http_gzip_filter_deflate(ngx_http_re
if (ctx->flush == Z_SYNC_FLUSH) {
- ctx->zstream.avail_out = 0;
- ctx->out_buf->flush = 1;
ctx->flush = Z_NO_FLUSH;
cl = ngx_alloc_chain_link(r->pool);
@@ -827,7 +826,22 @@ ngx_http_gzip_filter_deflate(ngx_http_re
return NGX_ERROR;
}
- cl->buf = ctx->out_buf;
+ b = ctx->out_buf;
+
+ if (ngx_buf_size(b) == 0) {
+
+ b = ngx_calloc_buf(ctx->request->pool);
+ if (b == NULL) {
+ return NGX_ERROR;
+ }
+
+ } else {
+ ctx->zstream.avail_out = 0;
+ }
+
+ b->flush = 1;
+
+ cl->buf = b;
cl->next = NULL;
*ctx->last_out = cl;
ctx->last_out = &cl->next;

View File

@ -0,0 +1,115 @@
--- nginx-1.1.13/src/http/modules/ngx_http_log_module.c 2011-11-01 21:24:50.000000000 +0800
+++ nginx-1.1.13-patched/src/http/modules/ngx_http_log_module.c 2011-11-10 16:17:29.599039534 +0800
@@ -61,6 +61,8 @@
time_t open_file_cache_valid;
ngx_uint_t open_file_cache_min_uses;
+ ngx_flag_t escape_non_ascii;
+
ngx_uint_t off; /* unsigned off:1 */
} ngx_http_log_loc_conf_t;
@@ -104,7 +106,8 @@
uintptr_t data);
static u_char *ngx_http_log_variable(ngx_http_request_t *r, u_char *buf,
ngx_http_log_op_t *op);
-static uintptr_t ngx_http_log_escape(u_char *dst, u_char *src, size_t size);
+static uintptr_t ngx_http_log_escape(ngx_http_log_loc_conf_t *lcf, u_char *dst,
+ u_char *src, size_t size);
static void *ngx_http_log_create_main_conf(ngx_conf_t *cf);
@@ -146,6 +149,13 @@
0,
NULL },
+ { ngx_string("log_escape_non_ascii"),
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
+ ngx_conf_set_flag_slot,
+ NGX_HTTP_LOC_CONF_OFFSET,
+ offsetof(ngx_http_log_loc_conf_t, escape_non_ascii),
+ NULL },
+
ngx_null_command
};
@@ -637,6 +647,7 @@
ngx_http_log_variable_getlen(ngx_http_request_t *r, uintptr_t data)
{
uintptr_t len;
+ ngx_http_log_loc_conf_t *lcf;
ngx_http_variable_value_t *value;
value = ngx_http_get_indexed_variable(r, data);
@@ -645,7 +656,9 @@
return 1;
}
- len = ngx_http_log_escape(NULL, value->data, value->len);
+ lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module);
+
+ len = ngx_http_log_escape(lcf, NULL, value->data, value->len);
value->escape = len ? 1 : 0;
@@ -656,6 +669,7 @@
static u_char *
ngx_http_log_variable(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)
{
+ ngx_http_log_loc_conf_t *lcf;
ngx_http_variable_value_t *value;
value = ngx_http_get_indexed_variable(r, op->data);
@@ -669,16 +683,18 @@
return ngx_cpymem(buf, value->data, value->len);
} else {
- return (u_char *) ngx_http_log_escape(buf, value->data, value->len);
+ lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module);
+ return (u_char *) ngx_http_log_escape(lcf, buf, value->data, value->len);
}
}
static uintptr_t
-ngx_http_log_escape(u_char *dst, u_char *src, size_t size)
+ngx_http_log_escape(ngx_http_log_loc_conf_t *lcf, u_char *dst, u_char *src,
+ size_t size)
{
- ngx_uint_t n;
- static u_char hex[] = "0123456789ABCDEF";
+ ngx_uint_t n;
+ static u_char hex[] = "0123456789ABCDEF";
static uint32_t escape[] = {
0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
@@ -698,6 +714,12 @@
0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
};
+ if (lcf->escape_non_ascii) {
+ ngx_memset(&escape[4], 0xff, sizeof(uint32_t) * 4);
+
+ } else {
+ ngx_memzero(&escape[4], sizeof(uint32_t) * 4);
+ }
if (dst == NULL) {
@@ -781,6 +803,7 @@
}
conf->open_file_cache = NGX_CONF_UNSET_PTR;
+ conf->escape_non_ascii = NGX_CONF_UNSET;
return conf;
}
@@ -796,6 +819,8 @@
ngx_http_log_fmt_t *fmt;
ngx_http_log_main_conf_t *lmcf;
+ ngx_conf_merge_value(conf->escape_non_ascii, prev->escape_non_ascii, 1);
+
if (conf->open_file_cache == NGX_CONF_UNSET_PTR) {
conf->open_file_cache = prev->open_file_cache;

View File

@ -0,0 +1,12 @@
--- nginx-1.1.13/src/http/ngx_http_core_module.c 2011-09-27 19:14:02.000000000 +0800
+++ nginx-1.1.13-patched/src/http/ngx_http_core_module.c 2011-10-13 15:02:24.414550532 +0800
@@ -2542,6 +2542,9 @@
r->content_handler = NULL;
r->loc_conf = (*clcfp)->loc_conf;
+ /* clear the modules contexts */
+ ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module);
+
ngx_http_update_location_config(r);
cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);

View File

@ -0,0 +1,24 @@
diff -ur nginx-1.1.13/auto/cc/gcc nginx-1.1.13-patched/auto/cc/gcc
--- nginx-1.1.13/auto/cc/gcc 2011-06-27 19:53:00.205737804 +0800
+++ nginx-1.1.13-patched/auto/cc/gcc 2011-06-27 19:53:13.837741087 +0800
@@ -169,7 +169,7 @@
# stop on warning
-CFLAGS="$CFLAGS -Werror"
+#CFLAGS="$CFLAGS -Werror"
# debug
CFLAGS="$CFLAGS -g"
diff -ur nginx-1.1.13/auto/cc/icc nginx-1.1.13-patched/auto/cc/icc
--- nginx-1.1.13/auto/cc/icc 2011-06-27 19:52:56.370157068 +0800
+++ nginx-1.1.13-patched/auto/cc/icc 2011-06-27 19:53:19.508916811 +0800
@@ -139,7 +139,7 @@
esac
# stop on warning
-CFLAGS="$CFLAGS -Werror"
+#CFLAGS="$CFLAGS -Werror"
# debug
CFLAGS="$CFLAGS -g"

View File

@ -0,0 +1,90 @@
--- nginx-1.1.13/src/http/ngx_http_core_module.c 2010-12-14 18:38:42.000000000 +0800
+++ nginx-1.1.13-patched/src/http/ngx_http_core_module.c 2011-01-30 19:24:34.956354518 +0800
@@ -57,6 +57,8 @@
void *conf);
static char *ngx_http_core_error_page(ngx_conf_t *cf, ngx_command_t *cmd,
void *conf);
+static char *ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd,
+ void *conf);
static char *ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd,
void *conf);
static char *ngx_http_core_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd,
@@ -614,6 +616,14 @@
0,
NULL },
+ { ngx_string("no_error_pages"),
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
+ |NGX_CONF_NOARGS,
+ ngx_http_core_no_error_pages,
+ NGX_HTTP_LOC_CONF_OFFSET,
+ 0,
+ NULL },
+
{ ngx_string("try_files"),
NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_2MORE,
ngx_http_core_try_files,
@@ -3052,7 +3062,6 @@
* clcf->types = NULL;
* clcf->default_type = { 0, NULL };
* clcf->error_log = NULL;
- * clcf->error_pages = NULL;
* clcf->try_files = NULL;
* clcf->client_body_path = NULL;
* clcf->regex = NULL;
@@ -3062,6 +3071,7 @@
* clcf->gzip_proxied = 0;
*/
+ clcf->error_pages = NGX_CONF_UNSET_PTR;
clcf->client_max_body_size = NGX_CONF_UNSET;
clcf->client_body_buffer_size = NGX_CONF_UNSET_SIZE;
clcf->client_body_timeout = NGX_CONF_UNSET_MSEC;
@@ -3250,9 +3260,7 @@
}
}
- if (conf->error_pages == NULL && prev->error_pages) {
- conf->error_pages = prev->error_pages;
- }
+ ngx_conf_merge_ptr_value(conf->error_pages, prev->error_pages, NULL);
ngx_conf_merge_str_value(conf->default_type,
prev->default_type, "text/plain");
@@ -3988,6 +3996,10 @@
ngx_http_compile_complex_value_t ccv;
if (clcf->error_pages == NULL) {
+ return "conflicts with \"no_error_pages\"";
+ }
+
+ if (clcf->error_pages == NGX_CONF_UNSET_PTR) {
clcf->error_pages = ngx_array_create(cf->pool, 4,
sizeof(ngx_http_err_page_t));
if (clcf->error_pages == NULL) {
@@ -4095,6 +4107,25 @@
static char *
+ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
+{
+ ngx_http_core_loc_conf_t *clcf = conf;
+
+ if (clcf->error_pages == NULL) {
+ return "is duplicate";
+ }
+
+ if (clcf->error_pages != NGX_CONF_UNSET_PTR) {
+ return "conflicts with \"error_page\"";
+ }
+
+ clcf->error_pages = NULL;
+
+ return NGX_CONF_OK;
+}
+
+
+static char *
ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
ngx_http_core_loc_conf_t *clcf = conf;

View File

@ -0,0 +1,504 @@
diff -ur nginx-1.1.13/src/core/nginx.h nginx-1.1.13-patched/src/core/nginx.h
--- nginx-1.1.13/src/core/nginx.h 2011-08-29 17:30:22.000000000 +0800
+++ nginx-1.1.13-patched/src/core/nginx.h 2011-09-13 12:11:03.135622101 +0800
@@ -10,7 +10,7 @@
#define nginx_version 1001013
#define NGINX_VERSION "1.1.13"
-#define NGINX_VER "ngx_openresty/" NGINX_VERSION ".unknown"
+#define NGINX_VER "ngx_openresty/" NGINX_VERSION ".unknown (no pool)"
#define NGINX_VAR "NGINX"
diff -ur nginx-1.1.13/src/core/ngx_array.c nginx-1.1.13-patched/src/core/ngx_array.c
--- nginx-1.1.13/src/core/ngx_array.c 2008-06-17 23:00:30.000000000 +0800
+++ nginx-1.1.13-patched/src/core/ngx_array.c 2011-09-14 12:02:56.263128538 +0800
@@ -39,13 +39,7 @@
p = a->pool;
- if ((u_char *) a->elts + a->size * a->nalloc == p->d.last) {
- p->d.last -= a->size * a->nalloc;
- }
-
- if ((u_char *) a + sizeof(ngx_array_t) == p->d.last) {
- p->d.last = (u_char *) a;
- }
+ ngx_pfree(p, a);
}
@@ -64,29 +58,17 @@
p = a->pool;
- if ((u_char *) a->elts + size == p->d.last
- && p->d.last + a->size <= p->d.end)
- {
- /*
- * the array allocation is the last in the pool
- * and there is space for new allocation
- */
-
- p->d.last += a->size;
- a->nalloc++;
-
- } else {
- /* allocate a new array */
-
- new = ngx_palloc(p, 2 * size);
- if (new == NULL) {
- return NULL;
- }
-
- ngx_memcpy(new, a->elts, size);
- a->elts = new;
- a->nalloc *= 2;
+ /* allocate a new array */
+
+ new = ngx_palloc(p, 2 * size);
+ if (new == NULL) {
+ return NULL;
}
+
+ ngx_memcpy(new, a->elts, size);
+ a->elts = new;
+ a->nalloc *= 2;
+
}
elt = (u_char *) a->elts + a->size * a->nelts;
@@ -100,43 +82,25 @@
ngx_array_push_n(ngx_array_t *a, ngx_uint_t n)
{
void *elt, *new;
- size_t size;
ngx_uint_t nalloc;
ngx_pool_t *p;
- size = n * a->size;
-
if (a->nelts + n > a->nalloc) {
/* the array is full */
p = a->pool;
- if ((u_char *) a->elts + a->size * a->nalloc == p->d.last
- && p->d.last + size <= p->d.end)
- {
- /*
- * the array allocation is the last in the pool
- * and there is space for new allocation
- */
-
- p->d.last += size;
- a->nalloc += n;
-
- } else {
- /* allocate a new array */
-
- nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);
-
- new = ngx_palloc(p, nalloc * a->size);
- if (new == NULL) {
- return NULL;
- }
-
- ngx_memcpy(new, a->elts, a->nelts * a->size);
- a->elts = new;
- a->nalloc = nalloc;
+ nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);
+
+ new = ngx_palloc(p, nalloc * a->size);
+ if (new == NULL) {
+ return NULL;
}
+
+ ngx_memcpy(new, a->elts, a->nelts * a->size);
+ a->elts = new;
+ a->nalloc = nalloc;
}
elt = (u_char *) a->elts + a->size * a->nelts;
diff -ur nginx-1.1.13/src/core/ngx_palloc.c nginx-1.1.13-patched/src/core/ngx_palloc.c
--- nginx-1.1.13/src/core/ngx_palloc.c 2009-12-17 20:25:46.000000000 +0800
+++ nginx-1.1.13-patched/src/core/ngx_palloc.c 2011-09-14 12:03:41.663126519 +0800
@@ -8,24 +8,31 @@
#include <ngx_core.h>
-static void *ngx_palloc_block(ngx_pool_t *pool, size_t size);
static void *ngx_palloc_large(ngx_pool_t *pool, size_t size);
ngx_pool_t *
ngx_create_pool(size_t size, ngx_log_t *log)
{
- ngx_pool_t *p;
+ ngx_pool_t *p;
+ ngx_pool_data_t *d;
- p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);
+ size = sizeof(ngx_pool_t);
+ p = ngx_alloc(size, log);
if (p == NULL) {
return NULL;
}
- p->d.last = (u_char *) p + sizeof(ngx_pool_t);
- p->d.end = (u_char *) p + size;
- p->d.next = NULL;
- p->d.failed = 0;
+ d = ngx_alloc(sizeof(ngx_pool_data_t), log);
+
+ if (d == NULL) {
+ return NULL;
+ }
+
+ d->next = d;
+ d->prev = d;
+ d->alloc = NULL;
+ p->d = d;
size = size - sizeof(ngx_pool_t);
p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;
@@ -43,7 +50,7 @@
void
ngx_destroy_pool(ngx_pool_t *pool)
{
- ngx_pool_t *p, *n;
+ ngx_pool_data_t *d, *n;
ngx_pool_large_t *l;
ngx_pool_cleanup_t *c;
@@ -55,7 +62,7 @@
}
}
- for (l = pool->large; l; l = l->next) {
+ for (l = pool->large; l ; l = l->next) {
ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);
@@ -71,34 +78,45 @@
* so we can not use this log while the free()ing the pool
*/
- for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {
+ for (d = pool->d, n = d->next; ; d = n, n = n->next) {
ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
- "free: %p, unused: %uz", p, p->d.end - p->d.last);
+ "free: %p", d);
- if (n == NULL) {
+ if (n == pool->d) {
break;
}
}
#endif
+ if (pool->d->next == pool->d) {
+ ngx_free(pool->d);
+ } else {
+ for (d = pool->d, n = d->next; ; d = n, n = n->next) {
+ if (d->alloc) {
+ ngx_free(d->alloc);
+ }
+ ngx_free(d);
- for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {
- ngx_free(p);
-
- if (n == NULL) {
- break;
+ if (n == pool->d) {
+ break;
+ }
}
}
+
+ ngx_free(pool);
}
void
ngx_reset_pool(ngx_pool_t *pool)
{
- ngx_pool_t *p;
- ngx_pool_large_t *l;
+ ngx_pool_data_t *p, *tmp;
+ ngx_pool_large_t *l;
+
+ for (l = pool->large; l ; l = l->next) {
+
+ ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);
- for (l = pool->large; l; l = l->next) {
if (l->alloc) {
ngx_free(l->alloc);
}
@@ -106,109 +124,65 @@
pool->large = NULL;
- for (p = pool; p; p = p->d.next) {
- p->d.last = (u_char *) p + sizeof(ngx_pool_t);
+ p = pool->d->next;
+ while (p != pool->d) {
+ tmp = p;
+ ngx_free(p->alloc);
+ p->prev->next = p->next;
+ p->next->prev = p->prev;
+ p = p->next;
+ ngx_free(tmp);
}
-}
+ ngx_free(pool->d->alloc);
+ pool->d->alloc = NULL;
+
+}
void *
-ngx_palloc(ngx_pool_t *pool, size_t size)
+ngx_malloc(ngx_pool_t *pool, size_t size)
{
- u_char *m;
- ngx_pool_t *p;
-
- if (size <= pool->max) {
+ ngx_pool_data_t *new;
+ void *m;
- p = pool->current;
-
- do {
- m = ngx_align_ptr(p->d.last, NGX_ALIGNMENT);
-
- if ((size_t) (p->d.end - m) >= size) {
- p->d.last = m + size;
-
- return m;
- }
-
- p = p->d.next;
-
- } while (p);
+ m = ngx_alloc(size, pool->log);
+ if (m == NULL) {
+ return NULL;
+ }
- return ngx_palloc_block(pool, size);
+ new = ngx_alloc(sizeof(ngx_pool_data_t), pool->log);
+ if (new == NULL){
+ ngx_free(m);
+ return NULL;
}
- return ngx_palloc_large(pool, size);
+ new->alloc = m;
+ new->next = pool->d;
+ new->prev = pool->d->prev;
+ pool->d->prev->next = new;
+ pool->d->prev = new;
+ return m;
}
-
void *
-ngx_pnalloc(ngx_pool_t *pool, size_t size)
+ngx_palloc(ngx_pool_t *pool, size_t size)
{
- u_char *m;
- ngx_pool_t *p;
-
- if (size <= pool->max) {
-
- p = pool->current;
-
- do {
- m = p->d.last;
-
- if ((size_t) (p->d.end - m) >= size) {
- p->d.last = m + size;
-
- return m;
- }
-
- p = p->d.next;
-
- } while (p);
-
- return ngx_palloc_block(pool, size);
+ if (size <= 1024) {
+ return ngx_malloc(pool, size);
}
return ngx_palloc_large(pool, size);
}
-static void *
-ngx_palloc_block(ngx_pool_t *pool, size_t size)
+void *
+ngx_pnalloc(ngx_pool_t *pool, size_t size)
{
- u_char *m;
- size_t psize;
- ngx_pool_t *p, *new, *current;
-
- psize = (size_t) (pool->d.end - (u_char *) pool);
-
- m = ngx_memalign(NGX_POOL_ALIGNMENT, psize, pool->log);
- if (m == NULL) {
- return NULL;
- }
-
- new = (ngx_pool_t *) m;
-
- new->d.end = m + psize;
- new->d.next = NULL;
- new->d.failed = 0;
-
- m += sizeof(ngx_pool_data_t);
- m = ngx_align_ptr(m, NGX_ALIGNMENT);
- new->d.last = m + size;
-
- current = pool->current;
-
- for (p = current; p->d.next; p = p->d.next) {
- if (p->d.failed++ > 4) {
- current = p->d.next;
- }
+ if (size <= 1024) {
+ return ngx_malloc(pool, size);
}
- p->d.next = new;
-
- pool->current = current ? current : new;
-
- return m;
+ return ngx_palloc_large(pool, size);
}
@@ -216,7 +190,6 @@
ngx_palloc_large(ngx_pool_t *pool, size_t size)
{
void *p;
- ngx_uint_t n;
ngx_pool_large_t *large;
p = ngx_alloc(size, pool->log);
@@ -224,20 +197,7 @@
return NULL;
}
- n = 0;
-
- for (large = pool->large; large; large = large->next) {
- if (large->alloc == NULL) {
- large->alloc = p;
- return p;
- }
-
- if (n++ > 3) {
- break;
- }
- }
-
- large = ngx_palloc(pool, sizeof(ngx_pool_large_t));
+ large = ngx_malloc(pool, sizeof(ngx_pool_large_t));
if (large == NULL) {
ngx_free(p);
return NULL;
@@ -262,7 +222,7 @@
return NULL;
}
- large = ngx_palloc(pool, sizeof(ngx_pool_large_t));
+ large = ngx_malloc(pool, sizeof(ngx_pool_large_t));
if (large == NULL) {
ngx_free(p);
return NULL;
@@ -279,17 +239,41 @@
ngx_int_t
ngx_pfree(ngx_pool_t *pool, void *p)
{
- ngx_pool_large_t *l;
+ ngx_pool_large_t *l;
+ ngx_pool_large_t *ll;
+ ngx_pool_data_t *d, *n;
- for (l = pool->large; l; l = l->next) {
+ for (l = pool->large, ll = l; l; ll = l, l = l->next) {
if (p == l->alloc) {
ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
"free: %p", l->alloc);
ngx_free(l->alloc);
l->alloc = NULL;
+ if (l == pool->large) {
+ pool->large = NULL;
+ }
+
+ ll->next = l->next;
+ p = l;
+ break;
+ }
+ }
+ for (d = pool->d, n = d->next; ; d = n, n = d->next) {
+ if (p == d->alloc) {
+ ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", d->alloc);
+ if (d->alloc) {
+ ngx_free(d->alloc);
+ }
+ d->alloc = NULL;
+ d->prev->next = d->next;
+ d->next->prev = d->prev;
+ ngx_free(d);
return NGX_OK;
}
+ if (d->next == pool->d) {
+ break;
+ }
}
return NGX_DECLINED;
diff -ur nginx-1.1.13/src/core/ngx_palloc.h nginx-1.1.13-patched/src/core/ngx_palloc.h
--- nginx-1.1.13/src/core/ngx_palloc.h 2009-12-17 20:25:46.000000000 +0800
+++ nginx-1.1.13-patched/src/core/ngx_palloc.h 2011-09-13 12:11:03.155622101 +0800
@@ -38,6 +38,7 @@
typedef struct ngx_pool_large_s ngx_pool_large_t;
+typedef struct ngx_pool_data_s ngx_pool_data_t;
struct ngx_pool_large_s {
ngx_pool_large_t *next;
@@ -45,16 +46,15 @@
};
-typedef struct {
- u_char *last;
- u_char *end;
- ngx_pool_t *next;
- ngx_uint_t failed;
-} ngx_pool_data_t;
+struct ngx_pool_data_s{
+ ngx_pool_data_t *next;
+ ngx_pool_data_t *prev;
+ void *alloc;
+};
struct ngx_pool_s {
- ngx_pool_data_t d;
+ ngx_pool_data_t *d;
size_t max;
ngx_pool_t *current;
ngx_chain_t *chain;

View File

@ -0,0 +1,27 @@
# HG changeset patch
# User Maxim Dounin <mdounin@mdounin.ru>
# Date 1309799136 -14400
# Node ID 99e276bba8596bc4df9e638482ee413f4c6bf700
# Parent e7b2f945d55ae44a2295facf9e3336dc4633e5b5
Core: fix body with request_body_in_single_buf.
If there were preread data and request body was big enough first part
of request body was duplicated.
See report here:
http://nginx.org/pipermail/nginx/2011-July/027756.html
diff --git a/src/http/ngx_http_request_body.c b/src/http/ngx_http_request_body.c
--- a/src/http/ngx_http_request_body.c
+++ b/src/http/ngx_http_request_body.c
@@ -372,7 +372,9 @@ ngx_http_do_read_client_request_body(ngx
}
}
- if (r->request_body_in_file_only && rb->bufs->next) {
+ if (rb->bufs->next
+ && (r->request_body_in_file_only || r->request_body_in_single_buf))
+ {
rb->bufs = rb->bufs->next;
}

View File

@ -0,0 +1,17 @@
# HG changeset patch
# User Maxim Dounin <mdounin@mdounin.ru>
# Date 1309776931 -14400
# Node ID e7b2f945d55ae44a2295facf9e3336dc4633e5b5
# Parent 610e909bb9e29766188aa86fae3abe0bd3432940
Core: fix body if it's preread and there are extra data.
--- nginx-1.1.13/src/http/ngx_http_request_body.c 2011-07-05 12:11:21.619264633 +0800
+++ nginx-1.1.13-patched/src/http/ngx_http_request_body.c 2011-07-05 12:14:30.694321554 +0800
@@ -141,6 +141,7 @@
/* the whole request body was pre-read */
+ b->last = b->pos + r->headers_in.content_length_n;
r->header_in->pos += (size_t) r->headers_in.content_length_n;
r->request_length += r->headers_in.content_length_n;

View File

@ -0,0 +1,26 @@
diff -ur lz-nginx-1.1.13/nginx-1.1.13/src/core/nginx.h lz-nginx-1.1.13-patched/nginx-1.1.13/src/core/nginx.h
--- lz-nginx-1.1.13/nginx-1.1.13/src/core/nginx.h 2010-02-12 17:31:01.000000000 +0800
+++ lz-nginx-1.1.13-patched/nginx-1.1.13/src/core/nginx.h 2010-03-30 10:52:13.240702627 +0800
@@ -10,7 +10,7 @@
#define nginx_version 1001013
#define NGINX_VERSION "1.1.13"
-#define NGINX_VER "nginx/" NGINX_VERSION
+#define NGINX_VER "ngx_openresty/" NGINX_VERSION ".unknown"
#define NGINX_VAR "NGINX"
#define NGX_OLDPID_EXT ".oldbin"
Only in lz-nginx-1.1.13-patched/nginx-1.1.13/src/core: nginx.h.orig
Only in lz-nginx-1.1.13-patched/nginx-1.1.13/src/core: nginx.h.rej
diff -ur lz-nginx-1.1.13/nginx-1.1.13/src/http/ngx_http_header_filter_module.c lz-nginx-1.1.13-patched/nginx-1.1.13/src/http/ngx_http_header_filter_module.c
--- lz-nginx-1.1.13/nginx-1.1.13/src/http/ngx_http_header_filter_module.c 2010-03-03 23:14:04.000000000 +0800
+++ lz-nginx-1.1.13-patched/nginx-1.1.13/src/http/ngx_http_header_filter_module.c 2010-03-30 10:52:53.670909405 +0800
@@ -45,7 +45,7 @@
};
-static char ngx_http_server_string[] = "Server: nginx" CRLF;
+static char ngx_http_server_string[] = "Server: ngx_openresty" CRLF;
static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;

View File

@ -0,0 +1,40 @@
# HG changeset patch
# User Maxim Dounin <mdounin@mdounin.ru>
# Date 1309187571 -14400
# Node ID 283a416b2235d5383c12a975edc8866f007fb628
# Parent f5fc40783ddcbf4db33859ee2a9bce54cf32c350
Core: protect from subrequest loops.
Without protection subrequest loop results in r->count overflow and
SIGSEGV. Protection was broken in 0.7.25.
Note that this also limits number of parallel subrequests. This
wasn't exactly the case before 0.7.25 as local subrequests were
completed directly.
See here for details:
http://nginx.org/pipermail/nginx-ru/2010-February/032184.html
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
--- a/src/http/ngx_http_core_module.c
+++ b/src/http/ngx_http_core_module.c
@@ -2287,7 +2287,6 @@ ngx_http_subrequest(ngx_http_request_t *
sr->start_sec = tp->sec;
sr->start_msec = tp->msec;
- r->main->subrequests++;
r->main->count++;
*psr = sr;
diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c
--- a/src/http/ngx_http_request.c
+++ b/src/http/ngx_http_request.c
@@ -1981,6 +1981,7 @@ ngx_http_finalize_request(ngx_http_reque
if (r == c->data) {
r->main->count--;
+ r->main->subrequests++;
if (!r->logged) {

View File

@ -0,0 +1,73 @@
--- nginx-1.1.13/src/http/ngx_http_variables.c 2011-05-30 20:36:17.000000000 +0800
+++ nginx-1.1.13-patched/src/http/ngx_http_variables.c 2011-11-08 22:21:55.229247198 +0800
@@ -648,7 +648,17 @@
a = (ngx_array_t *) ((char *) r + data);
- n = a->nelts;
+ h = a->elts;
+ n = 0;
+
+ for (i = 0; i < a->nelts; i++) {
+
+ if (h[i]->hash == 0) {
+ continue;
+ }
+
+ n++;
+ }
if (n == 0) {
v->not_found = 1;
@@ -659,9 +669,7 @@
v->no_cacheable = 0;
v->not_found = 0;
- h = a->elts;
-
- if (n == 1) {
+ if (n == 1 && a->nelts == 1) {
v->len = (*h)->value.len;
v->data = (*h)->value.data;
@@ -670,7 +678,12 @@
len = - (ssize_t) (sizeof("; ") - 1);
- for (i = 0; i < n; i++) {
+ for (i = 0; i < a->nelts; i++) {
+
+ if (h[i]->hash == 0) {
+ continue;
+ }
+
len += h[i]->value.len + sizeof("; ") - 1;
}
@@ -683,9 +696,14 @@
v->data = p;
for (i = 0; /* void */ ; i++) {
+
+ if (h[i]->hash == 0) {
+ continue;
+ }
+
p = ngx_copy(p, h[i]->value.data, h[i]->value.len);
- if (i == n - 1) {
+ if (--n == 0) {
break;
}
@@ -738,6 +756,10 @@
i = 0;
}
+ if (header[i].hash == 0) {
+ continue;
+ }
+
for (n = 0; n + prefix < var->len && n < header[i].key.len; n++) {
ch = header[i].key.data[n];

View File

@ -0,0 +1,69 @@
# HG changeset patch
# User Maxim Dounin <mdounin@mdounin.ru>
# Date 1315324342 -14400
# Node ID 4cf0af103bc382a78f894302d1706929a79df4bb
# Parent d603ce98fada855f0100b422b7b5672fd22fabea
Gzip filter: handle empty flush buffers.
Empty flush buffers are legitimate and may happen e.g. due to $r->flush()
calls in embedded perl. If there are no data buffered in zlib deflate()
will return Z_BUF_ERROR (i.e. no progress possible) without adding anything
to output. Don't treat Z_BUF_ERROR as fatal and correctly send empty flush
buffer if we have no data in output at all.
See this thread for details:
http://mailman.nginx.org/pipermail/nginx/2010-November/023693.html
diff --git a/src/http/modules/ngx_http_gzip_filter_module.c b/src/http/modules/ngx_http_gzip_filter_module.c
--- a/src/http/modules/ngx_http_gzip_filter_module.c
+++ b/src/http/modules/ngx_http_gzip_filter_module.c
@@ -758,6 +758,7 @@ static ngx_int_t
ngx_http_gzip_filter_deflate(ngx_http_request_t *r, ngx_http_gzip_ctx_t *ctx)
{
int rc;
+ ngx_buf_t *b;
ngx_chain_t *cl;
ngx_http_gzip_conf_t *conf;
@@ -769,7 +770,7 @@ ngx_http_gzip_filter_deflate(ngx_http_re
rc = deflate(&ctx->zstream, ctx->flush);
- if (rc != Z_OK && rc != Z_STREAM_END) {
+ if (rc != Z_OK && rc != Z_STREAM_END && rc != Z_BUF_ERROR) {
ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
"deflate() failed: %d, %d", ctx->flush, rc);
return NGX_ERROR;
@@ -818,8 +819,6 @@ ngx_http_gzip_filter_deflate(ngx_http_re
if (ctx->flush == Z_SYNC_FLUSH) {
- ctx->zstream.avail_out = 0;
- ctx->out_buf->flush = 1;
ctx->flush = Z_NO_FLUSH;
cl = ngx_alloc_chain_link(r->pool);
@@ -827,7 +826,22 @@ ngx_http_gzip_filter_deflate(ngx_http_re
return NGX_ERROR;
}
- cl->buf = ctx->out_buf;
+ b = ctx->out_buf;
+
+ if (ngx_buf_size(b) == 0) {
+
+ b = ngx_calloc_buf(ctx->request->pool);
+ if (b == NULL) {
+ return NGX_ERROR;
+ }
+
+ } else {
+ ctx->zstream.avail_out = 0;
+ }
+
+ b->flush = 1;
+
+ cl->buf = b;
cl->next = NULL;
*ctx->last_out = cl;
ctx->last_out = &cl->next;

View File

@ -0,0 +1,24 @@
diff -ur nginx-1.1.4/auto/cc/gcc nginx-1.1.4-patched/auto/cc/gcc
--- nginx-1.1.4/auto/cc/gcc 2011-06-27 19:53:00.205737804 +0800
+++ nginx-1.1.4-patched/auto/cc/gcc 2011-06-27 19:53:13.837741087 +0800
@@ -169,7 +169,7 @@
# stop on warning
-CFLAGS="$CFLAGS -Werror"
+#CFLAGS="$CFLAGS -Werror"
# debug
CFLAGS="$CFLAGS -g"
diff -ur nginx-1.1.4/auto/cc/icc nginx-1.1.4-patched/auto/cc/icc
--- nginx-1.1.4/auto/cc/icc 2011-06-27 19:52:56.370157068 +0800
+++ nginx-1.1.4-patched/auto/cc/icc 2011-06-27 19:53:19.508916811 +0800
@@ -139,7 +139,7 @@
esac
# stop on warning
-CFLAGS="$CFLAGS -Werror"
+#CFLAGS="$CFLAGS -Werror"
# debug
CFLAGS="$CFLAGS -g"

View File

@ -0,0 +1,90 @@
--- nginx-1.1.4/src/http/ngx_http_core_module.c 2010-12-14 18:38:42.000000000 +0800
+++ nginx-1.1.4-patched/src/http/ngx_http_core_module.c 2011-01-30 19:24:34.956354518 +0800
@@ -57,6 +57,8 @@
void *conf);
static char *ngx_http_core_error_page(ngx_conf_t *cf, ngx_command_t *cmd,
void *conf);
+static char *ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd,
+ void *conf);
static char *ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd,
void *conf);
static char *ngx_http_core_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd,
@@ -614,6 +616,14 @@
0,
NULL },
+ { ngx_string("no_error_pages"),
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
+ |NGX_CONF_NOARGS,
+ ngx_http_core_no_error_pages,
+ NGX_HTTP_LOC_CONF_OFFSET,
+ 0,
+ NULL },
+
{ ngx_string("try_files"),
NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_2MORE,
ngx_http_core_try_files,
@@ -3052,7 +3062,6 @@
* clcf->types = NULL;
* clcf->default_type = { 0, NULL };
* clcf->error_log = NULL;
- * clcf->error_pages = NULL;
* clcf->try_files = NULL;
* clcf->client_body_path = NULL;
* clcf->regex = NULL;
@@ -3062,6 +3071,7 @@
* clcf->gzip_proxied = 0;
*/
+ clcf->error_pages = NGX_CONF_UNSET_PTR;
clcf->client_max_body_size = NGX_CONF_UNSET;
clcf->client_body_buffer_size = NGX_CONF_UNSET_SIZE;
clcf->client_body_timeout = NGX_CONF_UNSET_MSEC;
@@ -3250,9 +3260,7 @@
}
}
- if (conf->error_pages == NULL && prev->error_pages) {
- conf->error_pages = prev->error_pages;
- }
+ ngx_conf_merge_ptr_value(conf->error_pages, prev->error_pages, NULL);
ngx_conf_merge_str_value(conf->default_type,
prev->default_type, "text/plain");
@@ -3988,6 +3996,10 @@
ngx_http_compile_complex_value_t ccv;
if (clcf->error_pages == NULL) {
+ return "conflicts with \"no_error_pages\"";
+ }
+
+ if (clcf->error_pages == NGX_CONF_UNSET_PTR) {
clcf->error_pages = ngx_array_create(cf->pool, 4,
sizeof(ngx_http_err_page_t));
if (clcf->error_pages == NULL) {
@@ -4095,6 +4107,25 @@
static char *
+ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
+{
+ ngx_http_core_loc_conf_t *clcf = conf;
+
+ if (clcf->error_pages == NULL) {
+ return "is duplicate";
+ }
+
+ if (clcf->error_pages != NGX_CONF_UNSET_PTR) {
+ return "conflicts with \"error_page\"";
+ }
+
+ clcf->error_pages = NULL;
+
+ return NGX_CONF_OK;
+}
+
+
+static char *
ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
ngx_http_core_loc_conf_t *clcf = conf;

View File

@ -0,0 +1,504 @@
diff -ur nginx-1.1.4/src/core/nginx.h nginx-1.1.4-patched/src/core/nginx.h
--- nginx-1.1.4/src/core/nginx.h 2011-08-29 17:30:22.000000000 +0800
+++ nginx-1.1.4-patched/src/core/nginx.h 2011-09-13 12:11:03.135622101 +0800
@@ -10,7 +10,7 @@
#define nginx_version 1001004
#define NGINX_VERSION "1.1.4"
-#define NGINX_VER "ngx_openresty/" NGINX_VERSION ".unknown"
+#define NGINX_VER "ngx_openresty/" NGINX_VERSION ".unknown (no pool)"
#define NGINX_VAR "NGINX"
diff -ur nginx-1.1.4/src/core/ngx_array.c nginx-1.1.4-patched/src/core/ngx_array.c
--- nginx-1.1.4/src/core/ngx_array.c 2008-06-17 23:00:30.000000000 +0800
+++ nginx-1.1.4-patched/src/core/ngx_array.c 2011-09-14 12:02:56.263128538 +0800
@@ -39,13 +39,7 @@
p = a->pool;
- if ((u_char *) a->elts + a->size * a->nalloc == p->d.last) {
- p->d.last -= a->size * a->nalloc;
- }
-
- if ((u_char *) a + sizeof(ngx_array_t) == p->d.last) {
- p->d.last = (u_char *) a;
- }
+ ngx_pfree(p, a);
}
@@ -64,29 +58,17 @@
p = a->pool;
- if ((u_char *) a->elts + size == p->d.last
- && p->d.last + a->size <= p->d.end)
- {
- /*
- * the array allocation is the last in the pool
- * and there is space for new allocation
- */
-
- p->d.last += a->size;
- a->nalloc++;
-
- } else {
- /* allocate a new array */
-
- new = ngx_palloc(p, 2 * size);
- if (new == NULL) {
- return NULL;
- }
-
- ngx_memcpy(new, a->elts, size);
- a->elts = new;
- a->nalloc *= 2;
+ /* allocate a new array */
+
+ new = ngx_palloc(p, 2 * size);
+ if (new == NULL) {
+ return NULL;
}
+
+ ngx_memcpy(new, a->elts, size);
+ a->elts = new;
+ a->nalloc *= 2;
+
}
elt = (u_char *) a->elts + a->size * a->nelts;
@@ -100,43 +82,25 @@
ngx_array_push_n(ngx_array_t *a, ngx_uint_t n)
{
void *elt, *new;
- size_t size;
ngx_uint_t nalloc;
ngx_pool_t *p;
- size = n * a->size;
-
if (a->nelts + n > a->nalloc) {
/* the array is full */
p = a->pool;
- if ((u_char *) a->elts + a->size * a->nalloc == p->d.last
- && p->d.last + size <= p->d.end)
- {
- /*
- * the array allocation is the last in the pool
- * and there is space for new allocation
- */
-
- p->d.last += size;
- a->nalloc += n;
-
- } else {
- /* allocate a new array */
-
- nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);
-
- new = ngx_palloc(p, nalloc * a->size);
- if (new == NULL) {
- return NULL;
- }
-
- ngx_memcpy(new, a->elts, a->nelts * a->size);
- a->elts = new;
- a->nalloc = nalloc;
+ nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);
+
+ new = ngx_palloc(p, nalloc * a->size);
+ if (new == NULL) {
+ return NULL;
}
+
+ ngx_memcpy(new, a->elts, a->nelts * a->size);
+ a->elts = new;
+ a->nalloc = nalloc;
}
elt = (u_char *) a->elts + a->size * a->nelts;
diff -ur nginx-1.1.4/src/core/ngx_palloc.c nginx-1.1.4-patched/src/core/ngx_palloc.c
--- nginx-1.1.4/src/core/ngx_palloc.c 2009-12-17 20:25:46.000000000 +0800
+++ nginx-1.1.4-patched/src/core/ngx_palloc.c 2011-09-14 12:03:41.663126519 +0800
@@ -8,24 +8,31 @@
#include <ngx_core.h>
-static void *ngx_palloc_block(ngx_pool_t *pool, size_t size);
static void *ngx_palloc_large(ngx_pool_t *pool, size_t size);
ngx_pool_t *
ngx_create_pool(size_t size, ngx_log_t *log)
{
- ngx_pool_t *p;
+ ngx_pool_t *p;
+ ngx_pool_data_t *d;
- p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);
+ size = sizeof(ngx_pool_t);
+ p = ngx_alloc(size, log);
if (p == NULL) {
return NULL;
}
- p->d.last = (u_char *) p + sizeof(ngx_pool_t);
- p->d.end = (u_char *) p + size;
- p->d.next = NULL;
- p->d.failed = 0;
+ d = ngx_alloc(sizeof(ngx_pool_data_t), log);
+
+ if (d == NULL) {
+ return NULL;
+ }
+
+ d->next = d;
+ d->prev = d;
+ d->alloc = NULL;
+ p->d = d;
size = size - sizeof(ngx_pool_t);
p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;
@@ -43,7 +50,7 @@
void
ngx_destroy_pool(ngx_pool_t *pool)
{
- ngx_pool_t *p, *n;
+ ngx_pool_data_t *d, *n;
ngx_pool_large_t *l;
ngx_pool_cleanup_t *c;
@@ -55,7 +62,7 @@
}
}
- for (l = pool->large; l; l = l->next) {
+ for (l = pool->large; l ; l = l->next) {
ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);
@@ -71,34 +78,45 @@
* so we can not use this log while the free()ing the pool
*/
- for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {
+ for (d = pool->d, n = d->next; ; d = n, n = n->next) {
ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
- "free: %p, unused: %uz", p, p->d.end - p->d.last);
+ "free: %p", d);
- if (n == NULL) {
+ if (n == pool->d) {
break;
}
}
#endif
+ if (pool->d->next == pool->d) {
+ ngx_free(pool->d);
+ } else {
+ for (d = pool->d, n = d->next; ; d = n, n = n->next) {
+ if (d->alloc) {
+ ngx_free(d->alloc);
+ }
+ ngx_free(d);
- for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {
- ngx_free(p);
-
- if (n == NULL) {
- break;
+ if (n == pool->d) {
+ break;
+ }
}
}
+
+ ngx_free(pool);
}
void
ngx_reset_pool(ngx_pool_t *pool)
{
- ngx_pool_t *p;
- ngx_pool_large_t *l;
+ ngx_pool_data_t *p, *tmp;
+ ngx_pool_large_t *l;
+
+ for (l = pool->large; l ; l = l->next) {
+
+ ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);
- for (l = pool->large; l; l = l->next) {
if (l->alloc) {
ngx_free(l->alloc);
}
@@ -106,109 +124,65 @@
pool->large = NULL;
- for (p = pool; p; p = p->d.next) {
- p->d.last = (u_char *) p + sizeof(ngx_pool_t);
+ p = pool->d->next;
+ while (p != pool->d) {
+ tmp = p;
+ ngx_free(p->alloc);
+ p->prev->next = p->next;
+ p->next->prev = p->prev;
+ p = p->next;
+ ngx_free(tmp);
}
-}
+ ngx_free(pool->d->alloc);
+ pool->d->alloc = NULL;
+
+}
void *
-ngx_palloc(ngx_pool_t *pool, size_t size)
+ngx_malloc(ngx_pool_t *pool, size_t size)
{
- u_char *m;
- ngx_pool_t *p;
-
- if (size <= pool->max) {
+ ngx_pool_data_t *new;
+ void *m;
- p = pool->current;
-
- do {
- m = ngx_align_ptr(p->d.last, NGX_ALIGNMENT);
-
- if ((size_t) (p->d.end - m) >= size) {
- p->d.last = m + size;
-
- return m;
- }
-
- p = p->d.next;
-
- } while (p);
+ m = ngx_alloc(size, pool->log);
+ if (m == NULL) {
+ return NULL;
+ }
- return ngx_palloc_block(pool, size);
+ new = ngx_alloc(sizeof(ngx_pool_data_t), pool->log);
+ if (new == NULL){
+ ngx_free(m);
+ return NULL;
}
- return ngx_palloc_large(pool, size);
+ new->alloc = m;
+ new->next = pool->d;
+ new->prev = pool->d->prev;
+ pool->d->prev->next = new;
+ pool->d->prev = new;
+ return m;
}
-
void *
-ngx_pnalloc(ngx_pool_t *pool, size_t size)
+ngx_palloc(ngx_pool_t *pool, size_t size)
{
- u_char *m;
- ngx_pool_t *p;
-
- if (size <= pool->max) {
-
- p = pool->current;
-
- do {
- m = p->d.last;
-
- if ((size_t) (p->d.end - m) >= size) {
- p->d.last = m + size;
-
- return m;
- }
-
- p = p->d.next;
-
- } while (p);
-
- return ngx_palloc_block(pool, size);
+ if (size <= 1024) {
+ return ngx_malloc(pool, size);
}
return ngx_palloc_large(pool, size);
}
-static void *
-ngx_palloc_block(ngx_pool_t *pool, size_t size)
+void *
+ngx_pnalloc(ngx_pool_t *pool, size_t size)
{
- u_char *m;
- size_t psize;
- ngx_pool_t *p, *new, *current;
-
- psize = (size_t) (pool->d.end - (u_char *) pool);
-
- m = ngx_memalign(NGX_POOL_ALIGNMENT, psize, pool->log);
- if (m == NULL) {
- return NULL;
- }
-
- new = (ngx_pool_t *) m;
-
- new->d.end = m + psize;
- new->d.next = NULL;
- new->d.failed = 0;
-
- m += sizeof(ngx_pool_data_t);
- m = ngx_align_ptr(m, NGX_ALIGNMENT);
- new->d.last = m + size;
-
- current = pool->current;
-
- for (p = current; p->d.next; p = p->d.next) {
- if (p->d.failed++ > 4) {
- current = p->d.next;
- }
+ if (size <= 1024) {
+ return ngx_malloc(pool, size);
}
- p->d.next = new;
-
- pool->current = current ? current : new;
-
- return m;
+ return ngx_palloc_large(pool, size);
}
@@ -216,7 +190,6 @@
ngx_palloc_large(ngx_pool_t *pool, size_t size)
{
void *p;
- ngx_uint_t n;
ngx_pool_large_t *large;
p = ngx_alloc(size, pool->log);
@@ -224,20 +197,7 @@
return NULL;
}
- n = 0;
-
- for (large = pool->large; large; large = large->next) {
- if (large->alloc == NULL) {
- large->alloc = p;
- return p;
- }
-
- if (n++ > 3) {
- break;
- }
- }
-
- large = ngx_palloc(pool, sizeof(ngx_pool_large_t));
+ large = ngx_malloc(pool, sizeof(ngx_pool_large_t));
if (large == NULL) {
ngx_free(p);
return NULL;
@@ -262,7 +222,7 @@
return NULL;
}
- large = ngx_palloc(pool, sizeof(ngx_pool_large_t));
+ large = ngx_malloc(pool, sizeof(ngx_pool_large_t));
if (large == NULL) {
ngx_free(p);
return NULL;
@@ -279,17 +239,41 @@
ngx_int_t
ngx_pfree(ngx_pool_t *pool, void *p)
{
- ngx_pool_large_t *l;
+ ngx_pool_large_t *l;
+ ngx_pool_large_t *ll;
+ ngx_pool_data_t *d, *n;
- for (l = pool->large; l; l = l->next) {
+ for (l = pool->large, ll = l; l; ll = l, l = l->next) {
if (p == l->alloc) {
ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
"free: %p", l->alloc);
ngx_free(l->alloc);
l->alloc = NULL;
+ if (l == pool->large) {
+ pool->large = NULL;
+ }
+
+ ll->next = l->next;
+ p = l;
+ break;
+ }
+ }
+ for (d = pool->d, n = d->next; ; d = n, n = d->next) {
+ if (p == d->alloc) {
+ ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", d->alloc);
+ if (d->alloc) {
+ ngx_free(d->alloc);
+ }
+ d->alloc = NULL;
+ d->prev->next = d->next;
+ d->next->prev = d->prev;
+ ngx_free(d);
return NGX_OK;
}
+ if (d->next == pool->d) {
+ break;
+ }
}
return NGX_DECLINED;
diff -ur nginx-1.1.4/src/core/ngx_palloc.h nginx-1.1.4-patched/src/core/ngx_palloc.h
--- nginx-1.1.4/src/core/ngx_palloc.h 2009-12-17 20:25:46.000000000 +0800
+++ nginx-1.1.4-patched/src/core/ngx_palloc.h 2011-09-13 12:11:03.155622101 +0800
@@ -38,6 +38,7 @@
typedef struct ngx_pool_large_s ngx_pool_large_t;
+typedef struct ngx_pool_data_s ngx_pool_data_t;
struct ngx_pool_large_s {
ngx_pool_large_t *next;
@@ -45,16 +46,15 @@
};
-typedef struct {
- u_char *last;
- u_char *end;
- ngx_pool_t *next;
- ngx_uint_t failed;
-} ngx_pool_data_t;
+struct ngx_pool_data_s{
+ ngx_pool_data_t *next;
+ ngx_pool_data_t *prev;
+ void *alloc;
+};
struct ngx_pool_s {
- ngx_pool_data_t d;
+ ngx_pool_data_t *d;
size_t max;
ngx_pool_t *current;
ngx_chain_t *chain;

View File

@ -0,0 +1,17 @@
# HG changeset patch
# User Maxim Dounin <mdounin@mdounin.ru>
# Date 1309776931 -14400
# Node ID e7b2f945d55ae44a2295facf9e3336dc4633e5b5
# Parent 610e909bb9e29766188aa86fae3abe0bd3432940
Core: fix body if it's preread and there are extra data.
--- nginx-1.1.4/src/http/ngx_http_request_body.c 2011-07-05 12:11:21.619264633 +0800
+++ nginx-1.1.4-patched/src/http/ngx_http_request_body.c 2011-07-05 12:14:30.694321554 +0800
@@ -141,6 +141,7 @@
/* the whole request body was pre-read */
+ b->last = b->pos + r->headers_in.content_length_n;
r->header_in->pos += (size_t) r->headers_in.content_length_n;
r->request_length += r->headers_in.content_length_n;

View File

@ -0,0 +1,26 @@
diff -ur lz-nginx-1.1.4/nginx-1.1.4/src/core/nginx.h lz-nginx-1.1.4-patched/nginx-1.1.4/src/core/nginx.h
--- lz-nginx-1.1.4/nginx-1.1.4/src/core/nginx.h 2010-02-12 17:31:01.000000000 +0800
+++ lz-nginx-1.1.4-patched/nginx-1.1.4/src/core/nginx.h 2010-03-30 10:52:13.240702627 +0800
@@ -10,7 +10,7 @@
#define nginx_version 1001004
#define NGINX_VERSION "1.1.4"
-#define NGINX_VER "nginx/" NGINX_VERSION
+#define NGINX_VER "ngx_openresty/" NGINX_VERSION ".unknown"
#define NGINX_VAR "NGINX"
#define NGX_OLDPID_EXT ".oldbin"
Only in lz-nginx-1.1.4-patched/nginx-1.1.4/src/core: nginx.h.orig
Only in lz-nginx-1.1.4-patched/nginx-1.1.4/src/core: nginx.h.rej
diff -ur lz-nginx-1.1.4/nginx-1.1.4/src/http/ngx_http_header_filter_module.c lz-nginx-1.1.4-patched/nginx-1.1.4/src/http/ngx_http_header_filter_module.c
--- lz-nginx-1.1.4/nginx-1.1.4/src/http/ngx_http_header_filter_module.c 2010-03-03 23:14:04.000000000 +0800
+++ lz-nginx-1.1.4-patched/nginx-1.1.4/src/http/ngx_http_header_filter_module.c 2010-03-30 10:52:53.670909405 +0800
@@ -45,7 +45,7 @@
};
-static char ngx_http_server_string[] = "Server: nginx" CRLF;
+static char ngx_http_server_string[] = "Server: ngx_openresty" CRLF;
static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;

View File

@ -0,0 +1,40 @@
# HG changeset patch
# User Maxim Dounin <mdounin@mdounin.ru>
# Date 1309187571 -14400
# Node ID 283a416b2235d5383c12a975edc8866f007fb628
# Parent f5fc40783ddcbf4db33859ee2a9bce54cf32c350
Core: protect from subrequest loops.
Without protection subrequest loop results in r->count overflow and
SIGSEGV. Protection was broken in 0.7.25.
Note that this also limits number of parallel subrequests. This
wasn't exactly the case before 0.7.25 as local subrequests were
completed directly.
See here for details:
http://nginx.org/pipermail/nginx-ru/2010-February/032184.html
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
--- a/src/http/ngx_http_core_module.c
+++ b/src/http/ngx_http_core_module.c
@@ -2287,7 +2287,6 @@ ngx_http_subrequest(ngx_http_request_t *
sr->start_sec = tp->sec;
sr->start_msec = tp->msec;
- r->main->subrequests++;
r->main->count++;
*psr = sr;
diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c
--- a/src/http/ngx_http_request.c
+++ b/src/http/ngx_http_request.c
@@ -1981,6 +1981,7 @@ ngx_http_finalize_request(ngx_http_reque
if (r == c->data) {
r->main->count--;
+ r->main->subrequests++;
if (!r->logged) {

View File

@ -0,0 +1,21 @@
--- nginx-1.1.5/src/event/modules/ngx_epoll_module.c 2011-09-30 22:12:53.000000000 +0800
+++ nginx-1.1.5-patched/src/event/modules/ngx_epoll_module.c 2011-11-07 18:07:04.764111952 +0800
@@ -681,6 +681,18 @@
wev = c->write;
+ if (c->fd == -1 || wev->instance != instance) {
+
+ /*
+ * the stale event from a file descriptor
+ * that was just closed in this iteration
+ */
+
+ ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
+ "epoll: stale event %p", c);
+ continue;
+ }
+
if ((revents & EPOLLOUT) && wev->active) {
if (flags & NGX_POST_THREAD_EVENTS) {

View File

@ -0,0 +1,69 @@
# HG changeset patch
# User Maxim Dounin <mdounin@mdounin.ru>
# Date 1315324342 -14400
# Node ID 4cf0af103bc382a78f894302d1706929a79df4bb
# Parent d603ce98fada855f0100b422b7b5672fd22fabea
Gzip filter: handle empty flush buffers.
Empty flush buffers are legitimate and may happen e.g. due to $r->flush()
calls in embedded perl. If there are no data buffered in zlib deflate()
will return Z_BUF_ERROR (i.e. no progress possible) without adding anything
to output. Don't treat Z_BUF_ERROR as fatal and correctly send empty flush
buffer if we have no data in output at all.
See this thread for details:
http://mailman.nginx.org/pipermail/nginx/2010-November/023693.html
diff --git a/src/http/modules/ngx_http_gzip_filter_module.c b/src/http/modules/ngx_http_gzip_filter_module.c
--- a/src/http/modules/ngx_http_gzip_filter_module.c
+++ b/src/http/modules/ngx_http_gzip_filter_module.c
@@ -758,6 +758,7 @@ static ngx_int_t
ngx_http_gzip_filter_deflate(ngx_http_request_t *r, ngx_http_gzip_ctx_t *ctx)
{
int rc;
+ ngx_buf_t *b;
ngx_chain_t *cl;
ngx_http_gzip_conf_t *conf;
@@ -769,7 +770,7 @@ ngx_http_gzip_filter_deflate(ngx_http_re
rc = deflate(&ctx->zstream, ctx->flush);
- if (rc != Z_OK && rc != Z_STREAM_END) {
+ if (rc != Z_OK && rc != Z_STREAM_END && rc != Z_BUF_ERROR) {
ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
"deflate() failed: %d, %d", ctx->flush, rc);
return NGX_ERROR;
@@ -818,8 +819,6 @@ ngx_http_gzip_filter_deflate(ngx_http_re
if (ctx->flush == Z_SYNC_FLUSH) {
- ctx->zstream.avail_out = 0;
- ctx->out_buf->flush = 1;
ctx->flush = Z_NO_FLUSH;
cl = ngx_alloc_chain_link(r->pool);
@@ -827,7 +826,22 @@ ngx_http_gzip_filter_deflate(ngx_http_re
return NGX_ERROR;
}
- cl->buf = ctx->out_buf;
+ b = ctx->out_buf;
+
+ if (ngx_buf_size(b) == 0) {
+
+ b = ngx_calloc_buf(ctx->request->pool);
+ if (b == NULL) {
+ return NGX_ERROR;
+ }
+
+ } else {
+ ctx->zstream.avail_out = 0;
+ }
+
+ b->flush = 1;
+
+ cl->buf = b;
cl->next = NULL;
*ctx->last_out = cl;
ctx->last_out = &cl->next;

View File

@ -0,0 +1,24 @@
diff -ur nginx-1.1.5/auto/cc/gcc nginx-1.1.5-patched/auto/cc/gcc
--- nginx-1.1.5/auto/cc/gcc 2011-06-27 19:53:00.205737804 +0800
+++ nginx-1.1.5-patched/auto/cc/gcc 2011-06-27 19:53:13.837741087 +0800
@@ -169,7 +169,7 @@
# stop on warning
-CFLAGS="$CFLAGS -Werror"
+#CFLAGS="$CFLAGS -Werror"
# debug
CFLAGS="$CFLAGS -g"
diff -ur nginx-1.1.5/auto/cc/icc nginx-1.1.5-patched/auto/cc/icc
--- nginx-1.1.5/auto/cc/icc 2011-06-27 19:52:56.370157068 +0800
+++ nginx-1.1.5-patched/auto/cc/icc 2011-06-27 19:53:19.508916811 +0800
@@ -139,7 +139,7 @@
esac
# stop on warning
-CFLAGS="$CFLAGS -Werror"
+#CFLAGS="$CFLAGS -Werror"
# debug
CFLAGS="$CFLAGS -g"

View File

@ -0,0 +1,90 @@
--- nginx-1.1.5/src/http/ngx_http_core_module.c 2010-12-14 18:38:42.000000000 +0800
+++ nginx-1.1.5-patched/src/http/ngx_http_core_module.c 2011-01-30 19:24:34.956354518 +0800
@@ -57,6 +57,8 @@
void *conf);
static char *ngx_http_core_error_page(ngx_conf_t *cf, ngx_command_t *cmd,
void *conf);
+static char *ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd,
+ void *conf);
static char *ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd,
void *conf);
static char *ngx_http_core_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd,
@@ -614,6 +616,14 @@
0,
NULL },
+ { ngx_string("no_error_pages"),
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
+ |NGX_CONF_NOARGS,
+ ngx_http_core_no_error_pages,
+ NGX_HTTP_LOC_CONF_OFFSET,
+ 0,
+ NULL },
+
{ ngx_string("try_files"),
NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_2MORE,
ngx_http_core_try_files,
@@ -3052,7 +3062,6 @@
* clcf->types = NULL;
* clcf->default_type = { 0, NULL };
* clcf->error_log = NULL;
- * clcf->error_pages = NULL;
* clcf->try_files = NULL;
* clcf->client_body_path = NULL;
* clcf->regex = NULL;
@@ -3062,6 +3071,7 @@
* clcf->gzip_proxied = 0;
*/
+ clcf->error_pages = NGX_CONF_UNSET_PTR;
clcf->client_max_body_size = NGX_CONF_UNSET;
clcf->client_body_buffer_size = NGX_CONF_UNSET_SIZE;
clcf->client_body_timeout = NGX_CONF_UNSET_MSEC;
@@ -3250,9 +3260,7 @@
}
}
- if (conf->error_pages == NULL && prev->error_pages) {
- conf->error_pages = prev->error_pages;
- }
+ ngx_conf_merge_ptr_value(conf->error_pages, prev->error_pages, NULL);
ngx_conf_merge_str_value(conf->default_type,
prev->default_type, "text/plain");
@@ -3988,6 +3996,10 @@
ngx_http_compile_complex_value_t ccv;
if (clcf->error_pages == NULL) {
+ return "conflicts with \"no_error_pages\"";
+ }
+
+ if (clcf->error_pages == NGX_CONF_UNSET_PTR) {
clcf->error_pages = ngx_array_create(cf->pool, 4,
sizeof(ngx_http_err_page_t));
if (clcf->error_pages == NULL) {
@@ -4095,6 +4107,25 @@
static char *
+ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
+{
+ ngx_http_core_loc_conf_t *clcf = conf;
+
+ if (clcf->error_pages == NULL) {
+ return "is duplicate";
+ }
+
+ if (clcf->error_pages != NGX_CONF_UNSET_PTR) {
+ return "conflicts with \"error_page\"";
+ }
+
+ clcf->error_pages = NULL;
+
+ return NGX_CONF_OK;
+}
+
+
+static char *
ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
ngx_http_core_loc_conf_t *clcf = conf;

View File

@ -0,0 +1,504 @@
diff -ur nginx-1.1.5/src/core/nginx.h nginx-1.1.5-patched/src/core/nginx.h
--- nginx-1.1.5/src/core/nginx.h 2011-08-29 17:30:22.000000000 +0800
+++ nginx-1.1.5-patched/src/core/nginx.h 2011-09-13 12:11:03.135622101 +0800
@@ -10,7 +10,7 @@
#define nginx_version 1001005
#define NGINX_VERSION "1.1.5"
-#define NGINX_VER "ngx_openresty/" NGINX_VERSION ".unknown"
+#define NGINX_VER "ngx_openresty/" NGINX_VERSION ".unknown (no pool)"
#define NGINX_VAR "NGINX"
diff -ur nginx-1.1.5/src/core/ngx_array.c nginx-1.1.5-patched/src/core/ngx_array.c
--- nginx-1.1.5/src/core/ngx_array.c 2008-06-17 23:00:30.000000000 +0800
+++ nginx-1.1.5-patched/src/core/ngx_array.c 2011-09-14 12:02:56.263128538 +0800
@@ -39,13 +39,7 @@
p = a->pool;
- if ((u_char *) a->elts + a->size * a->nalloc == p->d.last) {
- p->d.last -= a->size * a->nalloc;
- }
-
- if ((u_char *) a + sizeof(ngx_array_t) == p->d.last) {
- p->d.last = (u_char *) a;
- }
+ ngx_pfree(p, a);
}
@@ -64,29 +58,17 @@
p = a->pool;
- if ((u_char *) a->elts + size == p->d.last
- && p->d.last + a->size <= p->d.end)
- {
- /*
- * the array allocation is the last in the pool
- * and there is space for new allocation
- */
-
- p->d.last += a->size;
- a->nalloc++;
-
- } else {
- /* allocate a new array */
-
- new = ngx_palloc(p, 2 * size);
- if (new == NULL) {
- return NULL;
- }
-
- ngx_memcpy(new, a->elts, size);
- a->elts = new;
- a->nalloc *= 2;
+ /* allocate a new array */
+
+ new = ngx_palloc(p, 2 * size);
+ if (new == NULL) {
+ return NULL;
}
+
+ ngx_memcpy(new, a->elts, size);
+ a->elts = new;
+ a->nalloc *= 2;
+
}
elt = (u_char *) a->elts + a->size * a->nelts;
@@ -100,43 +82,25 @@
ngx_array_push_n(ngx_array_t *a, ngx_uint_t n)
{
void *elt, *new;
- size_t size;
ngx_uint_t nalloc;
ngx_pool_t *p;
- size = n * a->size;
-
if (a->nelts + n > a->nalloc) {
/* the array is full */
p = a->pool;
- if ((u_char *) a->elts + a->size * a->nalloc == p->d.last
- && p->d.last + size <= p->d.end)
- {
- /*
- * the array allocation is the last in the pool
- * and there is space for new allocation
- */
-
- p->d.last += size;
- a->nalloc += n;
-
- } else {
- /* allocate a new array */
-
- nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);
-
- new = ngx_palloc(p, nalloc * a->size);
- if (new == NULL) {
- return NULL;
- }
-
- ngx_memcpy(new, a->elts, a->nelts * a->size);
- a->elts = new;
- a->nalloc = nalloc;
+ nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);
+
+ new = ngx_palloc(p, nalloc * a->size);
+ if (new == NULL) {
+ return NULL;
}
+
+ ngx_memcpy(new, a->elts, a->nelts * a->size);
+ a->elts = new;
+ a->nalloc = nalloc;
}
elt = (u_char *) a->elts + a->size * a->nelts;
diff -ur nginx-1.1.5/src/core/ngx_palloc.c nginx-1.1.5-patched/src/core/ngx_palloc.c
--- nginx-1.1.5/src/core/ngx_palloc.c 2009-12-17 20:25:46.000000000 +0800
+++ nginx-1.1.5-patched/src/core/ngx_palloc.c 2011-09-14 12:03:41.663126519 +0800
@@ -8,24 +8,31 @@
#include <ngx_core.h>
-static void *ngx_palloc_block(ngx_pool_t *pool, size_t size);
static void *ngx_palloc_large(ngx_pool_t *pool, size_t size);
ngx_pool_t *
ngx_create_pool(size_t size, ngx_log_t *log)
{
- ngx_pool_t *p;
+ ngx_pool_t *p;
+ ngx_pool_data_t *d;
- p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);
+ size = sizeof(ngx_pool_t);
+ p = ngx_alloc(size, log);
if (p == NULL) {
return NULL;
}
- p->d.last = (u_char *) p + sizeof(ngx_pool_t);
- p->d.end = (u_char *) p + size;
- p->d.next = NULL;
- p->d.failed = 0;
+ d = ngx_alloc(sizeof(ngx_pool_data_t), log);
+
+ if (d == NULL) {
+ return NULL;
+ }
+
+ d->next = d;
+ d->prev = d;
+ d->alloc = NULL;
+ p->d = d;
size = size - sizeof(ngx_pool_t);
p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;
@@ -43,7 +50,7 @@
void
ngx_destroy_pool(ngx_pool_t *pool)
{
- ngx_pool_t *p, *n;
+ ngx_pool_data_t *d, *n;
ngx_pool_large_t *l;
ngx_pool_cleanup_t *c;
@@ -55,7 +62,7 @@
}
}
- for (l = pool->large; l; l = l->next) {
+ for (l = pool->large; l ; l = l->next) {
ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);
@@ -71,34 +78,45 @@
* so we can not use this log while the free()ing the pool
*/
- for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {
+ for (d = pool->d, n = d->next; ; d = n, n = n->next) {
ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
- "free: %p, unused: %uz", p, p->d.end - p->d.last);
+ "free: %p", d);
- if (n == NULL) {
+ if (n == pool->d) {
break;
}
}
#endif
+ if (pool->d->next == pool->d) {
+ ngx_free(pool->d);
+ } else {
+ for (d = pool->d, n = d->next; ; d = n, n = n->next) {
+ if (d->alloc) {
+ ngx_free(d->alloc);
+ }
+ ngx_free(d);
- for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {
- ngx_free(p);
-
- if (n == NULL) {
- break;
+ if (n == pool->d) {
+ break;
+ }
}
}
+
+ ngx_free(pool);
}
void
ngx_reset_pool(ngx_pool_t *pool)
{
- ngx_pool_t *p;
- ngx_pool_large_t *l;
+ ngx_pool_data_t *p, *tmp;
+ ngx_pool_large_t *l;
+
+ for (l = pool->large; l ; l = l->next) {
+
+ ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);
- for (l = pool->large; l; l = l->next) {
if (l->alloc) {
ngx_free(l->alloc);
}
@@ -106,109 +124,65 @@
pool->large = NULL;
- for (p = pool; p; p = p->d.next) {
- p->d.last = (u_char *) p + sizeof(ngx_pool_t);
+ p = pool->d->next;
+ while (p != pool->d) {
+ tmp = p;
+ ngx_free(p->alloc);
+ p->prev->next = p->next;
+ p->next->prev = p->prev;
+ p = p->next;
+ ngx_free(tmp);
}
-}
+ ngx_free(pool->d->alloc);
+ pool->d->alloc = NULL;
+
+}
void *
-ngx_palloc(ngx_pool_t *pool, size_t size)
+ngx_malloc(ngx_pool_t *pool, size_t size)
{
- u_char *m;
- ngx_pool_t *p;
-
- if (size <= pool->max) {
+ ngx_pool_data_t *new;
+ void *m;
- p = pool->current;
-
- do {
- m = ngx_align_ptr(p->d.last, NGX_ALIGNMENT);
-
- if ((size_t) (p->d.end - m) >= size) {
- p->d.last = m + size;
-
- return m;
- }
-
- p = p->d.next;
-
- } while (p);
+ m = ngx_alloc(size, pool->log);
+ if (m == NULL) {
+ return NULL;
+ }
- return ngx_palloc_block(pool, size);
+ new = ngx_alloc(sizeof(ngx_pool_data_t), pool->log);
+ if (new == NULL){
+ ngx_free(m);
+ return NULL;
}
- return ngx_palloc_large(pool, size);
+ new->alloc = m;
+ new->next = pool->d;
+ new->prev = pool->d->prev;
+ pool->d->prev->next = new;
+ pool->d->prev = new;
+ return m;
}
-
void *
-ngx_pnalloc(ngx_pool_t *pool, size_t size)
+ngx_palloc(ngx_pool_t *pool, size_t size)
{
- u_char *m;
- ngx_pool_t *p;
-
- if (size <= pool->max) {
-
- p = pool->current;
-
- do {
- m = p->d.last;
-
- if ((size_t) (p->d.end - m) >= size) {
- p->d.last = m + size;
-
- return m;
- }
-
- p = p->d.next;
-
- } while (p);
-
- return ngx_palloc_block(pool, size);
+ if (size <= 1024) {
+ return ngx_malloc(pool, size);
}
return ngx_palloc_large(pool, size);
}
-static void *
-ngx_palloc_block(ngx_pool_t *pool, size_t size)
+void *
+ngx_pnalloc(ngx_pool_t *pool, size_t size)
{
- u_char *m;
- size_t psize;
- ngx_pool_t *p, *new, *current;
-
- psize = (size_t) (pool->d.end - (u_char *) pool);
-
- m = ngx_memalign(NGX_POOL_ALIGNMENT, psize, pool->log);
- if (m == NULL) {
- return NULL;
- }
-
- new = (ngx_pool_t *) m;
-
- new->d.end = m + psize;
- new->d.next = NULL;
- new->d.failed = 0;
-
- m += sizeof(ngx_pool_data_t);
- m = ngx_align_ptr(m, NGX_ALIGNMENT);
- new->d.last = m + size;
-
- current = pool->current;
-
- for (p = current; p->d.next; p = p->d.next) {
- if (p->d.failed++ > 4) {
- current = p->d.next;
- }
+ if (size <= 1024) {
+ return ngx_malloc(pool, size);
}
- p->d.next = new;
-
- pool->current = current ? current : new;
-
- return m;
+ return ngx_palloc_large(pool, size);
}
@@ -216,7 +190,6 @@
ngx_palloc_large(ngx_pool_t *pool, size_t size)
{
void *p;
- ngx_uint_t n;
ngx_pool_large_t *large;
p = ngx_alloc(size, pool->log);
@@ -224,20 +197,7 @@
return NULL;
}
- n = 0;
-
- for (large = pool->large; large; large = large->next) {
- if (large->alloc == NULL) {
- large->alloc = p;
- return p;
- }
-
- if (n++ > 3) {
- break;
- }
- }
-
- large = ngx_palloc(pool, sizeof(ngx_pool_large_t));
+ large = ngx_malloc(pool, sizeof(ngx_pool_large_t));
if (large == NULL) {
ngx_free(p);
return NULL;
@@ -262,7 +222,7 @@
return NULL;
}
- large = ngx_palloc(pool, sizeof(ngx_pool_large_t));
+ large = ngx_malloc(pool, sizeof(ngx_pool_large_t));
if (large == NULL) {
ngx_free(p);
return NULL;
@@ -279,17 +239,41 @@
ngx_int_t
ngx_pfree(ngx_pool_t *pool, void *p)
{
- ngx_pool_large_t *l;
+ ngx_pool_large_t *l;
+ ngx_pool_large_t *ll;
+ ngx_pool_data_t *d, *n;
- for (l = pool->large; l; l = l->next) {
+ for (l = pool->large, ll = l; l; ll = l, l = l->next) {
if (p == l->alloc) {
ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
"free: %p", l->alloc);
ngx_free(l->alloc);
l->alloc = NULL;
+ if (l == pool->large) {
+ pool->large = NULL;
+ }
+
+ ll->next = l->next;
+ p = l;
+ break;
+ }
+ }
+ for (d = pool->d, n = d->next; ; d = n, n = d->next) {
+ if (p == d->alloc) {
+ ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", d->alloc);
+ if (d->alloc) {
+ ngx_free(d->alloc);
+ }
+ d->alloc = NULL;
+ d->prev->next = d->next;
+ d->next->prev = d->prev;
+ ngx_free(d);
return NGX_OK;
}
+ if (d->next == pool->d) {
+ break;
+ }
}
return NGX_DECLINED;
diff -ur nginx-1.1.5/src/core/ngx_palloc.h nginx-1.1.5-patched/src/core/ngx_palloc.h
--- nginx-1.1.5/src/core/ngx_palloc.h 2009-12-17 20:25:46.000000000 +0800
+++ nginx-1.1.5-patched/src/core/ngx_palloc.h 2011-09-13 12:11:03.155622101 +0800
@@ -38,6 +38,7 @@
typedef struct ngx_pool_large_s ngx_pool_large_t;
+typedef struct ngx_pool_data_s ngx_pool_data_t;
struct ngx_pool_large_s {
ngx_pool_large_t *next;
@@ -45,16 +46,15 @@
};
-typedef struct {
- u_char *last;
- u_char *end;
- ngx_pool_t *next;
- ngx_uint_t failed;
-} ngx_pool_data_t;
+struct ngx_pool_data_s{
+ ngx_pool_data_t *next;
+ ngx_pool_data_t *prev;
+ void *alloc;
+};
struct ngx_pool_s {
- ngx_pool_data_t d;
+ ngx_pool_data_t *d;
size_t max;
ngx_pool_t *current;
ngx_chain_t *chain;

View File

@ -0,0 +1,27 @@
# HG changeset patch
# User Maxim Dounin <mdounin@mdounin.ru>
# Date 1309799136 -14400
# Node ID 99e276bba8596bc4df9e638482ee413f4c6bf700
# Parent e7b2f945d55ae44a2295facf9e3336dc4633e5b5
Core: fix body with request_body_in_single_buf.
If there were preread data and request body was big enough first part
of request body was duplicated.
See report here:
http://nginx.org/pipermail/nginx/2011-July/027756.html
diff --git a/src/http/ngx_http_request_body.c b/src/http/ngx_http_request_body.c
--- a/src/http/ngx_http_request_body.c
+++ b/src/http/ngx_http_request_body.c
@@ -372,7 +372,9 @@ ngx_http_do_read_client_request_body(ngx
}
}
- if (r->request_body_in_file_only && rb->bufs->next) {
+ if (rb->bufs->next
+ && (r->request_body_in_file_only || r->request_body_in_single_buf))
+ {
rb->bufs = rb->bufs->next;
}

View File

@ -0,0 +1,17 @@
# HG changeset patch
# User Maxim Dounin <mdounin@mdounin.ru>
# Date 1309776931 -14400
# Node ID e7b2f945d55ae44a2295facf9e3336dc4633e5b5
# Parent 610e909bb9e29766188aa86fae3abe0bd3432940
Core: fix body if it's preread and there are extra data.
--- nginx-1.1.5/src/http/ngx_http_request_body.c 2011-07-05 12:11:21.619264633 +0800
+++ nginx-1.1.5-patched/src/http/ngx_http_request_body.c 2011-07-05 12:14:30.694321554 +0800
@@ -141,6 +141,7 @@
/* the whole request body was pre-read */
+ b->last = b->pos + r->headers_in.content_length_n;
r->header_in->pos += (size_t) r->headers_in.content_length_n;
r->request_length += r->headers_in.content_length_n;

View File

@ -0,0 +1,26 @@
diff -ur lz-nginx-1.1.5/nginx-1.1.5/src/core/nginx.h lz-nginx-1.1.5-patched/nginx-1.1.5/src/core/nginx.h
--- lz-nginx-1.1.5/nginx-1.1.5/src/core/nginx.h 2010-02-12 17:31:01.000000000 +0800
+++ lz-nginx-1.1.5-patched/nginx-1.1.5/src/core/nginx.h 2010-03-30 10:52:13.240702627 +0800
@@ -10,7 +10,7 @@
#define nginx_version 1001005
#define NGINX_VERSION "1.1.5"
-#define NGINX_VER "nginx/" NGINX_VERSION
+#define NGINX_VER "ngx_openresty/" NGINX_VERSION ".unknown"
#define NGINX_VAR "NGINX"
#define NGX_OLDPID_EXT ".oldbin"
Only in lz-nginx-1.1.5-patched/nginx-1.1.5/src/core: nginx.h.orig
Only in lz-nginx-1.1.5-patched/nginx-1.1.5/src/core: nginx.h.rej
diff -ur lz-nginx-1.1.5/nginx-1.1.5/src/http/ngx_http_header_filter_module.c lz-nginx-1.1.5-patched/nginx-1.1.5/src/http/ngx_http_header_filter_module.c
--- lz-nginx-1.1.5/nginx-1.1.5/src/http/ngx_http_header_filter_module.c 2010-03-03 23:14:04.000000000 +0800
+++ lz-nginx-1.1.5-patched/nginx-1.1.5/src/http/ngx_http_header_filter_module.c 2010-03-30 10:52:53.670909405 +0800
@@ -45,7 +45,7 @@
};
-static char ngx_http_server_string[] = "Server: nginx" CRLF;
+static char ngx_http_server_string[] = "Server: ngx_openresty" CRLF;
static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;

View File

@ -0,0 +1,40 @@
# HG changeset patch
# User Maxim Dounin <mdounin@mdounin.ru>
# Date 1309187571 -14400
# Node ID 283a416b2235d5383c12a975edc8866f007fb628
# Parent f5fc40783ddcbf4db33859ee2a9bce54cf32c350
Core: protect from subrequest loops.
Without protection subrequest loop results in r->count overflow and
SIGSEGV. Protection was broken in 0.7.25.
Note that this also limits number of parallel subrequests. This
wasn't exactly the case before 0.7.25 as local subrequests were
completed directly.
See here for details:
http://nginx.org/pipermail/nginx-ru/2010-February/032184.html
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
--- a/src/http/ngx_http_core_module.c
+++ b/src/http/ngx_http_core_module.c
@@ -2287,7 +2287,6 @@ ngx_http_subrequest(ngx_http_request_t *
sr->start_sec = tp->sec;
sr->start_msec = tp->msec;
- r->main->subrequests++;
r->main->count++;
*psr = sr;
diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c
--- a/src/http/ngx_http_request.c
+++ b/src/http/ngx_http_request.c
@@ -1981,6 +1981,7 @@ ngx_http_finalize_request(ngx_http_reque
if (r == c->data) {
r->main->count--;
+ r->main->subrequests++;
if (!r->logged) {

View File

@ -0,0 +1,73 @@
--- nginx-1.1.5/src/http/ngx_http_variables.c 2011-05-30 20:36:17.000000000 +0800
+++ nginx-1.1.5-patched/src/http/ngx_http_variables.c 2011-11-08 22:21:55.229247198 +0800
@@ -648,7 +648,17 @@
a = (ngx_array_t *) ((char *) r + data);
- n = a->nelts;
+ h = a->elts;
+ n = 0;
+
+ for (i = 0; i < a->nelts; i++) {
+
+ if (h[i]->hash == 0) {
+ continue;
+ }
+
+ n++;
+ }
if (n == 0) {
v->not_found = 1;
@@ -659,9 +669,7 @@
v->no_cacheable = 0;
v->not_found = 0;
- h = a->elts;
-
- if (n == 1) {
+ if (n == 1 && a->nelts == 1) {
v->len = (*h)->value.len;
v->data = (*h)->value.data;
@@ -670,7 +678,12 @@
len = - (ssize_t) (sizeof("; ") - 1);
- for (i = 0; i < n; i++) {
+ for (i = 0; i < a->nelts; i++) {
+
+ if (h[i]->hash == 0) {
+ continue;
+ }
+
len += h[i]->value.len + sizeof("; ") - 1;
}
@@ -683,9 +696,14 @@
v->data = p;
for (i = 0; /* void */ ; i++) {
+
+ if (h[i]->hash == 0) {
+ continue;
+ }
+
p = ngx_copy(p, h[i]->value.data, h[i]->value.len);
- if (i == n - 1) {
+ if (--n == 0) {
break;
}
@@ -738,6 +756,10 @@
i = 0;
}
+ if (header[i].hash == 0) {
+ continue;
+ }
+
for (n = 0; n + prefix < var->len && n < header[i].key.len; n++) {
ch = header[i].key.data[n];

File diff suppressed because it is too large Load Diff

2
util/configure vendored
View File

@ -59,7 +59,6 @@ my @modules = (
[http_iconv => 'iconv-nginx-module', 'disabled'],
[http_echo => 'echo-nginx-module'],
[http_xss => 'xss-nginx-module'],
[http_coolkit => 'ngx_coolkit'],
[http_set_misc => 'set-misc-nginx-module'],
[http_form_input => 'form-input-nginx-module'],
[http_encrypted_session => 'encrypted-session-nginx-module'],
@ -71,7 +70,6 @@ my @modules = (
[http_array_var => 'array-var-nginx-module'],
[http_memc => 'memc-nginx-module'],
[http_redis2 => 'redis2-nginx-module'],
[http_upstream_keepalive => 'upstream-keepalive-nginx-module'],
[http_auth_request => 'auth-request-nginx-module'],
[http_rds_json => 'rds-json-nginx-module'],
[http_rds_csv => 'rds-csv-nginx-module'],

View File

@ -46,9 +46,9 @@ patch -p1 -l < $root/patches/nginx-$main_ver-subrequest_loop.patch || exit 1
patch -p1 -l < $root/patches/nginx-$main_ver-gzip_empty_flush_buf.patch || exit 1
patch -p1 < $root/patches/nginx-$main_ver-variable_header_ignore_no_hash.patch || exit 1
#patch -p1 < $root/patches/nginx-$main_ver-variable_header_ignore_no_hash.patch || exit 1
patch -p1 < $root/patches/nginx-$main_ver-named_location_clear_mods_ctx.patch || exit 1
#patch -p1 < $root/patches/nginx-$main_ver-named_location_clear_mods_ctx.patch || exit 1
patch -p1 < $root/patches/nginx-$main_ver-allow_request_body_updating.patch || exit 1
@ -111,7 +111,7 @@ mv chaoslawful-drizzle-nginx-module-* drizzle-nginx-module-$ver || exit 1
#################################
ver=0.5.0rc7
ver=0.4.1rc3
$root/util/get-tarball "http://github.com/chaoslawful/lua-nginx-module/tarball/v$ver" -O lua-nginx-module-$ver.tar.gz || exit 1
tar -xzf lua-nginx-module-$ver.tar.gz || exit 1
mv chaoslawful-lua-nginx-module-* ngx_lua-$ver || exit 1
@ -160,14 +160,6 @@ mv agentzh-encrypted-session-nginx-module-* encrypted-session-nginx-module-$ver
#################################
ver=0.7
$root/util/get-tarball "http://mdounin.ru/files/ngx_http_upstream_keepalive-$ver.tar.gz" -O upstream_keepalive-$ver.tar.gz || exit 1
tar -xzf upstream_keepalive-$ver.tar.gz || exit 1
mv ngx_http_upstream_keepalive-* upstream-keepalive-nginx-module-$ver || exit 1
#################################
ver=0.2
$root/util/get-tarball "http://mdounin.ru/files/ngx_http_auth_request_module-$ver.tar.gz" -O auth_request-$ver.tar.gz || exit 1
tar -xzf auth_request-$ver.tar.gz || exit 1
@ -175,20 +167,13 @@ mv ngx_http_auth_request_module-* auth-request-nginx-module-$ver || exit 1
#################################
ver=0.9
ver=0.9rc2
$root/util/get-tarball "https://github.com/FRiCKLE/ngx_postgres/tarball/$ver" -O ngx_postgres-$ver.tar.gz || exit 1
tar -xzf ngx_postgres-$ver.tar.gz || exit 1
mv FRiCKLE-ngx_postgres-* ngx_postgres-$ver || exit 1
#################################
ver=0.2rc1
$root/util/get-tarball "https://github.com/FRiCKLE/ngx_coolkit/tarball/$ver" -O ngx_coolkit-$ver.tar.gz || exit 1
tar -xzf ngx_coolkit-$ver.tar.gz || exit 1
mv FRiCKLE-ngx_coolkit-* ngx_coolkit-$ver || exit 1
#################################
ver=0.08rc2
$root/util/get-tarball "http://github.com/agentzh/redis2-nginx-module/tarball/v$ver" -O redis2-nginx-module-$ver.tar.gz || exit 1
tar -xzf redis2-nginx-module-$ver.tar.gz || exit 1
@ -238,7 +223,7 @@ cd ..
#################################
ver=0.09rc6
ver=0.09rc5
$root/util/get-tarball "http://github.com/agentzh/lua-redis-parser/tarball/v$ver" -O "lua-redis-parser-$ver.tar.gz" || exit 1
tar -xzf lua-redis-parser-$ver.tar.gz || exit 1
mv agentzh-lua-redis-parser-* lua-redis-parser-$ver || exit 1

View File

@ -1,7 +1,7 @@
#!/bin/bash
main_ver=1.0.11
minor_ver=11
main_ver=1.1.13
minor_ver=1
version=$main_ver.$minor_ver
echo $version