diff options
author | Anatol Belski <ab@php.net> | 2016-09-01 21:31:40 +0200 |
---|---|---|
committer | Anatol Belski <ab@php.net> | 2016-09-01 23:45:31 +0200 |
commit | ac82a3418507b7f292783c7281cadf3388b9db0b (patch) | |
tree | 09a04886310c9a7f67ad63cec7ada020cd8f58aa | |
parent | 7020e6f9ae6d12e841e09aa582d843ffa5478e08 (diff) | |
download | php-git-ac82a3418507b7f292783c7281cadf3388b9db0b.tar.gz |
rewrite the getcwd part
Also fixes a possible memory leak. Still not ideal, as seems CWD
longer than MAX_PATH is still not supported. But a heap allocation
is not needed anyway, as MAXPATHLEN value is the maximum supported.
-rw-r--r-- | Zend/zend_virtual_cwd.c | 31 |
1 files changed, 9 insertions, 22 deletions
diff --git a/Zend/zend_virtual_cwd.c b/Zend/zend_virtual_cwd.c index ce5f1ff066..be2dd0da57 100644 --- a/Zend/zend_virtual_cwd.c +++ b/Zend/zend_virtual_cwd.c @@ -328,32 +328,19 @@ CWD_API int php_sys_stat_ex(const char *path, zend_stat_t *buf, int lstat) /* {{ buf->st_dev = buf->st_rdev = 0; } else { wchar_t cur_path[MAXPATHLEN+1]; - DWORD len = sizeof(cur_path); - wchar_t *tmp = cur_path; - - while(1) { - DWORD r = GetCurrentDirectoryW(len, tmp); - if (r < len) { - if (tmp[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 = pathw[0] - L'a'; - } + + if (NULL != _wgetcwd(cur_path, sizeof(cur_path)/sizeof(wchar_t))) { + if (cur_path[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 = -1; + buf->st_dev = buf->st_rdev = pathw[0] - L'a'; } - break; - } else if (!r) { - buf->st_dev = buf->st_rdev = -1; - break; } else { - len = r+1; - tmp = (wchar_t*)malloc(len*sizeof(wchar_t)); + buf->st_dev = buf->st_rdev = -1; } - } - if (tmp != cur_path) { - free(tmp); + } else { + buf->st_dev = buf->st_rdev = -1; } } |