From 1d033e1875b9a8f9b6a238bbf2583425557e85d2 Mon Sep 17 00:00:00 2001 From: ALeX Kazik Date: Fri, 18 Jan 2013 17:13:39 +0100 Subject: [PATCH] Implemented Feature #60524 (sys_temp_dir) Added a new configuration directive which allows it to change the temporary directory, the default behavior is unchanged. This is a useful option if you use all/some hosts inside of one .ini file with sections and want to change the temp dir per user (maybe it's not allowed to write outside the users home directory). Since the TMPDIR variable affects the whole php that way can not be used for this scenario. (see https://bugs.php.net/bug.php?id=60524) --- main/main.c | 1 + main/php_globals.h | 1 + main/php_open_temporary_file.c | 15 +++++++++++++++ php.ini-development | 4 ++++ php.ini-production | 4 ++++ tests/basic/req60524.phpt | 8 ++++++++ 6 files changed, 33 insertions(+) create mode 100644 tests/basic/req60524.phpt diff --git a/main/main.c b/main/main.c index f87a1427feda4..325ef7ed531b3 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 170431d079c63..256765d665a53 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 b43d6a78351c7..5d5e5b98d77a0 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 ddba771a166cb..a9c2d06e675a8 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 86c0e8f1c03e3..76d5fb5dd6ce2 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 0000000000000..6803e1fd88bfe --- /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