]> git.kaiwu.me - nginx.git/commitdiff
nginx-0.3.1-RELEASE import release-0.3.1
authorIgor Sysoev <igor@sysoev.ru>
Mon, 10 Oct 2005 12:59:41 +0000 (12:59 +0000)
committerIgor Sysoev <igor@sysoev.ru>
Mon, 10 Oct 2005 12:59:41 +0000 (12:59 +0000)
    *) Bugfix: the segmentation fault occurred when the signal queue
       overflowed if the "rtsig" method was used; the bug had appeared in
       0.2.0.

    *) Change: correct handling of the "\\", "\"", "\'", and "\$" pairs in
       SSI.

18 files changed:
docs/xml/nginx/changes.xml
src/core/nginx.h
src/core/ngx_core.h
src/core/ngx_rbtree.c
src/core/ngx_rbtree.h
src/event/modules/ngx_epoll_module.c
src/event/modules/ngx_kqueue_module.c
src/event/modules/ngx_rtsig_module.c
src/event/ngx_event.h
src/event/ngx_event_openssl.c
src/event/ngx_event_timer.c
src/event/ngx_event_timer.h
src/http/modules/ngx_http_charset_filter_module.c
src/http/modules/ngx_http_ssi_filter_module.c
src/imap/ngx_imap_auth_http_module.c
src/os/unix/ngx_freebsd_rfork_thread.h
src/os/unix/ngx_process.h
src/os/unix/ngx_process_cycle.c

index 4d67ea35868ae955e5c0be7ad225b8f58e09f62f..0726a1f3e7ffc06cb2838f81faf4ee3259cb72ee 100644 (file)
@@ -9,12 +9,39 @@
 <title lang="en">nginx changelog</title>
 
 
+<changes ver="0.3.1" date="10.10.2005">
+
+<change type="bugfix">
+<para lang="ru">
+×Ï ×ÒÅÍÑ ÐÅÒÅÐÏÌÎÅÎÉÑ ÏÞÅÒÅÄÉ ÓÉÇÎÁÌÏ× ÐÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÍÅÔÏÄÁ rtsig
+ÐÒÏÉÓÈÏÄÉÌ segmentation fault;
+ÏÛÉÂËÁ ÐÏÑ×ÉÌÁÓØ × 0.2.0.
+</para>
+<para lang="en">
+the segmentation fault occurred when the signal queue overflowed
+if the "rtsig" method was used;
+bug appeared in 0.2.0.
+</para>
+</change>
+
+<change type="change">
+<para lang="ru">
+ËÏÒÒÅËÔÎÁÑ ÏÂÒÁÂÏÔËÁ ÐÁÒ "\\", "\"", "\'" É "\$" × SSI.
+</para>
+<para lang="en">
+correct handling of the "\\", "\"", "\'", and "\$" pairs in SSI.
+</para>
+</change>
+
+</changes>
+
+
 <changes ver="0.3.0" date="07.10.2005">
 
 <change type="change">
 <para lang="ru">
 ÕÂÒÁÎÏ ÄÅÓÑÔÉÄÎÅ×ÎÏÅ ÏÇÒÁÎÉÞÅÎÉÅ ×ÒÅÍÅÎÉ ÒÁÂÏÔÙ ÒÁÂÏÞÅÇÏ ÐÒÏÃÅÓÓÁ.
-ïÇÒÁÎÉÞÅÎÉÅ ÂÙÌÏ ××ÅÄÅÎÏ ÉÚ-ÚÁ ÐÅÒÅÐÏÌÎÅÎÉÑ ÔÁÊÍÅÒÏ× ÍÉÌÌÉÓÅËÕÎÄ.
+ïÇÒÁÎÉÞÅÎÉÅ ÂÙÌÏ ××ÅÄÅÎÏ ÉÚ-ÚÁ ÐÅÒÅÐÏÌÎÅÎÉÑ ÍÉÌÌÉÓÅËÕÎÄÎÙÈ ÔÁÊÍÅÒÏ×.
 </para>
 <para lang="en">
 the 10-days live time limit of worker process was eliminated.
index 734c4016ff82b0e218165da8c30f41fae20890a3..22c632ff30566002c0d3d27899b3c8c9ece9fb34 100644 (file)
@@ -8,7 +8,7 @@
 #define _NGINX_H_INCLUDED_
 
 
