]> granicus.if.org Git - php/commitdiff
- open_basedir symlink support for Windows
authorPierre Joye <pajoye@php.net>
Fri, 10 Sep 2010 17:45:13 +0000 (17:45 +0000)
committerPierre Joye <pajoye@php.net>
Fri, 10 Sep 2010 17:45:13 +0000 (17:45 +0000)
NEWS
UPGRADING
main/fopen_wrappers.c

diff --git a/NEWS b/NEWS
index 124d1ec0fa45206ae0e372ae08d666100e60d614..de59aad5aba421fd5a3760ea5a8afa0f74474e9a 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,7 @@
   (Andrey)
 - Improved support for is_link and related functions on Windows. (Pierre)
 
+- Implemented symbolic links support for open_basedir checks. (Pierre)
 - Implemented FR #51804, SplFileInfo::getLinkTarget on Windows. (Pierre)
 
 - Fixed symbolic resolution support when the target is a DFS share. (Pierre)
index 1197f04f482f9048125ef9562fb3c90e304045e8..23e64f2885257f9967ac11c852e9cec4d6e2935d 100755 (executable)
--- a/UPGRADING
+++ b/UPGRADING
@@ -457,6 +457,14 @@ UPGRADE NOTES - PHP 5.3
 - Firebird and SNMP support are no longer available on Windows. Firebird support
   may be reintroduced in the future.
 
+=====================
+11.1 New in PHP 5.3.4
+=====================
+
+- open_basedir supports now symbolic links (checks the target).
+- is_link and SplFileInfo symbolic links related method are now fully supported
+  (on Windows Vista or later).
+
 ===================
 12. New in PHP 5.3:
 ===================
index 70ae44265520c282b5f17af6f5804c0d8cf27afc..9b485f778f7e0dd7c761fd8cf9e6744a28b68ea9 100644 (file)
@@ -173,21 +173,27 @@ PHPAPI int php_check_specific_open_basedir(const char *basedir, const char *path
        memcpy(path_tmp, resolved_name, path_len + 1); /* safe */
 
        while (VCWD_REALPATH(path_tmp, resolved_name) == NULL) {
-#ifdef HAVE_SYMLINK
-               if (nesting_level == 0) {
-                       int ret;
-                       char buf[MAXPATHLEN];
-
-                       ret = readlink(path_tmp, buf, MAXPATHLEN - 1);
-                       if (ret < 0) {
-                               /* not a broken symlink, move along.. */
-                       } else {
-                               /* put the real path into the path buffer */
-                               memcpy(path_tmp, buf, ret);
-                               path_tmp[ret] = '\0';
+#if defined(PHP_WIN32) || defined(HAVE_SYMLINK)
+#if defined(PHP_WIN32)
+               if (EG(windows_version_info).dwMajorVersion > 5) {
+#endif
+                       if (nesting_level == 0) {
+                               int ret;
+                               char buf[MAXPATHLEN];
+
+                               ret = php_sys_readlink(path_tmp, buf, MAXPATHLEN - 1);
+                               if (ret < 0) {
+                                       /* not a broken symlink, move along.. */
+                               } else {
+                                       /* put the real path into the path buffer */
+                                       memcpy(path_tmp, buf, ret);
+                                       path_tmp[ret] = '\0';
+                               }
                        }
+#if defined(PHP_WIN32)
                }
 #endif
+#endif
 
 #if defined(PHP_WIN32) || defined(NETWARE)
                path_file = strrchr(path_tmp, DEFAULT_SLASH);