aboutsummaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/ngx_cycle.c43
1 files changed, 29 insertions, 14 deletions
diff --git a/src/core/ngx_cycle.c b/src/core/ngx_cycle.c
index f0e86eb94..edcb6b5b0 100644
--- a/src/core/ngx_cycle.c
+++ b/src/core/ngx_cycle.c
@@ -42,20 +42,21 @@ static ngx_str_t error_log = ngx_null_string;
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;
}