changeset 1740:45db41a0591c

restore environ for perl_destruct()
author Igor Sysoev <igor@sysoev.ru>
date Sun, 16 Dec 2007 11:58:16 +0000
parents 5b7baef2e11e
children 0829024c924d
files src/core/ngx_cycle.c
diffstat 1 files changed, 29 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/src/core/ngx_cycle.c
+++ b/src/core/ngx_cycle.c
@@ -42,20 +42,21 @@ static ngx_str_t  error_log = ngx_null_s
 ngx_cycle_t *
 ngx_init_cycle(ngx_cycle_t *old_cycle)
 {
-    void               *rv;
-    u_char             *lock_file;
-    ngx_uint_t          i, n;
-    ngx_log_t          *log;
-    ngx_conf_t          conf;
-    ngx_pool_t         *pool;
-    ngx_cycle_t        *cycle, **old;
-    ngx_shm_zone_t     *shm_zone, *oshm_zone;
-    ngx_slab_pool_t    *shpool;
-    ngx_list_part_t    *part, *opart;
-    ngx_open_file_t    *file;
-    ngx_listening_t    *ls, *nls;
-    ngx_core_conf_t    *ccf, *old_ccf;
-    ngx_core_module_t  *module;
+    void                *rv;
+    char               **senv, **env;
+    u_char              *lock_file;
+    ngx_uint_t           i, n;
+    ngx_log_t           *log;
+    ngx_conf_t           conf;
+    ngx_pool_t          *pool;
+    ngx_cycle_t         *cycle, **old;
+    ngx_shm_zone_t      *shm_zone, *oshm_zone;
+    ngx_slab_pool_t     *shpool;
+    ngx_list_part_t     *part, *opart;
+    ngx_open_file_t     *file;
+    ngx_listening_t     *ls, *nls;
+    ngx_core_conf_t     *ccf, *old_ccf;
+    ngx_core_module_t   *module;
 
     log = old_cycle->log;
 
@@ -187,6 +188,9 @@ ngx_init_cycle(ngx_cycle_t *old_cycle)
     }
 
 
+    senv = environ;
+
+
     ngx_memzero(&conf, sizeof(ngx_conf_t));
     /* STUB: init array ? */
     conf.args = ngx_array_create(pool, 10, sizeof(ngx_str_t));
@@ -694,9 +698,20 @@ old_shm_zone_done:
 
     if (ngx_process == NGX_PROCESS_MASTER || ngx_is_init_cycle(old_cycle)) {
 
+        /*
+         * perl_destruct() frees environ if it is not the same as it was at
+         * perl_construct() time.  So we have saved an previous cycle
+         * environment before ngx_conf_parse() where it will be changed.
+         */
+
+        env = environ;
+        environ = senv;
+
         ngx_destroy_pool(old_cycle->pool);
         cycle->old_cycle = NULL;
 
+        environ = env;
+
         return cycle;
     }