summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/standard/tests/file/bug75679.phpt66
-rw-r--r--win32/ioutil.h2
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));