php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #44293 realpath does not follow Virtual directory
Submitted: 2008-02-29 15:46 UTC Modified: 2011-03-04 17:15 UTC
Votes:1
Avg. Score:5.0 ± 0.0
Reproduced:1 of 1 (100.0%)
Same Version:1 (100.0%)
Same OS:1 (100.0%)
From: mmichel at chez dot com Assigned:
Status: Not a bug Package: Filesystem function related
PHP Version: 5.2.5 OS: Win2003
Private report: No CVE-ID: None
 [2008-02-29 15:46 UTC] mmichel at chez dot com
Description:
------------
If you do a realpath('./elsewhere'), where elsewhere is a IIS virtual directory, realpath return FALSE.

Reproduce code:
---------------
- Use the default site in IIS6 (root=c:\inetpub\wwwroot)
- in the root directory create a folder called local
- Create a virtual directory (either via a network share or in another path on a local drive, e.g. C:\Elsewhere), and call it elsewhere

then

<?php
$local='./local';
$virt='./elsewhere';

$check_path=realpath($local);
print ($checkpath === FALSE) ? "local path not resolved<br>" : "local=$check_path<br>";

$check_path=realpath($virt);
print ($checkpath === FALSE) ? "virtual dir not recognized<br>" : "virtual=$check_path<br>";

?>

Expected result:
----------------
local=C:\Inetpub\wwwroot\local
virtual=C:\Elsewhere

Actual result:
--------------
local=C:\Inetpub\wwwroot\local
virtual=

Note that realpath does not return FALSE...

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2008-03-03 13:04 UTC] jani@php.net
What does this script output:

<?php
$local='./local';
$virt='./elsewhere';

var_dump(realpath($local));
var_dump(realpath($virt));

?>
 [2008-03-03 13:39 UTC] mmichel at chez dot com
it returns:
string(22) "C:\Inetpub\wwwroot\local" 
bool(false)
 [2008-03-03 13:45 UTC] mmichel at chez dot com
Moreover:
On this page http://php.uli.it/manual/hk/function.realpath.php
a comment provides this:
=8<=================================================================
This is a modified version of the code written by Dave, wich finds the absolute path of a virtual path, this function returns the absolute path, If you have php running on IIS Plataform you could find this very usefull

function mappath2($path) {
//this here bellow trims the last / in case it has it
If ($path{strlen($path)-1}=="/"){
$path = substr($path,0, strlen($path)-1);
}
$relative = str_repeat('../',substr_count($path,'/')-1);
// transforms virtual or relative path to an absolute path 
return realpath(substr($path,0,1)=='/' ? $relative.substr($path,1) : $path); 
}

the implementation would be like this
having

$imagepath = "/website001/images/catalog/";

$realpath = mappath2($imagepath);

The result in $realpath would be something like
C:\Inetpub\wwwroot\website001\images\catalog
=8<=================================================================

I tried the function and it did not worked.
 [2008-03-03 13:46 UTC] jani@php.net
.
.
$check_path=realpath($virt);
print ($checkpath === FALSE) ? "virtual dir not recognized<br>" :
.
.

That's your code, note the tiny typo there? :)

From the manual:
realpath() returns FALSE on failure, e.g. if the file does not exist.

I don't know what these 'Virtual dirs' are in IIS, but I guess they're not _filesystem_ things. realpath() is meant to be used with _filesystem_..
 [2008-03-03 13:56 UTC] mmichel at chez dot com
@jani:
Virtual dir is kind of a symlink handled by IIS rather than the OS.
Thus, the document_root for http://localhost/elsewhere/test.php is different from the one for http://localhost/local/test.php

Still, browsing to http://localhost/elsewhere works, and executing
http://localhost/elsewhere/test.php works.
 [2008-03-03 14:17 UTC] mmichel at chez dot com
@jani: typo was in the comment, not in my code. I checked :-)
 [2008-03-03 14:31 UTC] mmichel at chez dot com
Addendum from my 3 Mar 1:56pm UTC comment:
Whilst php is able to give me the realpath of the script http://localhost/elsewhere/test.php , asking for the realpath of http://localhost/elsewhere in the http://localhost/local/test.php script fails.
 [2008-03-03 14:48 UTC] jani@php.net
Try adding the trailing slash in the directory..
 [2008-03-03 15:03 UTC] mmichel at chez dot com
> Try adding the trailing slash in the directory..

No change.
 [2008-03-05 09:28 UTC] jani@php.net
So is there some path in your filesystem called "Elsewhere" which is relative to the current working directory? If there is, then this is a bug, but if there isn't, then it's not a bug.
 [2008-03-06 12:45 UTC] mmichel at chez dot com
yes there is.

Elsewhere could be accessed with ../../Elsewhere from the root directory of the website.

Virtual Directories in IIS try to mimic symlinks, but they are not real files that can be tracked down like symlinks. This may be the problem determining the realpath.
 [2008-03-11 21:56 UTC] jani@php.net
Well, there's the problem: realpath() is an OS filesystem function and doesn't give a damn about any "virtual" stuff IIS might provide. No bug.
 [2011-03-04 17:06 UTC] bko_san at hotmail dot com
Surely this is a bug? If PHP doesn't follow Virtual Directories then (as far as PHP is concerned) the path doesn't exist and should return FALSE but it returns the PHP exe path on my rig.
 [2011-03-04 17:15 UTC] pajoye@php.net
because that's what the CWD is.
 
PHP Copyright © 2001-2020 The PHP Group
All rights reserved.
Last updated: Thu Dec 03 09:01:24 2020 UTC