changeset 188:af37b7cb6698 NGINX_0_3_41

nginx 0.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.
author Igor Sysoev <http://sysoev.ru>
date Fri, 21 Apr 2006 00:00:00 +0400
parents c0ed72c62dfa
children fca7768a4aca
files CHANGES CHANGES.ru src/core/nginx.c src/core/nginx.h src/core/ngx_log.c src/http/modules/ngx_http_dav_module.c src/http/modules/ngx_http_fastcgi_module.c src/http/modules/ngx_http_static_module.c src/http/modules/perl/ngx_http_perl_module.c src/http/ngx_http_parse.c src/http/ngx_http_request.c src/os/unix/ngx_shmem.c
diffstat 12 files changed, 97 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- 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.
--- 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.
--- 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,
 
         switch (argv[i][1]) {
 
+        case 'v':
+            ngx_show_version = 1;
+            break;
+
         case 't':
             ngx_test_config = 1;
             break;
--- 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"
--- 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);
 
--- 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 
             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;
--- 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_
         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_
 
         /* f->type == NGX_HTTP_FASTCGI_STDOUT */
 
+        if (f->pos == f->last) {
+            break;
+        }
+
         if (p->free) {
             b = p->free->buf;
             p->free = p->free->next;
--- 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
     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
         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) {
--- 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_
     }
 #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);
--- 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_req
                 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_req
                     {
                         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;
--- 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
         }
     }
 
-    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_reque
         }
 
         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 
 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
     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
         return;
     }
 
+    for (cln = r->cleanup; cln; cln = cln->next) {
+        if (cln->handler) {
+            cln->handler(cln->data);
+        }
+    }
+
 #if (NGX_STAT_STUB)
 
     if (r->stat_reading) {
--- 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);
     }