|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2012-01-22 21:16 UTC] cataphract@php.net
Description:
------------
If a path includes a symlink that points to a path like \xxx\yyy, PHP understands
it as a relative path, while it's actually an absolute path (or quasi-absolute,
as it doesn't have a drive letter).
Expected result:
----------------
foocontents
Actual result:
--------------
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
C:\Windows\system32>cd \
C:\>mkdir t
C:\>mkdir t\test
C:\>mklink /D t\testlink \t\test
symbolic link created for t\testlink <<===>> \t\test
C:\>echo foocontents > \t\testlink\foo
C:\>php -r "echo file_get_contents('t\testlink\foo');"
Warning: file_get_contents(t\testlink\foo): failed to open stream: No such file
or directory in Command line code on line 1
C:\>php -r "echo file_get_contents('t\test\foo');"
foocontents
C:\>type t\testlink\foo
foocontents
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Oct 24 20:00:01 2025 UTC |
This is not particularly related to expand_file(), but rather to tsrm_realpath_r(), as the following shows: C:\>php -r "echo file_get_contents('t\testlink\foo');" C:\t\t\test\foo As it is now, PHP on Windows properly supports: * absolute paths with drive letter * relative paths without drive letter * UNC paths However, it does not fully support: * absolute paths without drive letter (this ticket) * relative paths with drive letter (bug #78939) Fixing this is certainly possible, but in my opinion this must not be done for any stable PHP branch, to avoid behavioral changes, and even security issues, and requires extensive testing, due to the complexity of tsrm_realpath_r(). It is important, though, to document this issue. FTR: | An absolute path from the root of the current drive. Doing the following after the supplied script may yield surprising results: C:\>D: D:\>type C:\t\testlink\foo foocontents So the current drive when resolving the symlink is not the current drive, but apparently the drive on which the link is stored. Interestingly, when opening the file properties dialog of C:\t\testlink in Explorer, it shows C:\t\t\test, so one may argue that PHP's behavior is correct. ;)