Edit report at https://bugs.php.net/bug.php?id=52587&edit=1
ID: 52587
Comment by: snooops84 at googlemail dot com
Reported by: a-krcrai at microsoft dot com
Summary: Clearstatcache() has no effect
Status: Assigned
Type: Bug
Package: *Directory/Filesystem functions
Operating System: Windows
PHP Version: 5.3.3
Assigned To: pajoye
Block user comment: N
Private report: N
New Comment:
Hello,
im able to reproduce this on Debian 6 (Linux some 2.6.32-5-amd64 #1 SMP Sun Sep
23 10:07:46 UTC 2012 x86_64 GNU/Linux) with PHP 5.3.3-7+squeeze14.
getfacl meyer.txt
user:www-data:rwx #effective:r--
my test.php
if (is_writable('meyer.txt')) {
echo 'writeable';
}
else {
echo 'not writeable';
}
if i execute this with su - www-data -s /bin/bash i get "not writeable", but if
i try to move it by hand with as www-data with mv meyer.txt foo.txt it works! i
get the same behavior with fopen (it returns false).
Previous Comments:
------------------------------------------------------------------------
[2010-08-12 11:14:40] [email protected]
Will double check that with Kris once I'm back.
------------------------------------------------------------------------
[2010-08-12 04:54:37] a-krcrai at microsoft dot com
Oh, and this was reproduced on both VC6 and VC9 I'm pretty sure.
------------------------------------------------------------------------
[2010-08-12 04:53:30] a-krcrai at microsoft dot com
If you're getting all true dumps, then that means that either you're using
5.2.x (which I'm assuming you're not), or it means that the directory/file
exists but that the permissions aren't being successfully applied (or some
other weird ACL issue on your system).
This is because, even if you couldn't reproduce the bug, you should still be
getting false for the first two results, since full access is being denied
(meaning the file should be neither readable nor writable).
Fortunately, debugging this is pretty simple. I'd like you to do two things
for me, if you don't mind:
1. Pipe the exec calls to an array (see php.net/exec for details on how to do
this), then do a print_r() of said array and paste the output of that here.
This will show us if SetACL is having trouble setting the permissions on your
system.
2. *Either*:
After the first pair of var_dumps, go ahead and temporarily toss in a die()
statement and re-run the script. Then, from the command-line, type "notepad
testdir/testfile". If the SetACL calls executed properly, this should pop-up a
Notepad window with an "Access Denied" popup message. If, on the other hand,
Notepad loads your file just fine, then that means the file is readable and
thus the ACL permissions were never applied.
*Or*:
If you have Powershell installed, open that and CD to whatever directory your
PHP script is in. Then type "get-acl testdir/testfile | format-list" and paste
the output here.
------------------------------------------------------------------------
[2010-08-12 04:42:25] [email protected]
Just did a test following the steps from your comment, my results are so far:
php-trunk, VC9, x86, ZTS/NTS:
bool(true)
bool(true)
bool(true)
bool(true)
php-53, VC9, x86, ZTS/NTS:
bool(true)
bool(true)
bool(true)
bool(true)
I interpreted your steps as:
1) mkdir testdir
2) php -r "file_put_contents('./testdir/testfile', 'PHP on Windows');"
3) Make a php file with the above code inside
4) php bug52587.php
About ACL:
C:\php>setacl -help
SetACL by Helge Klein
Homepage: http://setacl.sourceforge.net
Version: 2.0.3.0
Copyright: Helge Klein
License: GPL
Did you use VC6 or VC9 binaries for your testing?
------------------------------------------------------------------------
[2010-08-12 03:20:14] a-krcrai at microsoft dot com
Description:
------------
The results of is_readable() and is_writable() are being cached from the first
result on a filesystem object regardless of whether or not clearstatcache() is
used or in what form (arguments supplied, etc). This has only been tested on
the Windows build of PHP 5.3.3 via the CLI. It's possible that other functions
are being improperly cached as well, but I haven't had time to test for all of
them as of yet.
This does *not*, however, occur in the corresponding Windows builds of PHP
5.3.2. In that version, no caching took place on either of those functions at
all.
You can easily reproduce this issue if you're running Windows ACL-related tests
on the filesystem in PHP 5.3.3. The sample script I put together requires the
use of SetACL (better cross-Windows version portability;
http://setacl.sourceforge.net) to alter the file permissions. Relative to the
test script, create a directory named "testdir", then touch a file within that
directory and name it "testfile". We will be using that file for our test.
This bug occurs on the ZIP-build of PHP 5.3.3 (both nts and zts) run via CLI
without any extensions loaded. It has been successfully reproduced in Windows
XP, Windows 2003, Windows 2003 R2, Windows Vista/7, Windows 2008, and Windows
2008 R2. Has not been tested on Linux.
Test script:
---------------
<?php
exec( "setacl.exe -on testdir -ot file -actn setprot -op
\"dacl:p_nc;sacl:p_nc\" -rec cont_obj" ); //Isolate from any perms inherited
from parent.
exec( "setacl.exe -on testdir -ot file -actn clear -clr DACL -rec cont_obj" );
//Clear any remaining perms.
exec( "setacl.exe -on testdir -ot file -actn ace -ace
\"n:Everyone;m:grant;p:full\"" ); //Ensures that the parent dir perms won't
affect the results.
exec( "setacl.exe -on testdir/testfile -ot file -actn ace -ace
\"n:Everyone;m:deny;p:full\"" );
var_dump( is_readable( "testdir/testfile" ) );
var_dump( is_writable( "testdir/testfile" ) );
//Tried different variations of clearstatcache() by themselves and combined.
Made no difference either way. Using sleep() after setacl call made no
difference, either.
clearstatcache();
clearstatcache( TRUE, "testdir/testfile" );
exec( "setacl.exe -on testdir/testfile -ot file -actn clear -clr DACL" );
exec( "setacl.exe -on testdir/testfile -ot file -actn ace -ace
\"n:Everyone;m:grant;p:full\"" );
/* Copy these two var_dumps into a separate PHP file and execute it immediately
after this script.... You'll see the correct bool(true) results then.
* You can also achieve that result by calling that separate script from this
one via an exec() call (but not as an include). --Kris */
var_dump( is_readable( "testdir/testfile" ) );
var_dump( is_writable( "testdir/testfile" ) );
Expected result:
----------------
bool(false)
bool(false)
bool(true)
bool(true)
Actual result:
--------------
bool(false)
bool(false)
bool(false)
bool(false)
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=52587&edit=1