Edit report at https://bugs.php.net/bug.php?id=78296&edit=1

 ID:                 78296
 Updated by:         c...@php.net
 Reported by:        v-altruo at microsoft dot com
 Summary:            is_file fails to detect file
-Status:             Open
+Status:             Verified
 Type:               Bug
 Package:            Testing related
 Operating System:   Windows
 PHP Version:        7.4.0alpha3
-Assigned To:        
+Assigned To:        cmb
 Block user comment: N
 Private report:     N

 New Comment:

Thanks for reporting!  This is a rather interesting
issue.

At first I have not been able to reproduce the test
failure.  Then I checked the registry key LongPathsEnabled[1]
and found that it was disabled.  After enabling it, the test
failed for me as well.  It seems that the file and directory
management functions (such as CreateFileW()) don't accept
long paths prefixed by \\?\.  The following patch makes the test
pass for LongPathsEnabled set to true:

 win32/ioutil.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/win32/ioutil.h b/win32/ioutil.h
index 34104a3f45..7937718766 100644
--- a/win32/ioutil.h
+++ b/win32/ioutil.h
@@ -190,7 +190,7 @@ __forceinline static wchar_t 
*php_win32_ioutil_conv_any_to_w(const char* in, siz
        }
 
        /* Only prefix with long if it's needed. */
-       if (mb_len >= _MAX_PATH) {
+       if (0) {
                size_t new_mb_len;
 
                ret = (wchar_t *) malloc((mb_len + 
PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW + 1) * sizeof(wchar_t));


[1] 
<https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file#enable-long-paths-in-windows-10-version-1607-and-later>


Previous Comments:
------------------------------------------------------------------------
[2019-07-15 22:53:41] v-altruo at microsoft dot com

Description:
------------
Test fails across all builds regardless of opcache on/off. Looked a bit into 
it, the "is_file($file)" is the part that fails. 

Failed Test Location: ext\standard\tests\file\bug75679.phpt 

Test script:
---------------
<?php
$d = __DIR__;
$Files2Report =
 [
  str_pad ($d . '/' . str_repeat (str_pad 
('bug75679_path_259_characters_long_', 100, '_') . '/', 1), 259, '_') => [],
  str_pad ($d . '/' . str_repeat (str_pad 
('bug75679_path_260_characters_long_', 100, '_') . '/', 1), 260, '_') => [],
  str_pad ($d . '/' . str_repeat (str_pad 
('bug75679_path_261_characters_long_', 100, '_') . '/', 1), 261, '_') => [],
 ];
foreach ($Files2Report as $file => &$Report)
 {
  $Report = ['strlen' => strlen ($file), 'result' => 'nok'];

  if (! is_dir (dirname ($file))) mkdir (dirname ($file), 0777, true);
  if (copy (__FILE__, $file) && is_file ($file))
   {
    $Report['result'] = 'ok';
   }

  print_r ($Report);
 }


?>

Expected result:
----------------
Array
(
    [strlen] => 259
    [result] => ok
)
Array
(
    [strlen] => 260
    [result] => ok
)
Array
(
    [strlen] => 261
    [result] => ok
)
==DONE==

Actual result:
--------------
Array
(
    [strlen] => 259
    [result] => ok
)
Array
(
    [strlen] => 260
    [result] => nok
)
Array
(
    [strlen] => 261
    [result] => nok
)
==DONE==


------------------------------------------------------------------------



--
Edit this bug report at https://bugs.php.net/bug.php?id=78296&edit=1

Reply via email to