summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph M. Becker <cmbecker69@gmx.de>2019-11-25 12:16:54 +0100
committerChristoph M. Becker <cmbecker69@gmx.de>2019-12-02 11:29:10 +0100
commitbb735c9e9e4a2ca2686a141ffe867f60ee0053c3 (patch)
treeebc32df4cc290d5047213a8a5ad8e3ede3a82631
parent3d81c548796b549195be6f8d1e213dcd42802e09 (diff)
downloadphp-git-bb735c9e9e4a2ca2686a141ffe867f60ee0053c3.tar.gz
Fix #78296: is_file fails to detect file
If we're constructing extended-length paths (i.e. paths prefixed with `\\?\`), we have to replace all forward slashes with backward slashes, because the former are not supported by Windows for extended-length paths. The more efficient and likely cleaner alternative solution would be to cater to this in `php_win32_ioutil_normalize_path_w()` by always replacing forward slashes, but that might break existing code. It might be sensible to change that for `master`, though.
-rw-r--r--NEWS1
-rw-r--r--ext/standard/tests/file/bug78296.phpt16
-rw-r--r--win32/ioutil.c12
-rw-r--r--win32/ioutil.h10
4 files changed, 37 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index 1786ba2b15..1869687585 100644
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,7 @@ PHP NEWS
property). (Nikita)
. Fixed bug #78868 (Calling __autoload() with incorrect EG(fake_scope) value).
(Antony Dovgal, Dmitry)
+ . Fixed bug #78296 (is_file fails to detect file). (cmb)
- GD:
. Fixed bug #78849 (GD build broken with -D SIGNED_COMPARE_SLOW). (cmb)
diff --git a/ext/standard/tests/file/bug78296.phpt b/ext/standard/tests/file/bug78296.phpt
new file mode 100644
index 0000000000..e7388d51b7
--- /dev/null
+++ b/ext/standard/tests/file/bug78296.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Bug #78296 (is_file fails to detect file)
+--FILE--
+<?php
+$dir = str_pad(__DIR__ . '/bug78296', 250, '_');
+var_dump(mkdir($dir));
+var_dump(is_dir($dir));
+?>
+--EXPECT--
+bool(true)
+bool(true)
+--CLEAN--
+<?php
+$dir = str_pad(__DIR__ . '/bug78296', 250, '_');
+rmdir($dir);
+?>
diff --git a/win32/ioutil.c b/win32/ioutil.c
index c3c307a2a8..6fbfdb52e4 100644
--- a/win32/ioutil.c
+++ b/win32/ioutil.c
@@ -320,13 +320,23 @@ PW32IO int php_win32_ioutil_mkdir_w(const wchar_t *path, mode_t mode)
if (!PHP_WIN32_IOUTIL_IS_LONG_PATHW(tmp, path_len)) {
wchar_t *_tmp = (wchar_t *) malloc((path_len + PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW + 1) * sizeof(wchar_t));
+ wchar_t *src, *dst;
if (!_tmp) {
SET_ERRNO_FROM_WIN32_CODE(ERROR_NOT_ENOUGH_MEMORY);
free(tmp);
return -1;
}
memmove(_tmp, PHP_WIN32_IOUTIL_LONG_PATH_PREFIXW, PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW * sizeof(wchar_t));
- memmove(_tmp+PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW, tmp, path_len * sizeof(wchar_t));
+ src = tmp;
+ dst = _tmp + PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW;
+ while (src < tmp + path_len) {
+ if (*src == PHP_WIN32_IOUTIL_FW_SLASHW) {
+ *dst++ = PHP_WIN32_IOUTIL_DEFAULT_SLASHW;
+ src++;
+ } else {
+ *dst++ = *src++;
+ }
+ }
path_len += PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW;
_tmp[path_len] = L'\0';
free(tmp);
diff --git a/win32/ioutil.h b/win32/ioutil.h
index 0578584fe0..82ed6b4e63 100644
--- a/win32/ioutil.h
+++ b/win32/ioutil.h
@@ -215,8 +215,16 @@ __forceinline static wchar_t *php_win32_ioutil_conv_any_to_w(const char* in, siz
memmove(ret, mb, mb_len * sizeof(wchar_t));
ret[mb_len] = L'\0';
} else {
+ wchar_t *src = mb, *dst = ret + PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW;
memmove(ret, PHP_WIN32_IOUTIL_LONG_PATH_PREFIXW, PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW * sizeof(wchar_t));
- memmove(ret+PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW, mb, mb_len * sizeof(wchar_t));
+ while (src < mb + mb_len) {
+ if (*src == PHP_WIN32_IOUTIL_FW_SLASHW) {
+ *dst++ = PHP_WIN32_IOUTIL_DEFAULT_SLASHW;
+ src++;
+ } else {
+ *dst++ = *src++;
+ }
+ }
ret[mb_len + PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW] = L'\0';
mb_len += PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW;