]> granicus.if.org Git - php/commitdiff
missing bits for php_sys_stat_ex so everything is handled with wide chars
authorAnatol Belski <ab@php.net>
Mon, 3 Apr 2017 14:30:40 +0000 (16:30 +0200)
committerAnatol Belski <ab@php.net>
Mon, 3 Apr 2017 15:39:15 +0000 (17:39 +0200)
rename to pathw_len

Zend/zend_virtual_cwd.c
win32/ioutil.h

index 8759c992a9b84383e5bc1b479c34fa86cc1b3f66..f834fa3ad1193985efc3ba77b3abba25d2f705f1 100644 (file)
@@ -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));
                        }
                }
index da54f895f856e14a31803e68e8984fa16fbedde7..608e8a065ea50ac675ce1f7cfdf45b2dcdf18f3b 100644 (file)
@@ -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); \