com php-src: Keep up with Linux extension to POSIX.1-2001 getcwd(): win32/ioutil.h
| From: | Anatol Belski | Date: | Tue, 28 Nov 2017 08:15:14 +0000 |
| Subject: | com php-src: Keep up with Linux extension to POSIX.1-2001 getcwd(): win32/ioutil.h | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-100400@lists.php.net to get a copy of this message | ||
Commit: 4a2ccd908be193fdc34a91306febb7153cc461eb
Author: Anatol Belski <ab@php.net> Mon, 27 Nov 2017 14:09:59 +0100
Parents: e9927994eb66196fa26b65dcc1c30c03f01cf9a5
Branches: master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=4a2ccd908be193fdc34a91306febb7153cc461eb
Log:
Keep up with Linux extension to POSIX.1-2001 getcwd()
If both buf and size are zero, the buf is allocated as big as required.
Otherwise, the size is still to respect.
Fix var name
Improve error check
Ensure the end buffer length is not bigger than requested
Changed paths:
M win32/ioutil.h
Diff:
diff --git a/win32/ioutil.h b/win32/ioutil.h
index 01e8e23..c470fdb 100644
--- a/win32/ioutil.h
+++ b/win32/ioutil.h
@@ -473,7 +473,12 @@ __forceinline static char *php_win32_ioutil_getcwd(char *buf, size_t len)
size_t tmp_bufa_len;
DWORD err = 0;
- if (php_win32_ioutil_getcwd_w(tmp_bufw, len) == NULL) {
+ if (len > PHP_WIN32_IOUTIL_MAXPATHLEN) {
+ SET_ERRNO_FROM_WIN32_CODE(ERROR_BAD_LENGTH);
+ return NULL;
+ }
+
+ if (php_win32_ioutil_getcwd_w(tmp_bufw, len ? len : PHP_WIN32_IOUTIL_MAXPATHLEN) == NULL) {
err = GetLastError();
SET_ERRNO_FROM_WIN32_CODE(err);
return NULL;
@@ -488,17 +493,16 @@ __forceinline static char *php_win32_ioutil_getcwd(char *buf, size_t len)
free(tmp_bufa);
SET_ERRNO_FROM_WIN32_CODE(ERROR_BAD_LENGTH);
return NULL;
+ } else if (tmp_bufa_len + 1 > len) {
+ free(tmp_bufa);
+ SET_ERRNO_FROM_WIN32_CODE(ERROR_INSUFFICIENT_BUFFER);
+ return NULL;
}
- if (!buf) {
+ if (!buf && !len) {
/* If buf was NULL, the result has to be freed outside here. */
buf = tmp_bufa;
} else {
- if (tmp_bufa_len + 1 > len) {
- free(tmp_bufa);
- SET_ERRNO_FROM_WIN32_CODE(ERROR_INSUFFICIENT_BUFFER);
- return NULL;
- }
memmove(buf, tmp_bufa, tmp_bufa_len + 1);
free(tmp_bufa);
}