@@ -29,9 +29,9 @@ DIR *opendir(const char *dir)
29
29
DIR * dp ;
30
30
wchar_t * filespecw , * resolvedw ;
31
31
HANDLE handle ;
32
- int index ;
33
32
char resolved_path_buff [MAXPATHLEN ];
34
- size_t resolvedw_len , filespecw_len ;
33
+ size_t resolvedw_len , filespecw_len , index ;
34
+ zend_bool might_need_prefix ;
35
35
36
36
if (!VCWD_REALPATH (dir , resolved_path_buff )) {
37
37
return NULL ;
@@ -48,16 +48,27 @@ DIR *opendir(const char *dir)
48
48
return NULL ;
49
49
}
50
50
51
+ might_need_prefix = resolvedw_len >= 3 && PHP_WIN32_IOUTIL_IS_LETTERW (resolvedw [0 ]) && L':' == resolvedw [1 ] && PHP_WIN32_IOUTIL_IS_SLASHW (resolvedw [2 ]);
52
+
51
53
filespecw_len = resolvedw_len + 2 ;
54
+ if (filespecw_len >= _MAX_PATH && might_need_prefix ) {
55
+ filespecw_len += PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW ;
56
+ }
52
57
filespecw = (wchar_t * )malloc ((filespecw_len + 1 )* sizeof (wchar_t ));
53
58
if (filespecw == NULL ) {
54
59
free (dp );
55
60
free (resolvedw );
56
61
return NULL ;
57
62
}
58
63
59
- wcscpy (filespecw , resolvedw );
60
- index = (int )filespecw_len - 1 ;
64
+ if (filespecw_len >= _MAX_PATH && might_need_prefix ) {
65
+ wcscpy (filespecw , PHP_WIN32_IOUTIL_LONG_PATH_PREFIXW );
66
+ wcscpy (filespecw + PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW , resolvedw );
67
+ index = resolvedw_len + PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW - 1 ;
68
+ } else {
69
+ wcscpy (filespecw , resolvedw );
70
+ index = resolvedw_len - 1 ;
71
+ }
61
72
if (index >= 0 && filespecw [index ] == L'/' || index == 0 && filespecw [index ] == L'\\' )
62
73
filespecw [index ] = L'\0' ;
63
74
wcscat (filespecw , L"\\*" );
@@ -178,24 +189,42 @@ int rewinddir(DIR *dp)
178
189
/* Re-set to the beginning */
179
190
wchar_t * filespecw ;
180
191
HANDLE handle ;
181
- int index ;
192
+ size_t dirw_len , filespecw_len , index ;
193
+ zend_bool might_need_prefix ;
182
194
183
195
FindClose (dp -> handle );
184
196
185
197
dp -> offset = 0 ;
186
198
dp -> finished = 0 ;
187
199
188
- filespecw = (wchar_t * )malloc ((wcslen ((wchar_t * )dp -> dirw ) + 2 + 1 )* sizeof (wchar_t ));
200
+ /* XXX save the dir len into the struct. */
201
+ dirw_len = wcslen ((wchar_t * )dp -> dirw );
202
+
203
+ might_need_prefix = dirw_len >= 3 && PHP_WIN32_IOUTIL_IS_LETTERW (dp -> dirw [0 ]) && L':' == dp -> dirw [1 ] && PHP_WIN32_IOUTIL_IS_SLASHW (dp -> dirw [2 ]);
204
+
205
+ filespecw_len = dirw_len + 2 ;
206
+ if (filespecw_len >= _MAX_PATH && might_need_prefix ) {
207
+ filespecw_len += PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW ;
208
+ }
209
+
210
+ filespecw = (wchar_t * )malloc ((filespecw_len + 1 )* sizeof (wchar_t ));
189
211
if (filespecw == NULL ) {
190
212
return -1 ;
191
213
}
192
214
193
- wcscpy (filespecw , (wchar_t * )dp -> dirw );
194
- index = (int )wcslen (filespecw ) - 1 ;
215
+ if (filespecw_len >= _MAX_PATH && might_need_prefix ) {
216
+ wcscpy (filespecw , PHP_WIN32_IOUTIL_LONG_PATH_PREFIXW );
217
+ wcscpy (filespecw + PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW , dp -> dirw );
218
+ index = dirw_len + PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW - 1 ;
219
+ } else {
220
+ wcscpy (filespecw , dp -> dirw );
221
+ index = dirw_len - 1 ;
222
+ }
223
+
195
224
if (index >= 0 && (filespecw [index ] == L'/' ||
196
225
(filespecw [index ] == L'\\' && index == 0 )))
197
226
filespecw [index ] = L'\0' ;
198
- wcscat (filespecw , L"/ *" );
227
+ wcscat (filespecw , L"\\ *" );
199
228
200
229
if ((handle = FindFirstFileExW (filespecw , FindExInfoBasic , & (dp -> fileinfo ), FindExSearchNameMatch , NULL , FIND_FIRST_EX_LARGE_FETCH )) == INVALID_HANDLE_VALUE ) {
201
230
dp -> finished = 1 ;
0 commit comments