@@ -306,18 +306,35 @@ PW32IO int php_win32_ioutil_mkdir_w(const wchar_t *path, mode_t mode)
306
306
already needs to be a long path. The given path is already normalized
307
307
and prepared, need only to prefix it.
308
308
*/
309
- wchar_t * tmp = (wchar_t * ) malloc ((path_len + PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW + 1 ) * sizeof (wchar_t ));
309
+ wchar_t * tmp = (wchar_t * ) malloc ((path_len + 1 ) * sizeof (wchar_t ));
310
310
if (!tmp ) {
311
311
SET_ERRNO_FROM_WIN32_CODE (ERROR_NOT_ENOUGH_MEMORY );
312
312
return -1 ;
313
313
}
314
+ memmove (tmp , path , (path_len + 1 ) * sizeof (wchar_t ));
314
315
315
- memmove (tmp , PHP_WIN32_IOUTIL_LONG_PATH_PREFIXW , PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW * sizeof (wchar_t ));
316
- memmove (tmp + PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW , path , path_len * sizeof (wchar_t ));
317
- path_len += PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW ;
318
- tmp [path_len ] = L'\0' ;
316
+ if (PHP_WIN32_IOUTIL_NORM_FAIL == php_win32_ioutil_normalize_path_w (& tmp , path_len , & path_len )) {
317
+ free (tmp );
318
+ return -1 ;
319
+ }
320
+
321
+ if (!PHP_WIN32_IOUTIL_IS_LONG_PATHW (tmp , path_len )) {
322
+ wchar_t * _tmp = (wchar_t * ) malloc ((path_len + PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW + 1 ) * sizeof (wchar_t ));
323
+ if (!_tmp ) {
324
+ SET_ERRNO_FROM_WIN32_CODE (ERROR_NOT_ENOUGH_MEMORY );
325
+ free (tmp );
326
+ return -1 ;
327
+ }
328
+ memmove (_tmp , PHP_WIN32_IOUTIL_LONG_PATH_PREFIXW , PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW * sizeof (wchar_t ));
329
+ memmove (_tmp + PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW , tmp , path_len * sizeof (wchar_t ));
330
+ path_len += PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW ;
331
+ _tmp [path_len ] = L'\0' ;
332
+ free (tmp );
333
+ tmp = _tmp ;
334
+ }
319
335
320
336
my_path = tmp ;
337
+
321
338
} else {
322
339
my_path = path ;
323
340
}
@@ -573,7 +590,7 @@ PW32IO size_t php_win32_ioutil_dirname(char *path, size_t len)
573
590
/* Partial normalization can still be acceptable, explicit fail has to be caught. */
574
591
PW32IO php_win32_ioutil_normalization_result php_win32_ioutil_normalize_path_w (wchar_t * * buf , size_t len , size_t * new_len )
575
592
{/*{{{*/
576
- wchar_t * pos , * idx = * buf , canonicalw [MAXPATHLEN ];
593
+ wchar_t * idx = * buf , canonicalw [MAXPATHLEN ], _tmp [ MAXPATHLEN ], * pos = _tmp ;
577
594
size_t ret_len = len ;
578
595
579
596
if (len >= MAXPATHLEN ) {
@@ -582,12 +599,17 @@ PW32IO php_win32_ioutil_normalization_result php_win32_ioutil_normalize_path_w(w
582
599
return PHP_WIN32_IOUTIL_NORM_FAIL ;
583
600
}
584
601
585
- while (NULL != (pos = wcschr (idx , PHP_WIN32_IOUTIL_FW_SLASHW )) && (size_t )(idx - * buf ) <= len ) {
586
- * pos = PHP_WIN32_IOUTIL_DEFAULT_SLASHW ;
587
- idx = pos ++ ;
602
+ for (; (size_t )(idx - * buf ) <= len ; idx ++ , pos ++ ) {
603
+ * pos = * idx ;
604
+ if (PHP_WIN32_IOUTIL_FW_SLASHW == * pos ) {
605
+ * pos = PHP_WIN32_IOUTIL_DEFAULT_SLASHW ;
606
+ }
607
+ while (PHP_WIN32_IOUTIL_IS_SLASHW (* idx ) && PHP_WIN32_IOUTIL_IS_SLASHW (* (idx + 1 ))) {
608
+ idx ++ ;
609
+ }
588
610
}
589
611
590
- if (S_OK != canonicalize_path_w (canonicalw , MAXPATHLEN , * buf , PATHCCH_ALLOW_LONG_PATHS )) {
612
+ if (S_OK != canonicalize_path_w (canonicalw , MAXPATHLEN , _tmp , PATHCCH_ALLOW_LONG_PATHS )) {
591
613
/* Length unchanged. */
592
614
* new_len = len ;
593
615
return PHP_WIN32_IOUTIL_NORM_PARTIAL ;
0 commit comments