]> granicus.if.org Git - php/commitdiff
fix #41518 (file_exists() warns of open_basedir restriction on non-existent file)
authorAntony Dovgal <tony2001@php.net>
Fri, 1 Jun 2007 13:33:48 +0000 (13:33 +0000)
committerAntony Dovgal <tony2001@php.net>
Fri, 1 Jun 2007 13:33:48 +0000 (13:33 +0000)
ext/standard/tests/general_functions/bug41518.phpt [new file with mode: 0644]
main/fopen_wrappers.c

diff --git a/ext/standard/tests/general_functions/bug41518.phpt b/ext/standard/tests/general_functions/bug41518.phpt
new file mode 100644 (file)
index 0000000..c15cae1
--- /dev/null
@@ -0,0 +1,28 @@
+--TEST--
+Bug #41518 (file_exists() warns of open_basedir restriction on non-existent file)
+--SKIPIF--
+<?php
+/* let's use /tmp here */
+$tmp_dir = "/tmp";
+if (!is_dir($tmp_dir) || realpath($tmp_dir) !== $tmp_dir) {
+       die("skip");
+}
+?>
+--INI--
+open_basedir=/tmp/
+--FILE--
+<?php
+
+$tmp_dir = "/tmp";
+$tmp_file = $tmp_dir."/bug41418.tmp";
+
+touch($tmp_file);
+var_dump(file_exists($tmp_file)); //exists
+var_dump(file_exists($tmp_file."nosuchfile")); //doesn't exist
+
+echo "Done\n";
+?>
+--EXPECTF--    
+bool(true)
+bool(false)
+Done
index 476b4c8442acb815217fda9a0a2cfa9e763e0672..895afc4a6c07fbe70123e419f6137dea32070a8f 100644 (file)
@@ -229,8 +229,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';
@@ -246,6 +246,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 {