restore environ for perl_destruct()

This commit is contained in:
Igor Sysoev 2007-12-16 11:58:16 +00:00
parent 078dc8bc49
commit 7f35ae6ea6

View File

@ -43,6 +43,7 @@ ngx_cycle_t *
ngx_init_cycle(ngx_cycle_t *old_cycle) ngx_init_cycle(ngx_cycle_t *old_cycle)
{ {
void *rv; void *rv;
char **senv, **env;
u_char *lock_file; u_char *lock_file;
ngx_uint_t i, n; ngx_uint_t i, n;
ngx_log_t *log; ngx_log_t *log;
@ -187,6 +188,9 @@ ngx_init_cycle(ngx_cycle_t *old_cycle)
} }
senv = environ;
ngx_memzero(&conf, sizeof(ngx_conf_t)); ngx_memzero(&conf, sizeof(ngx_conf_t));
/* STUB: init array ? */ /* STUB: init array ? */
conf.args = ngx_array_create(pool, 10, sizeof(ngx_str_t)); 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)) { 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); ngx_destroy_pool(old_cycle->pool);
cycle->old_cycle = NULL; cycle->old_cycle = NULL;
environ = env;
return cycle; return cycle;
} }