diff --git a/ext/standard/tests/dir/dir_bug73971.phpt b/ext/standard/tests/dir/dir_bug73971.phpt new file mode 100644 index 00000000000..86cb29ac580 --- /dev/null +++ b/ext/standard/tests/dir/dir_bug73971.phpt @@ -0,0 +1,54 @@ +--TEST-- +Bug #73971 Filename got limited to MAX_PATH on Win32 when scan directory +--SKIPIF-- + +--FILE-- +read())) { + var_dump($entry); +} +$d->close(); + +echo "\ntest DirectoryIterator\n"; +$dir = new DirectoryIterator($base); +foreach ($dir as $finfo) { + var_dump($finfo->getFilename()); +} + +?> +==DONE== +--CLEAN-- + +--EXPECTF-- +string(432) "テストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテスト" + +test dir() +string(1) "." +string(2) ".." +string(432) "テストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテスト" + +test DirectoryIterator +string(1) "." +string(2) ".." +string(432) "テストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテスト" +==DONE== diff --git a/win32/readdir.c b/win32/readdir.c index 43d5deecfd7..42b528ad0ad 100644 --- a/win32/readdir.c +++ b/win32/readdir.c @@ -103,7 +103,7 @@ struct dirent *readdir(DIR *dp) /* wide to utf8 failed, should never happen. */ return NULL; } - strlcpy(dp->dent.d_name, _tmp, _MAX_FNAME+1); + strlcpy(dp->dent.d_name, _tmp, _MAX_FNAME*4+1); dp->dent.d_reclen = (unsigned short)strlen(dp->dent.d_name); free(_tmp); @@ -138,7 +138,7 @@ int readdir_r(DIR *dp, struct dirent *entry, struct dirent **result) result = NULL; return 0; } - strlcpy(dp->dent.d_name, _tmp, _MAX_FNAME+1); + strlcpy(dp->dent.d_name, _tmp, _MAX_FNAME*4+1); dp->dent.d_reclen = (unsigned short)strlen(dp->dent.d_name); free(_tmp); diff --git a/win32/readdir.h b/win32/readdir.h index 73058f88042..495c36a1a9b 100644 --- a/win32/readdir.h +++ b/win32/readdir.h @@ -22,7 +22,7 @@ struct dirent { long d_ino; /* inode (always 1 in WIN32) */ off_t d_off; /* offset to this dirent */ unsigned short d_reclen; /* length of d_name */ - char d_name[PHP_WIN32_IOUTIL_MAXPATHLEN + 1]; /* filename (null terminated) */ + char d_name[_MAX_FNAME*4+1]; /* filename with care about UTF-8 (null terminated) */ }; /* typedef DIR - not the same as Unix */