summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2006-04-21 12:03:18 +0000
committerJonathan Kolb <jon@b0g.us>2006-04-21 12:03:18 +0000
commit984cc0392183bbe02dad30645691f34917b8d78b (patch)
tree318259a5fb9ae7be488084e1d92479c5936999e4
parent89fe162fb79c6c3e8c28a4f5a41b2cb2391468da (diff)
downloadnginx-984cc0392183bbe02dad30645691f34917b8d78b.tar.gz
Changes with nginx 0.3.41 21 Apr 2006v0.3.41
*) Feature: the -v switch. *) Bugfix: the segmentation fault may occurred if the SSI page has remote subrequests. *) Bugfix: in FastCGI handling. *) Bugfix: if the perl modules path was not set using --with-perl_modules_path=PATH or the "perl_modules", then the segmentation fault was occurred.
-rw-r--r--CHANGES14
-rw-r--r--CHANGES.ru14
-rw-r--r--src/core/nginx.c19
-rw-r--r--src/core/nginx.h2
-rw-r--r--src/core/ngx_log.c2
-rw-r--r--src/http/modules/ngx_http_dav_module.c6
-rw-r--r--src/http/modules/ngx_http_fastcgi_module.c9
-rw-r--r--src/http/modules/ngx_http_static_module.c8
-rw-r--r--src/http/modules/perl/ngx_http_perl_module.c6
-rw-r--r--src/http/ngx_http_parse.c16
-rw-r--r--src/http/ngx_http_request.c24
-rw-r--r--src/os/unix/ngx_shmem.c12
12 files changed, 96 insertions, 36 deletions
diff --git a/CHANGES b/CHANGES
index f0cbd9673..f37bb4a3f 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,4 +1,18 @@
+Changes with nginx 0.3.41 21 Apr 2006
+
+ *) Feature: the -v switch.
+
+ *) Bugfix: the segmentation fault may occurred if the SSI page has
+ remote subrequests.
+
+ *) Bugfix: in FastCGI handling.
+
+ *) Bugfix: if the perl modules path was not set using
+ --with-perl_modules_path=PATH or the "perl_modules", then the
+ segmentation fault was occurred.
+
+
Changes with nginx 0.3.40 19 Apr 2006
*) Feature: the ngx_http_dav_module supports the MKCOL method.
diff --git a/CHANGES.ru b/CHANGES.ru
index 0d998e001..f3d850b3c 100644
--- a/CHANGES.ru
+++ b/CHANGES.ru
@@ -1,4 +1,18 @@
+Изменения в nginx 0.3.41 21.04.2006
+
+ *) Добавление: ключ -v.
+
+ *) Исправление: при включении в SSI удалённых подзапросов мог произойти
+ segmentation fault.
+
+ *) Исправление: в обработке FastCGI.
+
+ *) Исправление: если путь к перловым модулям не был указан с помощью
+ --with-perl_modules_path=PATH или директивы perl_modules, то на
+ старте происходил segmentation fault.
+
+
Изменения в nginx 0.3.40 19.04.2006
*) Добавление: модуль ngx_http_dav_module поддерживает метод MKCOL.
diff --git a/src/core/nginx.c b/src/core/nginx.c
index 12a2b8a25..484919862 100644
--- a/src/core/nginx.c
+++ b/src/core/nginx.c
@@ -175,7 +175,9 @@ ngx_module_t ngx_core_module = {
ngx_uint_t ngx_max_module;
-static char *ngx_null_environ = NULL;
+static ngx_uint_t ngx_show_version;
+
+static char *ngx_null_environ = NULL;
int ngx_cdecl
@@ -229,6 +231,17 @@ main(int argc, char *const *argv)
return 1;
}
+ if (ngx_show_version) {
+ ngx_write_fd(ngx_stderr_fileno, "nginx version: " NGINX_VER CRLF,
+ sizeof("nginx version: " NGINX_VER CRLF) - 1);
+
+#ifdef NGX_COMPILER
+ ngx_write_fd(ngx_stderr_fileno, "built by " NGX_COMPILER CRLF,
+ sizeof("built by " NGX_COMPILER CRLF) - 1);
+#endif
+ return 0;
+ }
+
if (ngx_test_config) {
log->log_level = NGX_LOG_INFO;
}
@@ -472,6 +485,10 @@ ngx_getopt(ngx_cycle_t *cycle, int argc, char *const *argv)
switch (argv[i][1]) {
+ case 'v':
+ ngx_show_version = 1;
+ break;
+
case 't':
ngx_test_config = 1;
break;
diff --git a/src/core/nginx.h b/src/core/nginx.h
index 2e13e6be4..ec230610f 100644
--- a/src/core/nginx.h
+++ b/src/core/nginx.h
@@ -8,7 +8,7 @@
#define _NGINX_H_INCLUDED_
-#define NGINX_VER "nginx/0.3.40"
+#define NGINX_VER "nginx/0.3.41"
#define NGINX_VAR "NGINX"
#define NGX_OLDPID_EXT ".oldbin"
diff --git a/src/core/ngx_log.c b/src/core/ngx_log.c
index 9e23592ea..21d59780f 100644
--- a/src/core/ngx_log.c
+++ b/src/core/ngx_log.c
@@ -198,6 +198,8 @@ ngx_log_init(void)
#if (NGX_WIN32)
+ ngx_stderr_fileno = GetStdHandle(STD_ERROR_HANDLE);
+
ngx_stderr.fd = ngx_open_file(NGX_ERROR_LOG_PATH, NGX_FILE_RDWR,
NGX_FILE_CREATE_OR_OPEN|NGX_FILE_APPEND);
diff --git a/src/http/modules/ngx_http_dav_module.c b/src/http/modules/ngx_http_dav_module.c
index e60b8cf34..b41bd8e46 100644
--- a/src/http/modules/ngx_http_dav_module.c
+++ b/src/http/modules/ngx_http_dav_module.c
@@ -116,10 +116,6 @@ ngx_http_dav_handler(ngx_http_request_t *r)
return NGX_DECLINED;
}
- if (r->headers_in.content_length_n < 0) {
- return NGX_HTTP_BAD_REQUEST;
- }
-
r->request_body_in_file_only = 1;
r->request_body_in_persistent_file = 1;
r->request_body_delete_incomplete_file = 1;
@@ -312,6 +308,8 @@ ok:
ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
return;
}
+
+ r->headers_out.content_length_n = 0;
}
r->headers_out.status = status;
diff --git a/src/http/modules/ngx_http_fastcgi_module.c b/src/http/modules/ngx_http_fastcgi_module.c
index f901a5223..ff5511804 100644
--- a/src/http/modules/ngx_http_fastcgi_module.c
+++ b/src/http/modules/ngx_http_fastcgi_module.c
@@ -1173,6 +1173,11 @@ ngx_http_fastcgi_input_filter(ngx_event_pipe_t *p, ngx_buf_t *buf)
if (f->type == NGX_HTTP_FASTCGI_STDERR) {
if (f->length) {
+
+ if (f->pos == f->last) {
+ break;
+ }
+
line.data = f->pos;
if (f->pos + f->length <= f->last) {
@@ -1212,6 +1217,10 @@ ngx_http_fastcgi_input_filter(ngx_event_pipe_t *p, ngx_buf_t *buf)
/* f->type == NGX_HTTP_FASTCGI_STDOUT */
+ if (f->pos == f->last) {
+ break;
+ }
+
if (p->free) {
b = p->free->buf;
p->free = p->free->next;
diff --git a/src/http/modules/ngx_http_static_module.c b/src/http/modules/ngx_http_static_module.c
index 0dbec5093..3399e5098 100644
--- a/src/http/modules/ngx_http_static_module.c
+++ b/src/http/modules/ngx_http_static_module.c
@@ -86,6 +86,10 @@ ngx_http_static_handler(ngx_http_request_t *r)
ngx_pool_cleanup_file_t *clnf;
ngx_http_core_loc_conf_t *clcf;
+ if (r->method != NGX_HTTP_GET && r->method != NGX_HTTP_HEAD) {
+ return NGX_HTTP_NOT_ALLOWED;
+ }
+
if (r->uri.data[r->uri.len - 1] == '/') {
return NGX_DECLINED;
}
@@ -95,10 +99,6 @@ ngx_http_static_handler(ngx_http_request_t *r)
return NGX_DECLINED;
}
- if (r->method != NGX_HTTP_GET && r->method != NGX_HTTP_HEAD) {
- return NGX_HTTP_NOT_ALLOWED;
- }
-
rc = ngx_http_discard_body(r);
if (rc != NGX_OK && rc != NGX_AGAIN) {
diff --git a/src/http/modules/perl/ngx_http_perl_module.c b/src/http/modules/perl/ngx_http_perl_module.c
index 136bac397..aa0e41d25 100644
--- a/src/http/modules/perl/ngx_http_perl_module.c
+++ b/src/http/modules/perl/ngx_http_perl_module.c
@@ -483,8 +483,10 @@ ngx_http_perl_init_interpreter(ngx_conf_t *cf, ngx_http_perl_main_conf_t *pmcf)
}
#endif
- if (ngx_conf_full_name(cf->cycle, &pmcf->modules) != NGX_OK) {
- return NGX_CONF_ERROR;
+ if (pmcf->modules.data) {
+ if (ngx_conf_full_name(cf->cycle, &pmcf->modules) != NGX_OK) {
+ return NGX_CONF_ERROR;
+ }
}
PERL_SYS_INIT(&ngx_argc, &ngx_argv);
diff --git a/src/http/ngx_http_parse.c b/src/http/ngx_http_parse.c
index 11c163290..1b1e963ad 100644
--- a/src/http/ngx_http_parse.c
+++ b/src/http/ngx_http_parse.c
@@ -67,17 +67,18 @@ ngx_http_parse_request_line(ngx_http_request_t *r, ngx_buf_t *b)
r->method_end = p - 1;
m = r->request_start;
- if (p - m == 3) {
+ switch (p - m) {
+ case 3:
if (m[0] == 'G' && m[1] == 'E' && m[2] == 'T') {
r->method = NGX_HTTP_GET;
} else if (m[0] == 'P' && m[1] == 'U' && m[2] == 'T') {
r->method = NGX_HTTP_PUT;
}
+ break;
- } else if (p - m == 4) {
-
+ case 4:
if (m[0] == 'P' && m[1] == 'O'
&& m[2] == 'S' && m[3] == 'T')
{
@@ -88,22 +89,23 @@ ngx_http_parse_request_line(ngx_http_request_t *r, ngx_buf_t *b)
{
r->method = NGX_HTTP_HEAD;
}
+ break;
- } else if (p - m == 5) {
-
+ case 5:
if (m[0] == 'M' && m[1] == 'K'
&& m[2] == 'C' && m[3] == 'O' && m[4] == 'L')
{
r->method = NGX_HTTP_MKCOL;
}
+ break;
- } else if (p - m == 6) {
-
+ case 6:
if (m[0] == 'D' && m[1] == 'E' && m[2] == 'L'
&& m[3] == 'E' && m[4] == 'T' && m[5] == 'E')
{
r->method = NGX_HTTP_DELETE;
}
+ break;
}
state = sw_spaces_before_uri;
diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c
index 6bbaf446a..615ae7511 100644
--- a/src/http/ngx_http_request.c
+++ b/src/http/ngx_http_request.c
@@ -1218,7 +1218,9 @@ ngx_http_process_request_header(ngx_http_request_t *r)
}
}
- if (r->method == NGX_HTTP_POST && r->headers_in.content_length_n == -1) {
+ if (r->method & (NGX_HTTP_POST|NGX_HTTP_PUT)
+ && r->headers_in.content_length_n == -1)
+ {
ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
"client sent POST method without \"Content-Length\" header");
ngx_http_finalize_request(r, NGX_HTTP_LENGTH_REQUIRED);
@@ -1432,7 +1434,6 @@ ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc)
}
ngx_http_finalize_request(r, ngx_http_special_response_handler(r, rc));
-
return;
}
@@ -2154,19 +2155,11 @@ ngx_http_post_action(ngx_http_request_t *r)
static void
ngx_http_close_request(ngx_http_request_t *r, ngx_int_t error)
{
- ngx_connection_t *c;
- ngx_http_cleanup_t *cln;
+ ngx_connection_t *c;
c = r->connection;
- r = r->main;
-
- for (cln = r->cleanup; cln; cln = cln->next) {
- if (cln->handler) {
- cln->handler(cln->data);
- }
- }
- ngx_http_request_done(r, error);
+ ngx_http_request_done(r->main, error);
ngx_http_close_connection(c);
}
@@ -2177,6 +2170,7 @@ ngx_http_request_done(ngx_http_request_t *r, ngx_int_t error)
ngx_log_t *log;
ngx_uint_t i, n;
struct linger linger;
+ ngx_http_cleanup_t *cln;
ngx_http_log_ctx_t *ctx;
ngx_http_handler_pt *log_handler;
ngx_http_core_loc_conf_t *clcf;
@@ -2191,6 +2185,12 @@ ngx_http_request_done(ngx_http_request_t *r, ngx_int_t error)
return;
}
+ for (cln = r->cleanup; cln; cln = cln->next) {
+ if (cln->handler) {
+ cln->handler(cln->data);
+ }
+ }
+
#if (NGX_STAT_STUB)
if (r->stat_reading) {
diff --git a/src/os/unix/ngx_shmem.c b/src/os/unix/ngx_shmem.c
index 66df1bbe4..f7f831fdb 100644
--- a/src/os/unix/ngx_shmem.c
+++ b/src/os/unix/ngx_shmem.c
@@ -13,8 +13,9 @@
ngx_int_t
ngx_shm_alloc(ngx_shm_t *shm)
{
- shm->addr = mmap(NULL, shm->size,
- PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1, 0);
+ shm->addr = (u_char *) mmap(NULL, shm->size,
+ PROT_READ|PROT_WRITE,
+ MAP_ANON|MAP_SHARED, -1, 0);
if (shm->addr == MAP_FAILED) {
ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
@@ -29,7 +30,7 @@ ngx_shm_alloc(ngx_shm_t *shm)
void
ngx_shm_free(ngx_shm_t *shm)
{
- if (munmap(shm->addr, shm->size) == -1) {
+ if (munmap((void *) shm->addr, shm->size) == -1) {
ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
"munmap(%p, %uz) failed", shm->addr, shm->size);
}
@@ -50,7 +51,8 @@ ngx_shm_alloc(ngx_shm_t *shm)
return NGX_ERROR;
}
- shm->addr = mmap(NULL, shm->size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
+ shm->addr = (u_char *) mmap(NULL, shm->size, PROT_READ|PROT_WRITE,
+ MAP_SHARED, fd, 0);
if (shm->addr == MAP_FAILED) {
ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
@@ -69,7 +71,7 @@ ngx_shm_alloc(ngx_shm_t *shm)
void
ngx_shm_free(ngx_shm_t *shm)
{
- if (munmap(shm->addr, shm->size) == -1) {
+ if (munmap((void *) shm->addr, shm->size) == -1) {
ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
"munmap(%p, %uz) failed", shm->addr, shm->size);
}