-#define NGINX_VER          "nginx/0.3.0"
+#define NGINX_VER          "nginx/0.3.1"
 
 #define NGINX_VAR          "NGINX"
 #define NGX_OLDPID_EXT     ".oldbin"
index 27058bfc2f471abdd91a7641bd4ee51738880374..9efbecd4d882fc8f9296b9b0ba5998d029bf6834 100644 (file)
@@ -35,15 +35,15 @@ typedef void (*ngx_connection_handler_pt)(ngx_connection_t *c);
 #define  NGX_ABORT      -6
 
 
+#include <ngx_errno.h>
 #include <ngx_atomic.h>
+#include <ngx_thread.h>
 #include <ngx_rbtree.h>
 #include <ngx_time.h>
 #include <ngx_socket.h>
-#include <ngx_errno.h>
 #include <ngx_types.h>
 #include <ngx_shared.h>
 #include <ngx_process.h>
-#include <ngx_thread.h>
 #include <ngx_user.h>
 #include <ngx_string.h>
 #include <ngx_parse.h>
index 1ebc56a3b3aa4ee01ffc4072d7a52c45f044fffa..3c42be402e59326f1b6ffb2505a7088f328af44f 100644 (file)
@@ -9,8 +9,8 @@
 
 
 /*
- * The code is based on the algorithm described in the "Introduction
- * to Algorithms" by Cormen, Leiserson and Rivest.
+ * The red-black tree code is based on the algorithm described in
+ * the "Introduction to Algorithms" by Cormen, Leiserson and Rivest.
  */
 
 #define ngx_rbt_red(node)           ((node)->color = 1)
 #define ngx_rbt_copy_color(n1, n2)  (n1->color = n2->color)
 
 
-static ngx_inline void ngx_rbtree_left_rotate(ngx_rbtree_t **root,
-    ngx_rbtree_t *sentinel, ngx_rbtree_t *node);
-static ngx_inline void ngx_rbtree_right_rotate(ngx_rbtree_t **root,
-    ngx_rbtree_t *sentinel, ngx_rbtree_t *node);
+static ngx_inline void ngx_rbtree_left_rotate(ngx_rbtree_node_t **root,
+    ngx_rbtree_node_t *sentinel, ngx_rbtree_node_t *node);
+static ngx_inline void ngx_rbtree_right_rotate(ngx_rbtree_node_t **root,
+    ngx_rbtree_node_t *sentinel, ngx_rbtree_node_t *node);
 
 
 void
