@@ -321,20 +321,41 @@ PW32IO int php_win32_ioutil_mkdir(const char *path, mode_t mode)
321
321
already needs to be a long path. The given path is already normalized
322
322
and prepared, need only to prefix it.
323
323
*/
324
- wchar_t * tmp = (wchar_t * ) malloc ((pathw_len + PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW + 1 ) * sizeof (wchar_t ));
324
+ wchar_t * tmp = (wchar_t * ) malloc ((pathw_len + 1 ) * sizeof (wchar_t ));
325
325
if (!tmp ) {
326
326
free (pathw );
327
327
SET_ERRNO_FROM_WIN32_CODE (ERROR_NOT_ENOUGH_MEMORY );
328
328
return -1 ;
329
329
}
330
+ memmove (tmp , pathw , (pathw_len + 1 ) * sizeof (wchar_t ));
330
331
331
- memmove ( tmp , PHP_WIN32_IOUTIL_LONG_PATH_PREFIXW , PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW * sizeof ( wchar_t ));
332
- memmove (tmp + PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW , pathw , pathw_len * sizeof ( wchar_t ) );
333
- pathw_len += PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW ;
334
- tmp [ pathw_len ] = L'\0' ;
332
+ if ( PHP_WIN32_IOUTIL_NORM_FAIL == php_win32_ioutil_normalize_path_w ( & tmp , pathw_len , & pathw_len )) {
333
+ free (tmp );
334
+ return -1 ;
335
+ }
335
336
336
337
free (pathw );
337
338
pathw = tmp ;
339
+
340
+ if (!PHP_WIN32_IOUTIL_IS_LONG_PATHW (tmp , pathw_len )) {
341
+ wchar_t * _tmp = (wchar_t * ) malloc ((pathw_len + PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW + 1 ) * sizeof (wchar_t ));
342
+ if (!_tmp ) {
343
+ SET_ERRNO_FROM_WIN32_CODE (ERROR_NOT_ENOUGH_MEMORY );
344
+ free (tmp );
345
+ return -1 ;
346
+ }
347
+ memmove (_tmp , PHP_WIN32_IOUTIL_LONG_PATH_PREFIXW , PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW * sizeof (wchar_t ));
348
+ memmove (_tmp + PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW , tmp , pathw_len * sizeof (wchar_t ));
349
+ pathw_len += PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW ;
350
+ _tmp [pathw_len ] = L'\0' ;
351
+ free (tmp );
352
+ tmp = _tmp ;
353
+ }
354
+
355
+ pathw = tmp ;
356
+
357
+ } else {
358
+ pathw = pathw ;
338
359
}
339
360
340
361
/* TODO extend with mode usage */
@@ -541,7 +562,7 @@ PW32IO size_t php_win32_ioutil_dirname(char *path, size_t len)
541
562
/* Partial normalization can still be acceptable, explicit fail has to be caught. */
542
563
PW32IO php_win32_ioutil_normalization_result php_win32_ioutil_normalize_path_w (wchar_t * * buf , size_t len , size_t * new_len )
543
564
{/*{{{*/
544
- wchar_t * pos , * idx = * buf , canonicalw [MAXPATHLEN ];
565
+ wchar_t * idx = * buf , canonicalw [MAXPATHLEN ], _tmp [ MAXPATHLEN ], * pos = _tmp ;
545
566
size_t ret_len = len ;
546
567
547
568
if (len >= MAXPATHLEN ) {
@@ -550,12 +571,17 @@ PW32IO php_win32_ioutil_normalization_result php_win32_ioutil_normalize_path_w(w
550
571
return PHP_WIN32_IOUTIL_NORM_FAIL ;
551
572
}
552
573
553
- while (NULL != (pos = wcschr (idx , PHP_WIN32_IOUTIL_FW_SLASHW )) && (size_t )(idx - * buf ) <= len ) {
554
- * pos = PHP_WIN32_IOUTIL_DEFAULT_SLASHW ;
555
- idx = pos ++ ;
574
+ for (; (size_t )(idx - * buf ) <= len ; idx ++ , pos ++ ) {
575
+ * pos = * idx ;
576
+ if (PHP_WIN32_IOUTIL_FW_SLASHW == * pos ) {
577
+ * pos = PHP_WIN32_IOUTIL_DEFAULT_SLASHW ;
578
+ }
579
+ while (PHP_WIN32_IOUTIL_IS_SLASHW (* idx ) && PHP_WIN32_IOUTIL_IS_SLASHW (* (idx + 1 ))) {
580
+ idx ++ ;
581
+ }
556
582
}
557
583
558
- if (S_OK != canonicalize_path_w (canonicalw , MAXPATHLEN , * buf , PATHCCH_ALLOW_LONG_PATHS )) {
584
+ if (S_OK != canonicalize_path_w (canonicalw , MAXPATHLEN , _tmp , PATHCCH_ALLOW_LONG_PATHS )) {
559
585
/* Length unchanged. */
560
586
* new_len = len ;
561
587
return PHP_WIN32_IOUTIL_NORM_PARTIAL ;
0 commit comments