From: Anatol Belski Date: Mon, 3 Apr 2017 14:30:40 +0000 (+0200) Subject: missing bits for php_sys_stat_ex so everything is handled with wide chars X-Git-Tag: php-7.2.0alpha1~164 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=936e341b5e49141a6a54b1414ae81b2d5ac25ffd;p=php missing bits for php_sys_stat_ex so everything is handled with wide chars rename to pathw_len --- diff --git a/Zend/zend_virtual_cwd.c b/Zend/zend_virtual_cwd.c index 8759c992a9..f834fa3ad1 100644 --- a/Zend/zend_virtual_cwd.c +++ b/Zend/zend_virtual_cwd.c @@ -237,9 +237,9 @@ CWD_API int php_sys_stat_ex(const char *path, zend_stat_t *buf, int lstat) /* {{ { WIN32_FILE_ATTRIBUTE_DATA data; LARGE_INTEGER t; - const size_t path_len = strlen(path); + size_t pathw_len = 0; ALLOCA_FLAG(use_heap_large) - wchar_t *pathw = php_win32_ioutil_any_to_w(path); + wchar_t *pathw = php_win32_ioutil_conv_any_to_w(path, PHP_WIN32_CP_IGNORE_LEN, &pathw_len); if (!pathw) { return -1; @@ -257,13 +257,13 @@ CWD_API int php_sys_stat_ex(const char *path, zend_stat_t *buf, int lstat) /* {{ return ret; } - if (path_len >= 1 && path[1] == ':') { - if (path[0] >= 'A' && path[0] <= 'Z') { - buf->st_dev = buf->st_rdev = path[0] - 'A'; + if (pathw_len >= 1 && pathw[1] == L':') { + if (pathw[0] >= L'A' && pathw[0] <= L'Z') { + buf->st_dev = buf->st_rdev = pathw[0] - L'A'; } else { - buf->st_dev = buf->st_rdev = path[0] - 'a'; + buf->st_dev = buf->st_rdev = pathw[0] - L'a'; } - } else if (IS_UNC_PATH(path, path_len)) { + } else if (PHP_WIN32_IOUTIL_IS_UNC(pathw, pathw_len)) { buf->st_dev = buf->st_rdev = 0; } else { wchar_t cur_path[MAXPATHLEN+1]; @@ -324,13 +324,11 @@ CWD_API int php_sys_stat_ex(const char *path, zend_stat_t *buf, int lstat) /* {{ } if ((data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) { - size_t len = strlen(path); - - if (len >= 4 && path[len-4] == '.') { - if (_memicmp(path+len-3, "exe", 3) == 0 || - _memicmp(path+len-3, "com", 3) == 0 || - _memicmp(path+len-3, "bat", 3) == 0 || - _memicmp(path+len-3, "cmd", 3) == 0) { + if (pathw_len >= 4 && pathw[pathw_len-4] == L'.') { + if (_wcsnicmp(pathw+pathw_len-3, L"exe", 3) == 0 || + _wcsnicmp(pathw+pathw_len-3, L"com", 3) == 0 || + _wcsnicmp(pathw+pathw_len-3, L"bat", 3) == 0 || + _wcsnicmp(pathw+pathw_len-3, L"cmd", 3) == 0) { buf->st_mode |= (S_IEXEC|(S_IEXEC>>3)|(S_IEXEC>>6)); } } diff --git a/win32/ioutil.h b/win32/ioutil.h index da54f895f8..608e8a065e 100644 --- a/win32/ioutil.h +++ b/win32/ioutil.h @@ -114,6 +114,8 @@ typedef enum { && 0 == wcsncmp((pathw), PHP_WIN32_IOUTIL_LONG_PATH_PREFIXW, PHP_WIN32_IOUTIL_LONG_PATH_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]) \ + || 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_INIT_W(path) \ wchar_t *pathw = php_win32_ioutil_any_to_w(path); \