-ngx_rbtree_insert(ngx_rbtree_t **root, ngx_rbtree_t *sentinel,
-    ngx_rbtree_t *node)
+ngx_rbtree_insert(ngx_thread_volatile ngx_rbtree_t *tree,
+    ngx_rbtree_node_t *node)
 {
-    ngx_rbtree_t  *temp;
+    ngx_rbtree_node_t  **root, *temp, *sentinel;
 
     /* a binary tree insert */
 
+    root = (ngx_rbtree_node_t **) &tree->root;
+    sentinel = tree->sentinel;
+
     if (*root == sentinel) {
         node->parent = NULL;
         node->left = sentinel;
@@ -44,6 +47,17 @@ ngx_rbtree_insert(ngx_rbtree_t **root, ngx_rbtree_t *sentinel,
         return;
     }
 
+    /*
+     * The rbtree is currently used by event timers only.  Timer values
+     * 1) are spread in small range, usually several minutes,
+     * 2) and overflow each 49 days, if milliseconds are stored in 32 bits.
+     * The below comparison takes into account that overflow.
+     *
+     * If there will be a necessity to use the rbtree for values with
+     * other comparison rules, then a whole "for ( ;; )" loop should
+     * be made as tree->insert() function.
+     */
+
     temp = *root;
 
     for ( ;; ) {
@@ -130,14 +144,17 @@ ngx_rbtree_insert(ngx_rbtree_t **root, ngx_rbtree_t *sentinel,
 
 
 void
-ngx_rbtree_delete(ngx_rbtree_t **root, ngx_rbtree_t *sentinel,
-    ngx_rbtree_t *node)
+ngx_rbtree_delete(ngx_thread_volatile ngx_rbtree_t *tree,
+    ngx_rbtree_node_t *node)
 {
-    ngx_int_t      is_red;
-    ngx_rbtree_ *subst, *temp, *w;
+    ngx_int_t            is_red;
+    ngx_rbtree_node_t  **root, *sentinel, *subst, *temp, *w;
 
     /* a binary tree delete */
 
+    root = (ngx_rbtree_node_t **) &tree->root;
+    sentinel = tree->sentinel;
+
     if (node->left == sentinel) {
         temp = node->right;
         subst = node;
@@ -295,10 +312,10 @@ ngx_rbtree_delete(ngx_rbtree_t **root, ngx_rbtree_t *sentinel,
 
 
 static ngx_inline void
-ngx_rbtree_left_rotate(ngx_rbtree_t **root, ngx_rbtree_t *sentinel,
-    ngx_rbtree_t *node)
+ngx_rbtree_left_rotate(ngx_rbtree_node_t **root, ngx_rbtree_node_t *sentinel,
+    ngx_rbtree_node_t *node)
 {
-    ngx_rbtree_t  *temp;
+    ngx_rbtree_node_t  *temp;
 
     temp = node->right;
     node->right = temp->left;
@@ -325,10 +342,10 @@ ngx_rbtree_left_rotate(ngx_rbtree_t **root, ngx_rbtree_t *sentinel,
 
 
 static ngx_inline void
-ngx_rbtree_right_rotate(ngx_rbtree_t **root, ngx_rbtree_t *sentinel,
-    ngx_rbtree_t *node)
+ngx_rbtree_right_rotate(ngx_rbtree_node_t **root, ngx_rbtree_node_t *sentinel,
+    ngx_rbtree_node_t *node)
 {
-    ngx_rbtree_t  *temp;
+    ngx_rbtree_node_t  *temp;
 
     temp = node->left;
     node->left = temp->right;
index d6803f912a5a0db43fdcdef2b294ca6f6ff33d6a..1b1322d3c8c36478c4842204ed7eb3038882aeed 100644 (file)
@@ -16,25 +16,37 @@ typedef ngx_uint_t  ngx_rbtree_key_t;
 typedef ngx_int_t   ngx_rbtree_key_int_t;
 
 
+typedef struct ngx_rbtree_node_s  ngx_rbtree_node_t;
+
+struct ngx_rbtree_node_s {
+    ngx_rbtree_key_t       key;
+    ngx_rbtree_node_t     *left;
+    ngx_rbtree_node_t     *right;
+    ngx_rbtree_node_t     *parent;
+    char                   color;
+};
+
+
 typedef struct ngx_rbtree_s  ngx_rbtree_t;
 
+typedef ngx_rbtree_t *(*ngx_rbtree_insert_pt) (ngx_rbtree_node_t *root,
+    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);
+
 struct ngx_rbtree_s {
-    ngx_rbtree_key_t   key;
-    ngx_rbtree_t      *left;
-    ngx_rbtree_t      *right;
-    ngx_rbtree_t      *parent;
-    char               color;
+    ngx_rbtree_node_t     *root;
+    ngx_rbtree_node_t     *sentinel;
+ /* ngx_rbtree_insert_pt   insert; */
 };
 
 
-void ngx_rbtree_insert(ngx_rbtree_t **root, ngx_rbtree_t *sentinel,
-    ngx_rbtree_t *node);
-void ngx_rbtree_delete(ngx_rbtree_t **root, ngx_rbtree_t *sentinel,
-    ngx_rbtree_t *node);
+void ngx_rbtree_insert(ngx_thread_volatile ngx_rbtree_t *tree,
+    ngx_rbtree_node_t *node);
+void ngx_rbtree_delete(ngx_thread_volatile ngx_rbtree_t *tree,
+    ngx_rbtree_node_t *node);
 
 
-static ngx_inline ngx_rbtree_t *
-ngx_rbtree_min(ngx_rbtree_t *node, ngx_rbtree_t *sentinel)
+static ngx_inline ngx_rbtree_node_t *
+ngx_rbtree_min(ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
 {
     while (node->left != sentinel) {
         node = node->left;
index 177c05da709bf22d96d71d0bda6a82088cab16fc..a53b8eb26da636aeeab8c6b9ae174d0d0f5fe9d6 100644 (file)
@@ -405,7 +405,6 @@ ngx_epoll_process_events(ngx_cycle_t *cycle)
 
     if (timer == NGX_TIMER_INFINITE || timer > 500) {
         timer = 500;
-        break;
     }
 
 #endif
index ee55915d6c71594443f719fb91b6349742178a55..99342ab1fafccdcc4f650275fe5e9cfa46d203bf 100644 (file)
@@ -462,7 +462,6 @@ ngx_kqueue_process_events(ngx_cycle_t *cycle)
 
     if (timer == NGX_TIMER_INFINITE || timer > 500) {
         timer = 500;
-        break;
     }
 
 #endif
index fdbbb2fe439c11d529875bb047e18e2ea13bf141..f88dd5d6fe3eed5d70726af78e7e22aab8af73b6 100644 (file)
@@ -307,7 +307,6 @@ ngx_rtsig_process_events(ngx_cycle_t *cycle)
 
         if (timer == NGX_TIMER_INFINITE || timer > 500) {
             timer = 500;
-            break;
         }
 
 #endif
@@ -578,7 +577,7 @@ ngx_rtsig_process_overflow(ngx_cycle_t *cycle)
 
             c = cycle->files[overflow_current++];
 
-            if (c->fd == -1) {
+            if (c == NULL || c->fd == -1) {
                 continue;
             }
 
@@ -634,6 +633,10 @@ ngx_rtsig_process_overflow(ngx_cycle_t *cycle)
         for (i = 0; i < n; i++) {
             c = cycle->files[overflow_list[i].fd];
 
+            if (c == NULL) {
+                continue;
+            }
+
             rev = c->read;
 
             if (rev->active
index 308d460c59d35b31a75bce764227aa9bc9f62c4f..9d917ea7bb18b24e76c1e5480df73bc41efbd4b6 100644 (file)
@@ -130,18 +130,7 @@ struct ngx_event_s {
 
     ngx_log_t       *log;
 
-    /* TODO: threads: padding to cache line */
-
-    /*
-     * STUB: The inline of "ngx_rbtree_t  rbtree;"
-     */
-
-    ngx_rbtree_key_t   rbtree_key;
-    void              *rbtree_left;
-    void              *rbtree_right;
-    void              *rbtree_parent;
-    char               rbtree_color;
-
+    ngx_rbtree_node_t   timer;
 
     unsigned         closed:1;
 
index 49640faa6ca8650fb6576544367bc4de280ba1d2..48a03a17ad729438559676e88b2229438e703cad 100644 (file)
@@ -144,6 +144,10 @@ ngx_ssl_certificate(ngx_ssl_t *ssl, u_char *cert, u_char *key)
 ngx_int_t
 ngx_ssl_generate_rsa512_key(ngx_ssl_t *ssl)
 {
+    if (SSL_CTX_need_tmp_RSA(ssl->ctx) == 0) {
+        return NGX_OK;
+    }
+
     ssl->rsa512_key = RSA_generate_key(512, RSA_F4, NULL, NULL);
 
     if (ssl->rsa512_key) {
@@ -851,7 +855,10 @@ ngx_ssl_cleanup_ctx(void *data)
 {
    ngx_ssl_t  *ssl = data;
 
-   RSA_free(ssl->rsa512_key);
+   if (ssl->rsa512_key) {
+       RSA_free(ssl->rsa512_key);
+   }
+
    SSL_CTX_free(ssl->ctx);
 }
 
index c3d3c7ee8fc78f13a6de3478966b18c2bcd65671..656f62b15132105830e2a4ec26d85cfa4e382151 100644 (file)
@@ -14,27 +14,28 @@ ngx_mutex_t  *ngx_event_timer_mutex;
 #endif
 
 
-ngx_thread_volatile ngx_rbtree_t  *ngx_event_timer_rbtree;
-ngx_rbtree_t                       ngx_event_timer_sentinel;
+ngx_thread_volatile ngx_rbtree_t  ngx_event_timer_rbtree;
+static ngx_rbtree_node_t          ngx_event_timer_sentinel;
 
 
 ngx_int_t
 ngx_event_timer_init(ngx_log_t *log)
 {
-    if (ngx_event_timer_rbtree) {
+    ngx_event_timer_rbtree.root = &ngx_event_timer_sentinel;
+    ngx_event_timer_rbtree.sentinel = &ngx_event_timer_sentinel;
+
 #if (NGX_THREADS)
+
+    if (ngx_event_timer_mutex) {
         ngx_event_timer_mutex->log = log;
-#endif
         return NGX_OK;
     }
 
-    ngx_event_timer_rbtree = &ngx_event_timer_sentinel;
-
-#if (NGX_THREADS)
     ngx_event_timer_mutex = ngx_mutex_init(log, 0);
     if (ngx_event_timer_mutex == NULL) {
         return NGX_ERROR;
     }
+
 #endif
 
     return NGX_OK;
@@ -44,10 +45,10 @@ ngx_event_timer_init(ngx_log_t *log)
 ngx_msec_t
 ngx_event_find_timer(void)
 {
-    ngx_msec_t     timer;
-    ngx_rbtree_t  *node;
+    ngx_rbtree_key_int_t   timer;
+    ngx_rbtree_node_t     *node, *root, *sentinel;
 
-    if (ngx_event_timer_rbtree == &ngx_event_timer_sentinel) {
+    if (ngx_event_timer_rbtree.root == &ngx_event_timer_sentinel) {
         return NGX_TIMER_INFINITE;
     }
 
@@ -55,35 +56,41 @@ ngx_event_find_timer(void)
         return NGX_TIMER_ERROR;
     }
 
-    node = ngx_rbtree_min((ngx_rbtree_t *) ngx_event_timer_rbtree,
-                          &ngx_event_timer_sentinel);
+    root = ngx_event_timer_rbtree.root;
+    sentinel = ngx_event_timer_rbtree.sentinel;
+
+    node = ngx_rbtree_min(root, sentinel);
 
     ngx_mutex_unlock(ngx_event_timer_mutex);
 
-    timer = (ngx_msec_t) node->key - ngx_current_time;
+    timer = (ngx_rbtree_key_int_t) node->key
+                                     - (ngx_rbtree_key_int_t) ngx_current_time;
 
-    return timer > 0 ? timer : 0 ;
+    return (ngx_msec_t) (timer > 0 ? timer : 0);
 }
 
 
 void
 ngx_event_expire_timers(void)
 {
-    ngx_event_t   *ev;
-    ngx_rbtree_t  *node;
+    ngx_event_t        *ev;
+    ngx_rbtree_node_t  *node, *root, *sentinel;
+
+    sentinel = ngx_event_timer_rbtree.sentinel;
 
     for ( ;; ) {
 
-        if (ngx_event_timer_rbtree == &ngx_event_timer_sentinel) {
+        if (ngx_mutex_lock(ngx_event_timer_mutex) == NGX_ERROR) {
             return;
         }
 
-        if (ngx_mutex_lock(ngx_event_timer_mutex) == NGX_ERROR) {
+        root = ngx_event_timer_rbtree.root;
+
+        if (root == sentinel) {
             return;
         }
 
-        node = ngx_rbtree_min((ngx_rbtree_t *) ngx_event_timer_rbtree,
-                              &ngx_event_timer_sentinel);
+        node = ngx_rbtree_min(root, sentinel);
 
         /* node->key <= ngx_current_time */
 
@@ -91,8 +98,7 @@ ngx_event_expire_timers(void)
                                       - (ngx_rbtree_key_int_t) ngx_current_time
             <= 0)
         {
-            ev = (ngx_event_t *)
-                           ((char *) node - offsetof(ngx_event_t, rbtree_key));
+            ev = (ngx_event_t *) ((char *) node - offsetof(ngx_event_t, timer));
 
 #if (NGX_THREADS)
 
@@ -114,18 +120,16 @@ ngx_event_expire_timers(void)
 
             ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,
                            "event timer del: %d: %M",
-                           ngx_event_ident(ev->data), ev->rbtree_key);
+                           ngx_event_ident(ev->data), ev->timer.key);
 
-            ngx_rbtree_delete((ngx_rbtree_t **) &ngx_event_timer_rbtree,
-                              &ngx_event_timer_sentinel,
-                              (ngx_rbtree_t *) &ev->rbtree_key);
+            ngx_rbtree_delete(&ngx_event_timer_rbtree, &ev->timer);
 
             ngx_mutex_unlock(ngx_event_timer_mutex);
 
 #if (NGX_DEBUG)
-            ev->rbtree_left = NULL;
-            ev->rbtree_right = NULL;
-            ev->rbtree_parent = NULL;
+            ev->timer.left = NULL;
+            ev->timer.right = NULL;
+            ev->timer.parent = NULL;
 #endif
 
             ev->timer_set = 0;
index a9d3176c1c248649bcc115e3e7d5f6b309ecfd67..13b5c0a39be39c101d84625c7bcc3259132fffac 100644 (file)
@@ -29,8 +29,7 @@ extern ngx_mutex_t  *ngx_event_timer_mutex;
 #endif
 
 
-extern ngx_thread_volatile ngx_rbtree_t  *ngx_event_timer_rbtree;
-extern ngx_rbtree_t                       ngx_event_timer_sentinel;
+extern ngx_thread_volatile ngx_rbtree_t  ngx_event_timer_rbtree;
 
 
 static ngx_inline void
@@ -38,22 +37,20 @@ ngx_event_del_timer(ngx_event_t *ev)
 {
     ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,
                    "event timer del: %d: %M",
-                    ngx_event_ident(ev->data), ev->rbtree_key);
+                    ngx_event_ident(ev->data), ev->timer.key);
 
     if (ngx_mutex_lock(ngx_event_timer_mutex) == NGX_ERROR) {
         return;
     }
 
-    ngx_rbtree_delete((ngx_rbtree_t **) &ngx_event_timer_rbtree,
-                      &ngx_event_timer_sentinel,
-                      (ngx_rbtree_t *) &ev->rbtree_key);
+    ngx_rbtree_delete(&ngx_event_timer_rbtree, &ev->timer);
 
     ngx_mutex_unlock(ngx_event_timer_mutex);
 
 #if (NGX_DEBUG)
-    ev->rbtree_left = NULL;
-    ev->rbtree_right = NULL;
-    ev->rbtree_parent = NULL;
+    ev->timer.left = NULL;
+    ev->timer.right = NULL;
+    ev->timer.parent = NULL;
 #endif
 
     ev->timer_set = 0;
@@ -76,31 +73,29 @@ ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer)
          * the rbtree operations for the fast connections.
          */
 
-        diff = (ngx_rbtree_key_int_t) (key - ev->rbtree_key);
+        diff = (ngx_rbtree_key_int_t) (key - ev->timer.key);
 
         if (ngx_abs(diff) < NGX_TIMER_LAZY_DELAY) {
             ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,
                            "event timer: %d, old: %M, new: %M",
-                            ngx_event_ident(ev->data), ev->rbtree_key, key);
+                            ngx_event_ident(ev->data), ev->timer.key, key);
             return;
         }
 
         ngx_del_timer(ev);
     }
 
-    ev->rbtree_key = key;
+    ev->timer.key = key;
 
     ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,
                    "event timer add: %d: %M:%M",
-                    ngx_event_ident(ev->data), timer, ev->rbtree_key);
+                    ngx_event_ident(ev->data), timer, ev->timer.key);
 
     if (ngx_mutex_lock(ngx_event_timer_mutex) == NGX_ERROR) {
         return;
     }
 
-    ngx_rbtree_insert((ngx_rbtree_t **) &ngx_event_timer_rbtree,
-                      &ngx_event_timer_sentinel,
-                      (ngx_rbtree_t *) &ev->rbtree_key);
+    ngx_rbtree_insert(&ngx_event_timer_rbtree, &ev->timer);
 
     ngx_mutex_unlock(ngx_event_timer_mutex);
 
index 51f115b63a5bff83907c8d5176c73f6cb0e341d4..8eee358be43e6f4ee0aa9aa75d9abceb56c70759 100644 (file)
@@ -75,16 +75,16 @@ static ngx_int_t ngx_http_charset_postconfiguration(ngx_conf_t *cf);
 static ngx_command_t  ngx_http_charset_filter_commands[] = {
 
     { ngx_string("charset"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF
-                        |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF
+                        |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,
       ngx_http_set_charset_slot,
       NGX_HTTP_LOC_CONF_OFFSET,
       offsetof(ngx_http_charset_loc_conf_t, charset),
       NULL },
 
     { ngx_string("source_charset"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF
-                        |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF
+                        |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,
       ngx_http_set_charset_slot,
       NGX_HTTP_LOC_CONF_OFFSET,
       offsetof(ngx_http_charset_loc_conf_t, source_charset),
index acbae29eb8a685a7f1508162d7edf177a24cd546..5f9ee3a4250491e0b36971f2f70bdb7c4767ac19 100644 (file)
@@ -1130,14 +1130,15 @@ ngx_http_ssi_parse(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx)
 
         case ssi_double_quoted_value_state:
             switch (ch) {
+            case '"':
+                state = ssi_postparam_state;
+                break;
+
             case '\\':
                 ctx->saved_state = ssi_double_quoted_value_state;
                 state = ssi_quoted_symbol_state;
-                break;
 
-            case '"':
-                state = ssi_postparam_state;
-                break;
+                /* fall through */
 
             default:
                 ctx->param->value.data[ctx->param->value.len++] = ch;
@@ -1157,14 +1158,15 @@ ngx_http_ssi_parse(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx)
 
         case ssi_quoted_value_state:
             switch (ch) {
+            case '\'':
+                state = ssi_postparam_state;
+                break;
+
             case '\\':
                 ctx->saved_state = ssi_quoted_value_state;
                 state = ssi_quoted_symbol_state;
-                break;
 
-            case '\'':
-                state = ssi_postparam_state;
-                break;
+                /* fall through */
 
             default:
                 ctx->param->value.data[ctx->param->value.len++] = ch;
@@ -1183,6 +1185,20 @@ ngx_http_ssi_parse(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx)
             break;
 
         case ssi_quoted_symbol_state:
+            state = ctx->saved_state;
+
+            if (ch == '\\') {
+                break;
+            }
+
+            if (ch == '"' && state == ssi_double_quoted_value_state) {
+                break;
+            }
+
+            if (ch == '\'' && state == ssi_quoted_value_state) {
+                break;
+            }
+
             ctx->param->value.data[ctx->param->value.len++] = ch;
 
             if (ctx->param->value.len == ctx->value_len) {
@@ -1197,7 +1213,6 @@ ngx_http_ssi_parse(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx)
                 }
             }
 
-            state = ctx->saved_state;
             break;
 
         case ssi_postparam_state:
@@ -1486,13 +1501,25 @@ ngx_http_ssi_evaluate_string(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,
             }
 
         } else {
-            part.len = 0;
             part.data = &text->data[i];
 
-            while (i < text->len && text->data[i] != '$') {
-                i++;
-                part.len++;
+            for (p = part.data; i < text->len; i++) {
+                ch = text->data[i];
+
+                if (ch == '$') {
+                    if (text->data[i - 1] != '\\') {
+                        break;
+                    }
+
+                    *(p - 1) = ch;
+
+                    continue;
+                }
+
+                *p++ = ch;
             }
+
+            part.len = p - part.data;
         }
 
         len += part.len;
index 3cafa6f4073ef43e74ec305a4922561470661a59..bc98dc8b830cbea8d6985da1a084af1a610fc53d 100644 (file)
@@ -1122,7 +1122,7 @@ ngx_imap_auth_http(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
         ahcf->uri = inet_upstream.uri;
     }
 
-    if (ahcf->uri.len) {
+    if (ahcf->uri.len == 0) {
         ahcf->uri.len = sizeof("/") - 1;
         ahcf->uri.data = (u_char *) "/";
     }
index 215d2dc867bc84ef3eb658754a8a7fb7164e05a0..79e748a00eb80b579f2ea832ec9fdbba7423f367 100644 (file)
@@ -14,7 +14,6 @@
 
 typedef pid_t  ngx_tid_t;
 
-#undef ngx_log_pid
 #define ngx_log_pid    ngx_thread_self()
 #define ngx_log_tid    0
 
index 06ff21cfe45cc5b56ddbfa8267c9eb18fa625629..a34ca614292a9b20fa9146e990c0ad79449f42c2 100644 (file)
@@ -51,7 +51,11 @@ typedef struct {
 
 
 #define ngx_getpid   getpid
+
+#ifndef ngx_log_pid
 #define ngx_log_pid  ngx_pid
+#endif
+
 
 ngx_pid_t ngx_spawn_process(ngx_cycle_t *cycle,
     ngx_spawn_proc_pt proc, void *data, char *name, ngx_int_t respawn);
index 97475e60d72288c6b447cb605a14dabb915230ba..029de436f4313d3fa4d12ef2ebf020c79bacd7db 100644 (file)
@@ -703,7 +703,7 @@ ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
 
     for ( ;; ) {
         if (ngx_exiting
-            && ngx_event_timer_rbtree == &ngx_event_timer_sentinel)
+            && ngx_event_timer_rbtree.root == ngx_event_timer_rbtree.sentinel)
         {
             ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");