com php-src: Fixed bug #73962 bug with symlink related to cyrillic directory: NEWS Zend/zend_virtual_cwd.c ext/standard/te
sts/file/windows_links/bug73962.phpt
| From: | Anatol Belski | Date: | Fri, 20 Jan 2017 22:45:08 +0000 |
| Subject: | com php-src: Fixed bug #73962 bug with symlink related to cyrillic directory: NEWS Zend/zend_virtual_cwd.c ext/standard/te sts/file/windows_links/bug73962.phpt |
||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-96821@lists.php.net to get a copy of this message | ||
Commit: 95406c878a9cc25ad1e831e619afba683e92f05a
Author: Anatol Belski <ab@php.net> Fri, 20 Jan 2017 23:45:08 +0100
Parents: d6feb2edbdc95b2db1ec09f011595de0204b2fa1
Branches: PHP-7.1 master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=95406c878a9cc25ad1e831e619afba683e92f05a
Log:
Fixed bug #73962 bug with symlink related to cyrillic directory
Bugs:
https://bugs.php.net/73962
Changed paths:
M NEWS
M Zend/zend_virtual_cwd.c
A ext/standard/tests/file/windows_links/bug73962.phpt
Diff:
diff --git a/NEWS b/NEWS
index 65856c6..baed446 100644
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,7 @@ PHP NEWS
. Fixed bug #73877 (readlink() returns garbage for UTF-8 paths). (Anatol)
. Fixed bug #73876 (Crash when exporting **= in expansion of assign op).
(Sara)
+ . Fixed bug #73962 (bug with symlink related to cyrillic directory). (Anatol)
- DTrace:
. Fixed bug #73965 (DTrace reported as enabled when disabled). (Remi)
diff --git a/Zend/zend_virtual_cwd.c b/Zend/zend_virtual_cwd.c
index 5334348..9c2dc29 100644
--- a/Zend/zend_virtual_cwd.c
+++ b/Zend/zend_virtual_cwd.c
@@ -914,7 +914,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
wchar_t * reparsetarget;
BOOL isVolume = FALSE;
char *printname = NULL, *substitutename = NULL;
- int substitutename_len;
+ size_t substitutename_len;
int substitutename_off = 0;
if(++(*ll) > LINK_MAX) {
@@ -959,7 +959,8 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
}
substitutename_len = pbuffer->MountPointReparseBuffer.SubstituteNameLength / sizeof(WCHAR);
- substitutename = php_win32_ioutil_w_to_any(reparsetarget +
pbuffer->MountPointReparseBuffer.SubstituteNameOffset / sizeof(WCHAR));
+ substitutename = php_win32_cp_conv_w_to_any(reparsetarget +
pbuffer->MountPointReparseBuffer.SubstituteNameOffset / sizeof(WCHAR),
+ substitutename_len, &substitutename_len);
if (!substitutename) {
free_alloca(pbuffer, use_heap_large);
free_alloca(tmp, use_heap);
@@ -981,7 +982,8 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
substitutename_len = pbuffer->MountPointReparseBuffer.SubstituteNameLength / sizeof(WCHAR);
- substitutename = php_win32_ioutil_w_to_any(reparsetarget +
pbuffer->MountPointReparseBuffer.SubstituteNameOffset / sizeof(WCHAR));
+ substitutename = php_win32_cp_conv_w_to_any(reparsetarget +
pbuffer->MountPointReparseBuffer.SubstituteNameOffset / sizeof(WCHAR),
+ substitutename_len, &substitutename_len);
if (!substitutename) {
free_alloca(pbuffer, use_heap_large);
free_alloca(tmp, use_heap);
diff --git a/ext/standard/tests/file/windows_links/bug73962.phpt
b/ext/standard/tests/file/windows_links/bug73962.phpt
new file mode 100644
index 0000000..6d57838
--- /dev/null
+++ b/ext/standard/tests/file/windows_links/bug73962.phpt
@@ -0,0 +1,77 @@
+--TEST--
+Bug #73962 bug with symlink related to cyrillic directory
+--SKIPIF--
+<?php
+if(substr(PHP_OS, 0, 3) != 'WIN' ) {
+ die('skip windows only test');
+}
+include_once __DIR__ . '/common.inc';
+$ret = exec('mklink bug48746_tmp.lnk ' . __FILE__ .' 2>&1', $out);
+if (strpos($ret, 'privilege')) {
+ die('skip. SeCreateSymbolicLinkPrivilege not enable for this user.');
+}
+unlink('bug48746_tmp.lnk');
+?>
+--FILE--
+<?php
+include_once __DIR__ . '/common.inc';
+$mountvol = get_mountvol();
+$old_dir = __DIR__;
+$dirname = '"' . __DIR__ . "\\mnt\\test\\новая папка" .
'"';
+exec("mkdir " . $dirname, $output, $ret_val);
+chdir(__DIR__ . "\\mnt\\test");
+$drive = substr(__DIR__, 0, 2);
+$pathwithoutdrive = substr(__DIR__, 2);
+$ret = exec($mountvol . " " . $drive . " /L", $output, $ret_val);
+exec("mklink /d mounted_volume " . $ret, $output, $ret_val);
+$fullpath = "mounted_volume" . $pathwithoutdrive;
+exec("mklink /d mklink_symlink \"новая папка\"", $output, $ret_val);
+file_put_contents("mklink_symlink\\a.php", "<?php echo \"I am
included.\n\" ?>");
+file_put_contents("$fullpath\\mnt\\test\\новая папка\\b.php", "<?php
echo \"I am included.\n\" ?>");
+var_dump(scandir("mklink_symlink"));
+var_dump(scandir("$fullpath\\mnt\\test\\новая папка"));
+var_dump(scandir("$fullpath\\mnt\\test\\mklink_symlink"));
+var_dump(is_readable("$fullpath\\mnt\\test\\mklink_symlink\b.php"));
+unlink("$fullpath\\mnt\\test\\новая папка\\b.php");
+unlink("mklink_symlink\\a.php");
+chdir($old_dir);
+rmdir(__DIR__ . "\\mnt\\test\\новая папка");
+rmdir(__DIR__ . "\\mnt\\test\\mklink_symlink");
+rmdir(__DIR__ . "\\mnt\\test\\mounted_volume");
+rmdir(__DIR__ . "\\mnt\\test");
+rmdir(__DIR__ . "\\mnt");
+
+?>
+--EXPECT--
+array(4) {
+ [0]=>
+ string(1) "."
+ [1]=>
+ string(2) ".."
+ [2]=>
+ string(5) "a.php"
+ [3]=>
+ string(5) "b.php"
+}
+array(4) {
+ [0]=>
+ string(1) "."
+ [1]=>
+ string(2) ".."
+ [2]=>
+ string(5) "a.php"
+ [3]=>
+ string(5) "b.php"
+}
+array(4) {
+ [0]=>
+ string(1) "."
+ [1]=>
+ string(2) ".."
+ [2]=>
+ string(5) "a.php"
+ [3]=>
+ string(5) "b.php"
+}
+bool(true)
+