summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnatol Belski <ab@php.net>2016-09-01 21:31:40 +0200
committerAnatol Belski <ab@php.net>2016-09-01 23:45:31 +0200
commitac82a3418507b7f292783c7281cadf3388b9db0b (patch)
tree09a04886310c9a7f67ad63cec7ada020cd8f58aa
parent7020e6f9ae6d12e841e09aa582d843ffa5478e08 (diff)
downloadphp-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.c31
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;
}
}