ID:               31570
 Comment by:       inspiretheweb at googlemail dot com
 Reported By:      twadzilla at gmail dot com
 Status:           No Feedback
 Bug Type:         Scripting Engine problem
 Operating System: Redhat 9
 PHP Version:      5CVS-2005-01-16
 New Comment:

This problem still exists in PHP 5.2.5 (Mac OS X, Apache 2.2), and is
quite a nuisance to be honest.

It seems to be due to the fact that the current working directory
changes to '/' before object-destructors are called (at least under
Apache).

Although this is noted at
http://php.net/manual/en/language.oop5.decon.php, I think that object
destructors should be called before any changes are made to the current
working directory.

For developers who are unaware of this behavior, it is going to be
quite difficult for them to debug the issue in their application. If for
any reason this behavior is not going to change, it should at least be
displayed as a warning in the PHP manual, rather than a small notice.


Previous Comments:
------------------------------------------------------------------------

[2006-05-25 01:19:58] paul at stunning-stuff dot com

Hi,

I'm using PHP 5.1.4 and this bug still exists.
Including or requiring a file in the destructor using a relative path
spits out an error.

It seems to me that any user-made code, including destructors should
always be called before PHP cleans up anything.

Thanks,

Paul

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

[2005-05-02 01:00:05] php-bugs at lists dot php dot net

No feedback was provided for this bug for over a week, so it is
being suspended automatically. If you are able to provide the
information that was originally requested, please do so and change
the status of the bug back to "Open".

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

[2005-04-24 16:50:45] [EMAIL PROTECTED]

Please try using this CVS snapshot:

  http://snaps.php.net/php5-latest.tar.gz
 
For Windows:
 
  http://snaps.php.net/win32/php5-win32-latest.zip



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

[2005-01-19 08:42:12] twadzilla at gmail dot com

The line in foo.php: $absolute = "/home/test/www/$abs";
should be: $absolute = "/home/test/www/$relative";

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

[2005-01-16 14:43:11] twadzilla at gmail dot com

Description:
------------
PHP generates a warning inside a class destructor when you try to read
a file, because apparently it cannot resolve relative paths by the time
when the destructor is called for referenced objects.

When the open_basedir config is commented out, only the "include"
directive resolves the relative path; the other file-reading methods
fail.

When open_basedir is in effect, it causes all the methods to fail,
including the "include" directive.

The following issue is demonstrated at:
http://test.kneetoe.com/foo.php
http://test.kneetoe.com/foo.php.txt
(alternatively with more checks):
http://test.kneetoe.com/foo2.php
http://test.kneetoe.com/foo2.php.txt

I recommend that class destructors get executed before the ability to
resolve relative paths gets unloaded.

http://test.kneetoe.com/phpinfo.php

Reproduce code:
---------------
[httpd.conf]:
php_admin_value open_basedir /home/test/www

[/home/test/www/bar.html]:
Bar!

[/home/test/www/foo.php]:
class Foo {
    function __destruct() {
        $relative = 'bar.html';
        $absolute = "/home/test/www/$abs";
        echo "Absolute 'include': ";
        include $absolute;
        echo "Relative 'include': ";
        include $relative;
        echo "Absolute 'readfile': ";
        readfile($absolute);
        echo "Relative 'readfile': ";
        readfile($relative);
    }
}
print "<h2>Non-referenced (immediate destruction):</h2>";
new Foo;
print "<h2>Referenced (delayed destruction):</h2>";
$a = new Foo;

Expected result:
----------------
Non-referenced (immediate destruction):
Absolute 'include': Bar!
Relative 'include': Bar!
Absolute 'readfile': Bar!
Relative 'readfile': Bar!

Referenced (delayed destruction):
Absolute 'include': Bar!
Relative 'include': Bar!
Absolute 'readfile': Bar!
Relative 'readfile': Bar!


Actual result:
--------------
[[[open_basedir commented out]]]:

Non-referenced (immediate destruction):
Absolute 'include': Bar!
Relative 'include': Bar!
Absolute 'readfile': Bar!
Relative 'readfile': Bar!

Referenced (delayed destruction):
Absolute 'include': Bar!
Relative 'include': Bar!
Absolute 'readfile': Bar!
Relative 'readfile': 

Warning:  readfile(bar.html) [function.readfile]: failed to open
stream: No such file or directory in /home/test/www/foo.php on line 19



[[[open_basedir in effect]]]:

Non-referenced (immediate destruction):
Absolute 'include': Bar!
Relative 'include': Bar!
Absolute 'readfile': Bar!
Relative 'readfile': Bar!

Referenced (delayed destruction):
Absolute 'include': Bar!
Relative 'include': 

Warning:  Foo::__destruct() [function.--destruct]: open_basedir
restriction in effect. File(./bar.html) is not within the allowed
path(s): (/home/test/www) in /home/test/www/foo.php on line 13



Warning:  Foo::__destruct(bar.html) [function.--destruct]: failed to
open stream: Operation not permitted in /home/test/www/foo.php on line
13



Warning:  Foo::__destruct() [function.include]: Failed opening
'bar.html' for inclusion (include_path='.:/usr/local/lib/php') in
/home/test/www/foo.php on line 13

Absolute 'readfile': Bar!
Relative 'readfile': 

Warning:  readfile() [function.readfile]: open_basedir restriction in
effect. File(bar.html) is not within the allowed path(s):
(/home/test/www) in /home/test/www/foo.php on line 19



Warning:  readfile(bar.html) [function.readfile]: failed to open
stream: Operation not permitted in /home/test/www/foo.php on line 19


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


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

Reply via email to