Download | Plain Text | Line Numbers


diff -Naur php-7.0.0.orig/main/php_ini.c php-7.0.0/main/php_ini.c
--- php-7.0.0.orig/main/php_ini.c	2015-09-29 23:48:27.000000000 +0200
+++ php-7.0.0/main/php_ini.c	2015-10-13 02:16:19.948363968 +0200
@@ -775,6 +775,55 @@
 }
 /* }}} */
 
+/* {{{  php_parse_extra_ini
+ */
+PHPAPI int php_parse_extra_ini(const char *ini_file)
+{
+	if (!sapi_module.php_ini_ignore && ini_file) {
+		zend_stat_t sb;
+		zend_file_handle fh;
+
+		if (VCWD_STAT(ini_file, &sb) == 0) {
+			if (S_ISREG(sb.st_mode)) {
+				memset(&fh, 0, sizeof(fh));
+				if ((fh.handle.fp = VCWD_FOPEN(ini_file, "r"))) {
+					fh.filename = ini_file;
+					fh.type = ZEND_HANDLE_FP;
+
+					/* Reset active ini section */
+					RESET_ACTIVE_INI_HASH();
+
+					/* add a fake-host section so our settings will be changed to PHP_INI_SYSTEM during merge */
+					zval fakehost;
+					ZVAL_NEW_STR(&fakehost, zend_string_init(ZEND_STRL("HOST=\%fake\%"), 0));
+					php_ini_parser_cb(&fakehost, NULL, NULL, ZEND_INI_PARSER_SECTION, &configuration_hash);
+
+					if (zend_parse_ini_file(&fh, 1, ZEND_INI_SCANNER_NORMAL, (zend_ini_parser_cb_t) php_ini_parser_cb, &configuration_hash) == SUCCESS) {
+						/* add the file to the list of ini files read */
+						int add_len = (int)strlen(ini_file) + 2;
+
+						int php_ini_scanned_files_len = (php_ini_scanned_files) ? (int)strlen(php_ini_scanned_files) + 1 : 0;
+						php_ini_scanned_files = (char *) realloc(php_ini_scanned_files, php_ini_scanned_files_len + add_len + 1);
+						if (!php_ini_scanned_files_len) {
+							*php_ini_scanned_files = '\0';
+						}
+						add_len += php_ini_scanned_files_len;
+						if (php_ini_scanned_files_len) {
+							php_ini_scanned_files[php_ini_scanned_files_len - 2] = '\0';
+							strlcat(php_ini_scanned_files, ",\n", add_len);
+						}
+						strlcat(php_ini_scanned_files, ini_file, add_len);
+						strlcat(php_ini_scanned_files, "\n", add_len);
+						return SUCCESS;
+					}
+				}
+			}
+		}
+	}
+	return FAILURE;
+}
+/* }}} */
+
 /* {{{ php_ini_activate_config
  */
 PHPAPI void php_ini_activate_config(HashTable *source_hash, int modify_type, int stage)
diff -Naur php-7.0.0.orig/main/php_ini.h php-7.0.0/main/php_ini.h
--- php-7.0.0.orig/main/php_ini.h	2015-09-29 23:48:27.000000000 +0200
+++ php-7.0.0/main/php_ini.h	2015-10-13 01:52:56.792333183 +0200
@@ -34,6 +34,7 @@
 PHPAPI int cfg_get_double(const char *varname, double *result);
 PHPAPI int cfg_get_string(const char *varname, char **result);
 PHPAPI int php_parse_user_ini_file(const char *dirname, char *ini_filename, HashTable *target_hash);
+PHPAPI int php_parse_extra_ini(const char *ini_file);
 PHPAPI void php_ini_activate_config(HashTable *source_hash, int modify_type, int stage);
 PHPAPI int php_ini_has_per_dir_config(void);
 PHPAPI int php_ini_has_per_host_config(void);
diff -Naur php-7.0.0.orig/sapi/cgi/cgi_main.c php-7.0.0/sapi/cgi/cgi_main.c
--- php-7.0.0.orig/sapi/cgi/cgi_main.c	2015-09-29 23:48:14.000000000 +0200
+++ php-7.0.0/sapi/cgi/cgi_main.c	2015-10-13 01:52:22.729750143 +0200
@@ -819,6 +819,9 @@
 	}
 
 	if (php_ini_has_per_host_config()) {
+		/* activate our fake host entries. lowercase string required! */
+		php_ini_activate_per_host_config(ZEND_STRL("\%fake\%"));
+
 		/* Activate per-host-system-configuration defined in php.ini and stored into configuration_hash during startup */
 		if (fcgi_is_fastcgi()) {
 			fcgi_request *request = (fcgi_request*) SG(server_context);
@@ -919,6 +922,7 @@
 	if (php_module_startup(sapi_module, &cgi_module_entry, 1) == FAILURE) {
 		return FAILURE;
 	}
+	php_parse_extra_ini(getenv("PHP_INI_EXTRA"));
 	return SUCCESS;
 }
 
diff -Naur php-7.0.0.orig/sapi/cli/php_cli.c php-7.0.0/sapi/cli/php_cli.c
--- php-7.0.0.orig/sapi/cli/php_cli.c	2015-09-29 23:48:14.000000000 +0200
+++ php-7.0.0/sapi/cli/php_cli.c	2015-10-13 01:51:26.813793056 +0200
@@ -423,6 +423,7 @@
 	if (php_module_startup(sapi_module, NULL, 0)==FAILURE) {
 		return FAILURE;
 	}
+	php_parse_extra_ini(getenv("PHP_INI_EXTRA"));
 	return SUCCESS;
 }
 /* }}} */
