]> granicus.if.org Git - php/commitdiff
rewrite the getcwd part
authorAnatol Belski <ab@php.net>
Thu, 1 Sep 2016 19:31:40 +0000 (21:31 +0200)
committerAnatol Belski <ab@php.net>
Thu, 1 Sep 2016 21:45:31 +0000 (23:45 +0200)
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.

Zend/zend_virtual_cwd.c

index ce5f1ff066242d3d2f957d1c16be224d675ccf4e..be2dd0da57390b0c4c6d685c9aced26162bd01ac 100644 (file)
@@ -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;
                }
        }