summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--win32/ioutil.c1
-rw-r--r--win32/ioutil.h23
2 files changed, 12 insertions, 12 deletions
diff --git a/win32/ioutil.c b/win32/ioutil.c
index fc4413b2dd..b661a150af 100644
--- a/win32/ioutil.c
+++ b/win32/ioutil.c
@@ -425,6 +425,7 @@ PW32IO wchar_t *php_win32_ioutil_getcwd_w(const wchar_t *buf, int len)
if (!GetCurrentDirectoryW(len, buf)) {
err = GetLastError();
SET_ERRNO_FROM_WIN32_CODE(err);
+ return NULL;
}
return (wchar_t *)buf;
diff --git a/win32/ioutil.h b/win32/ioutil.h
index 2c96928dcd..d2e8239075 100644
--- a/win32/ioutil.h
+++ b/win32/ioutil.h
@@ -417,27 +417,28 @@ __forceinline static int php_win32_ioutil_chdir(const char *patha)
__forceinline static char *php_win32_ioutil_getcwd(char *buf, int len)
{/*{{{*/
- wchar_t *tmp_bufw = NULL;
+ wchar_t tmp_bufw[PHP_WIN32_IOUTIL_MAXPATHLEN];
char *tmp_bufa = NULL;
+ size_t tmp_bufa_len;
DWORD err = 0;
- tmp_bufw = php_win32_ioutil_getcwd_w(tmp_bufw, len);
- if (!tmp_bufw) {
+ if (php_win32_ioutil_getcwd_w(tmp_bufw, PHP_WIN32_IOUTIL_MAXPATHLEN) == NULL) {
err = GetLastError();
SET_ERRNO_FROM_WIN32_CODE(err);
return NULL;
}
- tmp_bufa = php_win32_ioutil_w_to_any(tmp_bufw);
+ tmp_bufa = php_win32_cp_conv_w_to_any(tmp_bufw, wcslen(tmp_bufw), &tmp_bufa_len);
if (!tmp_bufa) {
err = GetLastError();
- buf = NULL;
- free(tmp_bufw);
SET_ERRNO_FROM_WIN32_CODE(err);
- return buf;
- } else if ((int)strlen(tmp_bufa) > len) {
+ return NULL;
+ } else if (tmp_bufa_len + 1 > PHP_WIN32_IOUTIL_MAXPATHLEN) {
+ free(tmp_bufa);
+ SET_ERRNO_FROM_WIN32_CODE(ERROR_BAD_LENGTH);
+ return NULL;
+ } else if (tmp_bufa_len + 1 > len) {
free(tmp_bufa);
- free(tmp_bufw);
SET_ERRNO_FROM_WIN32_CODE(ERROR_INSUFFICIENT_BUFFER);
return NULL;
}
@@ -446,12 +447,10 @@ __forceinline static char *php_win32_ioutil_getcwd(char *buf, int len)
/* If buf was NULL, the result has to be freed outside here. */
buf = tmp_bufa;
} else {
- memmove(buf, tmp_bufa, len);
+ memmove(buf, tmp_bufa, tmp_bufa_len + 1);
free(tmp_bufa);
}
- free(tmp_bufw);
-
return buf;
}/*}}}*/