diff options
-rw-r--r-- | ext/standard/tests/file/bug75679.phpt | 66 | ||||
-rw-r--r-- | win32/ioutil.h | 2 |
2 files changed, 67 insertions, 1 deletions
diff --git a/ext/standard/tests/file/bug75679.phpt b/ext/standard/tests/file/bug75679.phpt new file mode 100644 index 0000000000..af44565c45 --- /dev/null +++ b/ext/standard/tests/file/bug75679.phpt @@ -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== diff --git a/win32/ioutil.h b/win32/ioutil.h index 61d3fcddf4..488304d73d 100644 --- a/win32/ioutil.h +++ b/win32/ioutil.h @@ -184,7 +184,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)); |