From 8e3eee385e177923f313aa6dbaa02b00e8341955 Mon Sep 17 00:00:00 2001 From: Antony Dovgal Date: Fri, 1 Jun 2007 13:35:23 +0000 Subject: [PATCH] MFH: fix #41518 (file_exists() warns of open_basedir restriction on non-existent file) --- NEWS | 2 ++ .../tests/general_functions/bug41518.phpt | 28 +++++++++++++++++++ main/fopen_wrappers.c | 12 +++++++- 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 ext/standard/tests/general_functions/bug41518.phpt diff --git a/NEWS b/NEWS index 4a4313b6edf..e2ac69de203 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,8 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2007, PHP 5.2.4 +- Fixed bug #41518 (file_exists() warns of open_basedir restriction on + non-existent file). (Tony) - Fixed bug #39330 (apache2handler does not call shutdown actions before apache child die). (isk at ecommerce dot com, Gopal, Tony) diff --git a/ext/standard/tests/general_functions/bug41518.phpt b/ext/standard/tests/general_functions/bug41518.phpt new file mode 100644 index 00000000000..c15cae1212b --- /dev/null +++ b/ext/standard/tests/general_functions/bug41518.phpt @@ -0,0 +1,28 @@ +--TEST-- +Bug #41518 (file_exists() warns of open_basedir restriction on non-existent file) +--SKIPIF-- + +--INI-- +open_basedir=/tmp/ +--FILE-- + +--EXPECTF-- +bool(true) +bool(false) +Done diff --git a/main/fopen_wrappers.c b/main/fopen_wrappers.c index 88003527b54..c27a60f1285 100644 --- a/main/fopen_wrappers.c +++ b/main/fopen_wrappers.c @@ -172,8 +172,8 @@ PHPAPI int php_check_specific_open_basedir(const char *basedir, const char *path } } + resolved_name_len = strlen(resolved_name); if (path_tmp[path_len - 1] == PHP_DIR_SEPARATOR) { - resolved_name_len = strlen(resolved_name); if (resolved_name[resolved_name_len - 1] != PHP_DIR_SEPARATOR) { resolved_name[resolved_name_len] = PHP_DIR_SEPARATOR; resolved_name[++resolved_name_len] = '\0'; @@ -189,6 +189,16 @@ PHPAPI int php_check_specific_open_basedir(const char *basedir, const char *path /* File is in the right directory */ return 0; } else { + /* /openbasedir/ and /openbasedir are the same directory */ + if (resolved_basedir_len == (resolved_name_len + 1) && resolved_basedir[resolved_basedir_len - 1] == PHP_DIR_SEPARATOR) { +#if defined(PHP_WIN32) || defined(NETWARE) + if (strncasecmp(resolved_basedir, resolved_name, resolved_name_len) == 0) { +#else + if (strncmp(resolved_basedir, resolved_name, resolved_name_len) == 0) { +#endif + return 0; + } + } return -1; } } else {