|  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Doc Bug #60841 expand_filepath fails to resolve symlinks that point to \xxx\yyy
Submitted: 2012-01-22 21:16 UTC Modified: 2021-10-19 09:28 UTC
Avg. Score:4.3 ± 0.9
Reproduced:6 of 6 (100.0%)
Same Version:2 (33.3%)
Same OS:3 (50.0%)
From: Assigned:
Status: Verified Package: Filesystem function related
PHP Version: 7.4 OS: Windows
Private report: No CVE-ID: None
Have you experienced this issue?
Rate the importance of this bug to you:

 [2012-01-22 21:16 UTC]
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:

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');"

C:\>type t\testlink\foo


Add a Patch

Pull Requests

Add a Pull Request


AllCommentsChangesGit/SVN commitsRelated reports
 [2012-01-22 22:05 UTC]
It is not an absolute path but a relative path to the current drive.

It can have very different meanings withing a request (PWD and co). I remember to 
have made a doc about that back then, let me find it back and try to provide a fix 
or document it better.
 [2012-01-22 22:05 UTC]
-Status: Open +Status: Assigned -Assigned To: +Assigned To: pajoye
 [2017-10-24 07:35 UTC]
-Status: Assigned +Status: Open -Assigned To: pajoye +Assigned To:
 [2020-11-18 15:30 UTC]
-Status: Open +Status: Verified
 [2020-11-18 15:30 UTC]
Well, in Windows parlance[1], it is

| An absolute path from the root of the current drive.

[1] <>
 [2021-10-14 15:36 UTC]
-Operating System: Windows 7 +Operating System: Windows -PHP Version: 5.3.9 +PHP Version: 7.4
 [2021-10-14 15:36 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');"

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.


| An absolute path from the root of the current drive.

Doing the following after the supplied script may yield surprising


D:\>type C:\t\testlink\foo

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. ;)
 [2021-10-14 15:39 UTC]
-Type: Bug +Type: Documentation Problem -Assigned To: +Assigned To: cmb
 [2021-10-19 09:28 UTC]
-Assigned To: cmb +Assigned To:
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sat Apr 20 03:01:28 2024 UTC