cfc571
From eb6941e902e02332019d8cba2ed7a9100fd914b3 Mon Sep 17 00:00:00 2001
cfc571
From: Paul Annesley <paul@annesley.cc>
cfc571
Date: Wed, 19 Feb 2014 11:48:40 -0800
cfc571
Subject: [PATCH] add clear_env option to FPM config
cfc571
cfc571
This makes it possible to leave the envoronment as is on startup and
cfc571
pass all the variables to the workers.
cfc571
The default value of clear_env is "yes", preserving previous behaviour.
cfc571
Patch by Paul Annesley.
cfc571
---
cfc571
 sapi/fpm/fpm/fpm_conf.c  | 3 +++
cfc571
 sapi/fpm/fpm/fpm_conf.h  | 1 +
cfc571
 sapi/fpm/fpm/fpm_env.c   | 4 +++-
cfc571
 sapi/fpm/php-fpm.conf.in | 9 +++++++++
cfc571
 4 files changed, 16 insertions(+), 1 deletion(-)
cfc571
cfc571
diff --git a/sapi/fpm/fpm/fpm_conf.c b/sapi/fpm/fpm/fpm_conf.c
cfc571
index cd5fc34d0f2d..688c6402505e 100644
cfc571
--- a/sapi/fpm/fpm/fpm_conf.c
cfc571
+++ b/sapi/fpm/fpm/fpm_conf.c
cfc571
@@ -148,6 +148,7 @@ static struct ini_value_parser_s ini_fpm_pool_options[] = {
cfc571
 	{ "chroot",                    &fpm_conf_set_string,      WPO(chroot) },
cfc571
 	{ "chdir",                     &fpm_conf_set_string,      WPO(chdir) },
cfc571
 	{ "catch_workers_output",      &fpm_conf_set_boolean,     WPO(catch_workers_output) },
cfc571
+	{ "clear_env",                 &fpm_conf_set_boolean,     WPO(clear_env) },
cfc571
 	{ "security.limit_extensions", &fpm_conf_set_string,      WPO(security_limit_extensions) },
cfc571
 	{ 0, 0, 0 }
cfc571
 };
cfc571
@@ -603,6 +604,7 @@ static void *fpm_worker_pool_config_alloc() /* {{{ */
cfc571
 	wp->config->listen_backlog = FPM_BACKLOG_DEFAULT;
cfc571
 	wp->config->pm_process_idle_timeout = 10; /* 10s by default */
cfc571
 	wp->config->process_priority = 64; /* 64 means unset */
cfc571
+	wp->config->clear_env = 1;
cfc571
 
cfc571
 	if (!fpm_worker_all_pools) {
cfc571
 		fpm_worker_all_pools = wp;
cfc571
@@ -1600,6 +1602,7 @@ static void fpm_conf_dump() /* {{{ */
cfc571
 		zlog(ZLOG_NOTICE, "\tchroot = %s",                     STR2STR(wp->config->chroot));
cfc571
 		zlog(ZLOG_NOTICE, "\tchdir = %s",                      STR2STR(wp->config->chdir));
cfc571
 		zlog(ZLOG_NOTICE, "\tcatch_workers_output = %s",       BOOL2STR(wp->config->catch_workers_output));
cfc571
+		zlog(ZLOG_NOTICE, "\tclear_env = %s",                  BOOL2STR(wp->config->clear_env));
cfc571
 		zlog(ZLOG_NOTICE, "\tsecurity.limit_extensions = %s",  wp->config->security_limit_extensions);
cfc571
 
cfc571
 		for (kv = wp->config->env; kv; kv = kv->next) {
cfc571
diff --git a/sapi/fpm/fpm/fpm_conf.h b/sapi/fpm/fpm/fpm_conf.h
cfc571
index efd65dc6d9d7..19bd7ff1f806 100644
cfc571
--- a/sapi/fpm/fpm/fpm_conf.h
cfc571
+++ b/sapi/fpm/fpm/fpm_conf.h
cfc571
@@ -83,6 +83,7 @@ struct fpm_worker_pool_config_s {
cfc571
 	char *chroot;
cfc571
 	char *chdir;
cfc571
 	int catch_workers_output;
cfc571
+	int clear_env;
cfc571
 	char *security_limit_extensions;
cfc571
 	struct key_value_s *env;
cfc571
 	struct key_value_s *php_admin_values;
cfc571
diff --git a/sapi/fpm/fpm/fpm_env.c b/sapi/fpm/fpm/fpm_env.c
cfc571
index 6b64fedfec47..2ff0bdc0e4bc 100644
cfc571
--- a/sapi/fpm/fpm/fpm_env.c
cfc571
+++ b/sapi/fpm/fpm/fpm_env.c
cfc571
@@ -143,7 +143,9 @@ int fpm_env_init_child(struct fpm_worker_pool_s *wp) /* {{{ */
cfc571
 	fpm_env_setproctitle(title);
cfc571
 	efree(title);
cfc571
 
cfc571
-	clearenv();
cfc571
+	if (wp->config->clear_env) {
cfc571
+		clearenv();
cfc571
+	}
cfc571
 
cfc571
 	for (kv = wp->config->env; kv; kv = kv->next) {
cfc571
 		setenv(kv->key, kv->value, 1);
cfc571
diff --git a/sapi/fpm/php-fpm.conf.in b/sapi/fpm/php-fpm.conf.in
cfc571
index af4f2fa325a3..6ce9b6325636 100644
cfc571
--- a/sapi/fpm/php-fpm.conf.in
cfc571
+++ b/sapi/fpm/php-fpm.conf.in
cfc571
@@ -475,6 +475,15 @@ pm.max_spare_servers = 3
cfc571
 ; Default Value: no
cfc571
 ;catch_workers_output = yes
cfc571
 
cfc571
+; Clear environment in FPM workers
cfc571
+; Prevents arbitrary environment variables from reaching FPM worker processes
cfc571
+; by clearing the environment in workers before env vars specified in this
cfc571
+; pool configuration are added.
cfc571
+; Setting to "no" will make all environment variables available to PHP code
cfc571
+; via getenv(), $_ENV and $_SERVER.
cfc571
+; Default Value: yes
cfc571
+;clear_env = no
cfc571
+
cfc571
 ; Limits the extensions of the main script FPM will allow to parse. This can
cfc571
 ; prevent configuration mistakes on the web server side. You should only limit
cfc571
 ; FPM to .php extensions to prevent malicious users to use other extensions to