@@ -1335,6 +1336,11 @@
 		CG(compiler_options) |= ZEND_COMPILE_EXTENDED_INFO;
 	}
 
+	if (php_ini_has_per_host_config()) {
+		/* activate our fake host entries. lowercase string required! */
+		php_ini_activate_per_host_config(ZEND_STRL("\%fake\%"));
+	}
+
 	zend_first_try {
 #ifndef PHP_CLI_WIN32_NO_CONSOLE
 		if (sapi_module == &cli_sapi_module) {
diff -Naur php-7.0.0.orig/sapi/fpm/fpm/fpm_conf.c php-7.0.0/sapi/fpm/fpm/fpm_conf.c
--- php-7.0.0.orig/sapi/fpm/fpm/fpm_conf.c	2015-09-29 23:48:14.000000000 +0200
+++ php-7.0.0/sapi/fpm/fpm/fpm_conf.c	2015-10-13 01:50:11.012495625 +0200
@@ -154,6 +154,7 @@
 	{ "catch_workers_output",      &fpm_conf_set_boolean,     WPO(catch_workers_output) },
 	{ "clear_env",                 &fpm_conf_set_boolean,     WPO(clear_env) },
 	{ "security.limit_extensions", &fpm_conf_set_string,      WPO(security_limit_extensions) },
+	{ "extra_ini",                 &fpm_conf_set_string,      WPO(extra_ini) },
 #ifdef HAVE_APPARMOR
 	{ "apparmor_hat",              &fpm_conf_set_string,      WPO(apparmor_hat) },
 #endif
@@ -655,6 +656,7 @@
 	free(wpc->chroot);
 	free(wpc->chdir);
 	free(wpc->security_limit_extensions);
+	free(wpc->extra_ini);
 #ifdef HAVE_APPARMOR
 	free(wpc->apparmor_hat);
 #endif
@@ -970,6 +972,11 @@
 			}
 		}
 
+		/* extra_ini */
+		if (wp->config->extra_ini && *wp->config->extra_ini) {
+			fpm_evaluate_full_path(&wp->config->extra_ini, wp, NULL, 0);
+		}
+
 		/* chroot */
 		if (wp->config->chroot && *wp->config->chroot) {
 
@@ -1643,6 +1650,7 @@
 		zlog(ZLOG_NOTICE, "\tcatch_workers_output = %s",       BOOL2STR(wp->config->catch_workers_output));
 		zlog(ZLOG_NOTICE, "\tclear_env = %s",                  BOOL2STR(wp->config->clear_env));
 		zlog(ZLOG_NOTICE, "\tsecurity.limit_extensions = %s",  wp->config->security_limit_extensions);
+		zlog(ZLOG_NOTICE, "\textra_ini = %s",                  STR2STR(wp->config->extra_ini));
 
 		for (kv = wp->config->env; kv; kv = kv->next) {
 			zlog(ZLOG_NOTICE, "\tenv[%s] = %s", kv->key, kv->value);
diff -Naur php-7.0.0.orig/sapi/fpm/fpm/fpm_conf.h php-7.0.0/sapi/fpm/fpm/fpm_conf.h
--- php-7.0.0.orig/sapi/fpm/fpm/fpm_conf.h	2015-09-29 23:48:14.000000000 +0200
+++ php-7.0.0/sapi/fpm/fpm/fpm_conf.h	2015-10-13 01:46:11.755400623 +0200
@@ -86,6 +86,7 @@
 	int catch_workers_output;
 	int clear_env;
 	char *security_limit_extensions;
+	char *extra_ini;
 	struct key_value_s *env;
 	struct key_value_s *php_admin_values;
 	struct key_value_s *php_values;
diff -Naur php-7.0.0.orig/sapi/fpm/fpm/fpm_main.c php-7.0.0/sapi/fpm/fpm/fpm_main.c
--- php-7.0.0.orig/sapi/fpm/fpm/fpm_main.c	2015-09-29 23:48:14.000000000 +0200
+++ php-7.0.0/sapi/fpm/fpm/fpm_main.c	2015-10-13 01:47:14.202469418 +0200
@@ -752,6 +752,9 @@
 	}
 
 	if (php_ini_has_per_host_config()) {
+		/* activate our fake host entries. lowercase string required! */
+		php_ini_activate_per_host_config(ZEND_STRL("\%fake\%"));
+
 		/* Activate per-host-system-configuration defined in php.ini and stored into configuration_hash during startup */
 		server_name = FCGI_GETENV(request, "SERVER_NAME");
 		/* SERVER_NAME should also be defined at this stage..but better check it anyway */
diff -Naur php-7.0.0.orig/sapi/fpm/fpm/fpm_php.c php-7.0.0/sapi/fpm/fpm/fpm_php.c
--- php-7.0.0.orig/sapi/fpm/fpm/fpm_php.c	2015-09-29 23:48:14.000000000 +0200
+++ php-7.0.0/sapi/fpm/fpm/fpm_php.c	2015-10-13 01:46:42.764931364 +0200
@@ -216,6 +216,8 @@
 
 int fpm_php_init_child(struct fpm_worker_pool_s *wp) /* {{{ */
 {
+	php_parse_extra_ini(wp->config->extra_ini);
+
 	if (0 > fpm_php_apply_defines(wp) ||
 		0 > fpm_php_set_allowed_clients(wp)) {
 		return -1;