summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnatol Belski <ab@php.net>2017-07-14 13:24:21 +0200
committerAnatol Belski <ab@php.net>2017-07-14 13:24:21 +0200
commitb5fd99b636dfd85632cbec08891184b133cf6264 (patch)
tree0b9dba87be36f1d7d0b925c84813755554313adc
parentb280ba854a6ec0e42a562c5bedfda51ae86ba23e (diff)
parent5d15fdc4a4db22552105e8275b6d3ef417219d66 (diff)
downloadphp-git-b5fd99b636dfd85632cbec08891184b133cf6264.tar.gz
Merge branch 'PHP-7.1'
* PHP-7.1: Fixed bug #74923 Crash when crawling through network share
-rw-r--r--win32/ioutil.h20
1 files changed, 18 insertions, 2 deletions
diff --git a/win32/ioutil.h b/win32/ioutil.h
index 9987744626..120d69213d 100644
--- a/win32/ioutil.h
+++ b/win32/ioutil.h
@@ -112,6 +112,10 @@ typedef enum {
#define PHP_WIN32_IOUTIL_IS_LONG_PATHW(pathw, path_lenw) (path_lenw >= PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW \
&& 0 == wcsncmp((pathw), PHP_WIN32_IOUTIL_LONG_PATH_PREFIXW, PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW))
+#define PHP_WIN32_IOUTIL_IS_UNC_PATHW(pathw, path_lenw) (path_lenw >= PHP_WIN32_IOUTIL_UNC_PATH_PREFIX_LENW \
+ && 0 == wcsncmp((pathw), PHP_WIN32_IOUTIL_UNC_PATH_PREFIXW, PHP_WIN32_IOUTIL_UNC_PATH_PREFIX_LENW))
+#define PHP_WIN32_IOUTIL_IS_JUNCTION_PATHW(pathw, path_lenw) (path_lenw >= PHP_WIN32_IOUTIL_JUNCTION_PREFIX_LENW \
+ && 0 == wcsncmp((pathw), PHP_WIN32_IOUTIL_JUNCTION_PREFIXW, PHP_WIN32_IOUTIL_JUNCTION_PREFIX_LENW))
#define PHP_WIN32_IOUTIL_IS_ABSOLUTEW(pathw, path_lenw) (PHP_WIN32_IOUTIL_IS_LONG_PATHW(pathw, path_lenw) \
|| path_lenw >= 3 && PHP_WIN32_IOUTIL_IS_LETTERW(pathw[0]) && L':' == pathw[1] && IS_SLASHW(pathw[2]))
#define PHP_WIN32_IOUTIL_IS_UNC(pathw, path_lenw) (path_lenw >= 2 && PHP_WIN32_IOUTIL_IS_SLASHW(pathw[0]) && PHP_WIN32_IOUTIL_IS_SLASHW(pathw[1]) \
@@ -165,6 +169,8 @@ __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) {
+ size_t new_mb_len;
+
ret = (wchar_t *) malloc((mb_len + PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW + 1) * sizeof(wchar_t));
if (!ret) {
free(mb);
@@ -176,9 +182,19 @@ __forceinline static wchar_t *php_win32_ioutil_conv_any_to_w(const char* in, siz
Partial normalization could still do a better job further. And
otherwise, the path might be unchanged which is ok if the path
was valid long one. */
- (void)php_win32_ioutil_normalize_path_w(&mb, mb_len, &mb_len);
+ (void)php_win32_ioutil_normalize_path_w(&mb, mb_len, &new_mb_len);
+
+ if (new_mb_len > mb_len) {
+ wchar_t *tmp = (wchar_t *) realloc(ret, (new_mb_len + 1) * sizeof(wchar_t));
+ if (!tmp) {
+ free(ret);
+ return NULL;
+ }
+ ret = tmp;
+ mb_len = new_mb_len;
+ }
- if (PHP_WIN32_IOUTIL_IS_LONG_PATHW(mb, mb_len)) {
+ if (PHP_WIN32_IOUTIL_IS_LONG_PATHW(mb, mb_len) || PHP_WIN32_IOUTIL_IS_JUNCTION_PATHW(mb, mb_len) || PHP_WIN32_IOUTIL_IS_UNC_PATHW(mb, mb_len)) {
memmove(ret, mb, mb_len * sizeof(wchar_t));
ret[mb_len] = L'\0';
} else {