Bug #73884 [Opn]: is_dir() returns false for junction / symlinkd
| From: | ab@php.net | Date: | Thu, 12 Jan 2017 21:50:14 +0000 |
| Subject: | Bug #73884 [Opn]: is_dir() returns false for junction / symlinkd | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-206586@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=73884&edit=1
ID: 73884
Updated by: ab@php.net
Reported by: kulakov74 at yandex dot ru
Summary: is_dir() returns false for junction / symlinkd
Status: Open
Type: Bug
Package: Filesystem function related
Operating System: Windows 8.1
PHP Version: 7.1.0
Block user comment: N
Private report: N
New Comment:
Oh, that's interesting. That's a good spot then. Were some how new to me. Or more
precisely - of course, it's possible to use another encoding, weird is it's done on system
supplied objects :/ Any FS objects created/read by PHP or other programs correctly handling Unicode,
is fine with 7.1. Your workaround is actually documented in UPGRADING ;) - if there's need to
work with incompatible items, etc., normally configuring for the system codepages would be fine.
So is_dir() and other works as expceted, when you set another codepage? In that case, the issue
might be resolved.
Thanks.
Previous Comments:
------------------------------------------------------------------------
[2017-01-12 20:06:07] kulakov74 at yandex dot ru
>>sure the file is UTF-8 encoded?
Yes, but it doesn't even matter cause the point is in the targets' charset.
Tested again on Win 8.1, and the trick with default_charset=Windows-1251 worked again :)
------------------------------------------------------------------------
[2017-01-12 15:59:41] ab@php.net
Hmm, you previous 4 runs was on console. In the last snippet you show - sure the file is UTF-8
encoded? The hardcoded data have to be in same encoding as the one configured in INI. In PHP before
7.1, the ANSI APIs are used, so the encoding INI doesn't affect anything. I was earlier not
able to reproduce issues with any of the 4 runs you've shown earlier, including the ones with
multibyte dir/junction, as linked in the post above. To me, it still seems as a permission issue
with the specific path on your side.
There's probably no way around, other than me to ask you to please pack an isolated stable
repro case. Too much time spent with just shooting in the sky :(
Thanks.
------------------------------------------------------------------------
[2017-01-12 15:15:34] kulakov74 at yandex dot ru
>>please retry putting the code into a file
As I wrote I did so.
I tested with Windows 7 x64 - the bug is still there for both "c:\Users\All Users" and
junctions to cyrillic directories. Note that for me is_dir() gives true if the junction itself is
cyrillic but the target is latin. The bug shows only if the target is cyrillic, no matter what
charset of the link is.
I also tried the old PHP 5.5 and it gave me correct result with jun2ru (target is rus), but not for
All Users. I compared phpinfo() output of both versions and found a difference: in 5.5
default_charset="" while in 7.1 it's UTF-8. I tried using different values for
default_charset and finally got correct result with Windows-1251 (Cyrillic):
ini_set('default_charset', 'Windows-1251');
echo(ini_get('default_charset')."\n");
$p='c:\temp\ÑÑÑ2ÑÑÑ';
var_dump(is_dir($p), readlink($p));
This way PHP 7.1 was correct, at the same time when I used UTF-8 / no value / iso-8859-1 it was not.
With PHP 5.5 it seems you can use any default_charset.
It may be that is_dir() depends on what language is installed in the system, I have Russian
installed and for me Windows-1251 worked with PHP 7.
"c:\Users\All Users\" doesn't work at all in both versions.
------------------------------------------------------------------------
[2017-01-11 22:51:12] ab@php.net
Hmm, but again,
$ x64\Release\php.exe -n -r "$p = 'c:\\users\\all users'; var_dump(is_dir($p),
readlink($p));"
bool(true)
string(14) "C:\ProgramData"
$ x64\Release\php.exe -n -r "$p = 'c:\\users\\default user'; var_dump(is_dir($p),
readlink($p));"
Warning: readlink(): readlink failed to read the symbolic link (c:\users\default user), error 5) in
Command line code on line 1
bool(true)
bool(false)
Seems I simply come to the start. is_dir() works where i test, and readlink() seems correct
according to the ACLs. Please, lets leave the multibyte path aside yet - if there's an issue,
it should be handled in a different ticket. So far 7.0 shows same behavior. Need first to reproduce
what you've on your side, which seems to be tricky as i've no machine behaving like that.
If someone could produce a synthetic reproduce case, that would give a base to move forward on this.
No status for this situation :/
Thanks.
------------------------------------------------------------------------
[2017-01-11 21:49:16] ab@php.net
ACK, so i misunderstood the part about the username. There are indeed several places, where the
username is relevant, but not this one.
is_dir() is a simple stat() call on the given path. There's no step in between, so at the very
bottom it's really the internal API. Maybe it'd be different if CreateFile and
accompanying non POSIX compatible APIs were used, need to experiment with that. I'm leaving
this open for now, so someone with a similar issue could possibly deliver more input or better repro
way.
With the other issue you've mentioned - please retry putting the code into a file. It is
possibly, that the console blows the encoding.
Thanks.
------------------------------------------------------------------------
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=73884
--
Edit this bug report at https://bugs.php.net/bug.php?id=73884&edit=1