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

 ID:                 65069
 Updated by:         a...@php.net
 Reported by:        s...@php.net
 Summary:            GlobIterator fails to access files inside an
                     open_basedir restricted dir
 Status:             Analyzed
 Type:               Bug
 Package:            SPL related
 Operating System:   Windows7
 PHP Version:        5.5.0RC3
 Block user comment: N
 Private report:     N

 New Comment:

Ah, just to mention, GlobIterator is the same as 
DirectoryIterator('glob://....') 
... so that on is broken too.


Previous Comments:
------------------------------------------------------------------------
[2013-06-21 15:15:25] a...@php.net

Ok, the issue is much more complicated than it looks. This is a very tricky 
case 
because the glob pattern check against the open_basedir value obviously makes 
no 
sense. The implementation of the glob function is simply to

- expand the pattern
- iterate checking for basedir restriction on every item
- discard result and return false if one of them was not within basedir


What's going on in GlobIterator is to check the basedir against the pattern in 
__construct, that obviously will never work properly. Also, glob extends 
Filesystem iterator, only __construct() and count() methods are implemented. 

Two solutions come in my mind:

- do the same teh glob() function does, do the work in construct and throw 
exception if one of the paths isn't allowed (but that means doing the work 
twice), so no go
- impement the necessary methods in GlobIterator, like current(), next(), etc. 
.. this seems more plausible, however the situation where a value isn't within 
basedir, what would for instance current() return? false? ... 

Looks like a big behavior change anyway. Any ideas for a better fix?

Thanks

------------------------------------------------------------------------
[2013-06-20 19:04:02] a...@php.net

Ok, inside destructor it reproducible for me on windows CLI, that's already 
something one can debug :) But the original snippet still doesn't fail that 
way. 
And trying DirectoryIterator at that play it works ... so most likely 
GlobIterator 
is broken somehow.

------------------------------------------------------------------------
[2013-06-20 18:01:00] jamie at media32 dot ca

I forgot to mention in my previous comment that I'm running PHP 5.4.14 on OSX 
Lion.

------------------------------------------------------------------------
[2013-06-20 17:59:42] s...@php.net

On CLI I also get the same problem, Win7 x64 + PHP 5.5.0RC3 or 5.4.3. 

With PHP 5.3.5 and 5.4.6 on linux it works fine though. Seems it might be 
windows specific. Although as Jamie says it can maybe be triggered in other 
ways than using windows.

------------------------------------------------------------------------
[2013-06-20 17:56:42] jamie at media32 dot ca

I think I can reproduce this. It only happens when the GlobIterator is used 
inside the destructor, and the script is run using Apache/Mod PHP (running via 
CLI returns the correct results).

<?php
error_reporting(-1);
ini_set('display_errors', 1);
ini_set('open_basedir', __DIR__);

class Globber
{
        public function __destruct()
        {
                var_dump(__DIR__);
                var_dump(glob(__DIR__ . '/*.php'));
                var_dump(iterator_to_array(new \GlobIterator(__DIR__ 
.'/*.php')));
        }
}

$globber = new Globber;
?>

When running via Apache/Mod PHP an UnexpectedValueException is thrown.

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


The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at

    https://bugs.php.net/bug.php?id=65069


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

Reply via email to