Bug #60841 [Ver]: expand_filepath fails to resolve symlinks that point to \xxx\yyy

From: Date: Thu, 14 Oct 2021 15:36:58 +0000
Subject: Bug #60841 [Ver]: expand_filepath fails to resolve symlinks that point to \xxx\yyy
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-237196@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=60841&edit=1

 ID:                 60841
 Updated by:         cmb@php.net
 Reported by:        cataphract@php.net
 Summary:            expand_filepath fails to resolve symlinks that point
                     to \xxx\yyy
 Status:             Verified
 Type:               Bug
 Package:            Filesystem function related
-Operating System:   Windows 7
+Operating System:   Windows
-PHP Version:        5.3.9
+PHP Version:        7.4
 Block user comment: N
 Private report:     N

 New Comment:

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. ;)


Previous Comments:
------------------------------------------------------------------------
[2020-11-18 15:30:24] cmb@php.net

Well, in Windows parlance[1], it is

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

[1] <https://docs.microsoft.com/en-us/dotnet/standard/io/file-path-formats>

------------------------------------------------------------------------
[2018-06-12 12:04:48] cmb@php.net

Related To: Bug #76460

------------------------------------------------------------------------
[2012-01-22 22:05:32] pajoye@php.net

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 21:16:01] 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


------------------------------------------------------------------------



--
Edit this bug report at https://bugs.php.net/bug.php?id=60841&edit=1


Thread (5 messages)

« previous php.bugs (#237196) next »