]> granicus.if.org Git - php/commitdiff
Fixed bug #75679 Path 260 character problem
authorAnatol Belski <ab@php.net>
Thu, 14 Dec 2017 15:16:50 +0000 (16:16 +0100)
committerAnatol Belski <ab@php.net>
Thu, 14 Dec 2017 15:16:50 +0000 (16:16 +0100)
ext/standard/tests/file/bug75679.phpt [new file with mode: 0644]
win32/ioutil.h

diff --git a/ext/standard/tests/file/bug75679.phpt b/ext/standard/tests/file/bug75679.phpt
new file mode 100644 (file)
index 0000000..af44565
--- /dev/null
@@ -0,0 +1,66 @@
+--TEST--
+Bug #75679 Path 260 character problem
+--FILE--
+<?php
+$d = dirname(__FILE__);
+$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);
+ }
+
+
+?>
+==DONE==
+--CLEAN--
+<?php
+$d = dirname(__FILE__);
+$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)
+{
+       if (is_file($file)) {
+               unlink($file);
+       }
+
+       $d1 = dirname($file);
+       while ($d1 != $d) {
+               rmdir($d1);
+               $d1 = dirname($d1);
+       }
+}
+?>
+--EXPECT--
+Array
+(
+    [strlen] => 259
+    [result] => ok
+)
+Array
+(
+    [strlen] => 260
+    [result] => ok
+)
+Array
+(
+    [strlen] => 261
+    [result] => ok
+)
+==DONE==
index 394932d78edefdecdff63a010121f029b6417f67..e92549a94be57b2d8e84bcb4f0ce535943bc3ad1 100644 (file)
@@ -166,7 +166,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 (mb_len >= _MAX_PATH) {
                size_t new_mb_len;
 
                ret = (wchar_t *) malloc((mb_len + PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW + 1) * sizeof(wchar_t));