Skip to content

Commit 6095070

Browse files
committed
preliminary fix for bug #73971, more refactoring is needed
1 parent 8782e84 commit 6095070

File tree

3 files changed

+57
-3
lines changed

3 files changed

+57
-3
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
--TEST--
2+
Bug #73971 Filename got limited to MAX_PATH on Win32 when scan directory
3+
--SKIPIF--
4+
<?php
5+
if (substr(PHP_OS, 0, 3) != 'WIN') {
6+
die("skip Valid only on Windows");
7+
}
8+
?>
9+
--FILE--
10+
<?php
11+
$base = __DIR__ . DIRECTORY_SEPARATOR . "bug73971";
12+
$filename = $base . DIRECTORY_SEPARATOR . str_repeat('テスト', 48); // 144 glyph here, less than 256
13+
14+
mkdir($base);
15+
mkdir($filename); // created correctly
16+
17+
var_dump(basename($filename)); // 432 bytes here, more than 256
18+
19+
echo "\ntest dir()\n";
20+
$d = dir($base);
21+
while (false !== ($entry = $d->read())) {
22+
var_dump($entry);
23+
}
24+
$d->close();
25+
26+
echo "\ntest DirectoryIterator\n";
27+
$dir = new DirectoryIterator($base);
28+
foreach ($dir as $finfo) {
29+
var_dump($finfo->getFilename());
30+
}
31+
32+
?>
33+
==DONE==
34+
--CLEAN--
35+
<?php
36+
$base = __DIR__ . DIRECTORY_SEPARATOR . "bug73971";
37+
$filename = $base . DIRECTORY_SEPARATOR . str_repeat('テスト', 48);
38+
39+
rmdir($filename);
40+
rmdir($base);
41+
?>
42+
--EXPECTF--
43+
string(432) "テストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテスト"
44+
45+
test dir()
46+
string(1) "."
47+
string(2) ".."
48+
string(432) "テストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテスト"
49+
50+
test DirectoryIterator
51+
string(1) "."
52+
string(2) ".."
53+
string(432) "テストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテスト"
54+
==DONE==

win32/readdir.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ struct dirent *readdir(DIR *dp)
103103
/* wide to utf8 failed, should never happen. */
104104
return NULL;
105105
}
106-
strlcpy(dp->dent.d_name, _tmp, _MAX_FNAME+1);
106+
strlcpy(dp->dent.d_name, _tmp, _MAX_FNAME*4+1);
107107
dp->dent.d_reclen = (unsigned short)strlen(dp->dent.d_name);
108108
free(_tmp);
109109

@@ -138,7 +138,7 @@ int readdir_r(DIR *dp, struct dirent *entry, struct dirent **result)
138138
result = NULL;
139139
return 0;
140140
}
141-
strlcpy(dp->dent.d_name, _tmp, _MAX_FNAME+1);
141+
strlcpy(dp->dent.d_name, _tmp, _MAX_FNAME*4+1);
142142
dp->dent.d_reclen = (unsigned short)strlen(dp->dent.d_name);
143143
free(_tmp);
144144

win32/readdir.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ struct dirent {
2222
long d_ino; /* inode (always 1 in WIN32) */
2323
off_t d_off; /* offset to this dirent */
2424
unsigned short d_reclen; /* length of d_name */
25-
char d_name[PHP_WIN32_IOUTIL_MAXPATHLEN + 1]; /* filename (null terminated) */
25+
char d_name[_MAX_FNAME*4+1]; /* filename with care about UTF-8 (null terminated) */
2626
};
2727

2828
/* typedef DIR - not the same as Unix */

0 commit comments

Comments
 (0)