diff --git a/main/main.c b/main/main.c index f87a1427feda..325ef7ed531b 100644 --- a/main/main.c +++ b/main/main.c @@ -521,6 +521,7 @@ PHP_INI_BEGIN() STD_PHP_INI_ENTRY("default_mimetype", SAPI_DEFAULT_MIMETYPE, PHP_INI_ALL, OnUpdateString, default_mimetype, sapi_globals_struct,sapi_globals) STD_PHP_INI_ENTRY("error_log", NULL, PHP_INI_ALL, OnUpdateErrorLog, error_log, php_core_globals, core_globals) STD_PHP_INI_ENTRY("extension_dir", PHP_EXTENSION_DIR, PHP_INI_SYSTEM, OnUpdateStringUnempty, extension_dir, php_core_globals, core_globals) + STD_PHP_INI_ENTRY("sys_temp_dir", NULL, PHP_INI_SYSTEM, OnUpdateStringUnempty, sys_temp_dir, php_core_globals, core_globals) STD_PHP_INI_ENTRY("include_path", PHP_INCLUDE_PATH, PHP_INI_ALL, OnUpdateStringUnempty, include_path, php_core_globals, core_globals) PHP_INI_ENTRY("max_execution_time", "30", PHP_INI_ALL, OnUpdateTimeout) STD_PHP_INI_ENTRY("open_basedir", NULL, PHP_INI_ALL, OnUpdateBaseDir, open_basedir, php_core_globals, core_globals) diff --git a/main/php_globals.h b/main/php_globals.h index 170431d079c6..256765d665a5 100644 --- a/main/php_globals.h +++ b/main/php_globals.h @@ -85,6 +85,7 @@ struct _php_core_globals { char *open_basedir; char *extension_dir; char *php_binary; + char *sys_temp_dir; char *upload_tmp_dir; long upload_max_filesize; diff --git a/main/php_open_temporary_file.c b/main/php_open_temporary_file.c index b43d6a78351c..5d5e5b98d77a 100644 --- a/main/php_open_temporary_file.c +++ b/main/php_open_temporary_file.c @@ -196,6 +196,21 @@ PHPAPI const char* php_get_temporary_directory(void) return temporary_directory; } + /* Is there a temporary directory "sys_temp_dir" in .ini defined? */ + { + char *sys_temp_dir = PG(sys_temp_dir); + if (sys_temp_dir) { + int len = strlen(sys_temp_dir); + if (len >= 2 && sys_temp_dir[len - 1] == DEFAULT_SLASH) { + temporary_directory = zend_strndup(sys_temp_dir, len - 1); + return temporary_directory; + } else if (len >= 1 && sys_temp_dir[len - 1] != DEFAULT_SLASH) { + temporary_directory = zend_strndup(sys_temp_dir, len); + return temporary_directory; + } + } + } + #ifdef PHP_WIN32 /* We can't count on the environment variables TEMP or TMP, * and so must make the Win32 API call to get the default diff --git a/php.ini-development b/php.ini-development index ddba771a166c..a9c2d06e675a 100644 --- a/php.ini-development +++ b/php.ini-development @@ -731,6 +731,10 @@ user_dir = ; On windows: ; extension_dir = "ext" +; Directory where the temporary files should be placed. +; Defaults to the system default (see sys_get_temp_dir) +; sys_temp_dir = "/tmp" + ; Whether or not to enable the dl() function. The dl() function does NOT work ; properly in multithreaded servers, such as IIS or Zeus, and is automatically ; disabled on them. diff --git a/php.ini-production b/php.ini-production index 86c0e8f1c03e..76d5fb5dd6ce 100644 --- a/php.ini-production +++ b/php.ini-production @@ -732,6 +732,10 @@ user_dir = ; On windows: ; extension_dir = "ext" +; Directory where the temporary files should be placed. +; Defaults to the system default (see sys_get_temp_dir) +; sys_temp_dir = "/tmp" + ; Whether or not to enable the dl() function. The dl() function does NOT work ; properly in multithreaded servers, such as IIS or Zeus, and is automatically ; disabled on them. diff --git a/tests/basic/req60524.phpt b/tests/basic/req60524.phpt new file mode 100644 index 000000000000..6803e1fd88bf --- /dev/null +++ b/tests/basic/req60524.phpt @@ -0,0 +1,8 @@ +--TEST-- +Req #60524 (Specify temporary directory) +--INI-- +sys_temp_dir=/path/to/temp/dir +--FILE-- + +--EXPECT-- +/path/to/temp/dir