From 1be0d1135f5627d0525eab635cf2da441d9cbc08 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 18 Mar 2019 17:47:26 +0100 Subject: bpo-36352: Clarify fileutils.h documentation (GH-12406) The last parameter of _Py_wreadlink(), _Py_wrealpath() and _Py_wgetcwd() is a length, not a size: number of characters including the trailing NUL character. Enhance also documentation of error conditions. --- Python/fileutils.c | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) (limited to 'Python/fileutils.c') diff --git a/Python/fileutils.c b/Python/fileutils.c index 75e015afae..0ac690a211 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -1629,10 +1629,12 @@ _Py_write_noraise(int fd, const void *buf, size_t count) #ifdef HAVE_READLINK /* Read value of symbolic link. Encode the path to the locale encoding, decode - the result from the locale encoding. Return -1 on error. */ + the result from the locale encoding. + Return -1 on encoding error, on readlink() error, if the internal buffer is + too short, on decoding error, or if 'buf' is too short. */ int -_Py_wreadlink(const wchar_t *path, wchar_t *buf, size_t bufsiz) +_Py_wreadlink(const wchar_t *path, wchar_t *buf, size_t buflen) { char *cpath; char cbuf[MAXPATHLEN]; @@ -1659,12 +1661,13 @@ _Py_wreadlink(const wchar_t *path, wchar_t *buf, size_t bufsiz) errno = EINVAL; return -1; } - if (bufsiz <= r1) { + /* wbuf must have space to store the trailing NUL character */ + if (buflen <= r1) { PyMem_RawFree(wbuf); errno = EINVAL; return -1; } - wcsncpy(buf, wbuf, bufsiz); + wcsncpy(buf, wbuf, buflen); PyMem_RawFree(wbuf); return (int)r1; } @@ -1674,11 +1677,12 @@ _Py_wreadlink(const wchar_t *path, wchar_t *buf, size_t bufsiz) /* Return the canonicalized absolute pathname. Encode path to the locale encoding, decode the result from the locale encoding. - Return NULL on error. */ + Return NULL on encoding error, realpath() error, decoding error + or if 'resolved_path' is too short. */ wchar_t* _Py_wrealpath(const wchar_t *path, - wchar_t *resolved_path, size_t resolved_path_size) + wchar_t *resolved_path, size_t resolved_path_len) { char *cpath; char cresolved_path[MAXPATHLEN]; @@ -1700,12 +1704,13 @@ _Py_wrealpath(const wchar_t *path, errno = EINVAL; return NULL; } - if (resolved_path_size <= r) { + /* wresolved_path must have space to store the trailing NUL character */ + if (resolved_path_len <= r) { PyMem_RawFree(wresolved_path); errno = EINVAL; return NULL; } - wcsncpy(resolved_path, wresolved_path, resolved_path_size); + wcsncpy(resolved_path, wresolved_path, resolved_path_len); PyMem_RawFree(wresolved_path); return resolved_path; } @@ -1713,14 +1718,15 @@ _Py_wrealpath(const wchar_t *path, /* Get the current directory. size is the buffer size in wide characters including the null character. Decode the path from the locale encoding. - Return NULL on error. */ + Return NULL on getcwd() error, on decoding error, or if 'buf' is + too short. */ wchar_t* -_Py_wgetcwd(wchar_t *buf, size_t size) +_Py_wgetcwd(wchar_t *buf, size_t buflen) { #ifdef MS_WINDOWS - int isize = (int)Py_MIN(size, INT_MAX); - return _wgetcwd(buf, isize); + int ibuflen = (int)Py_MIN(buflen, INT_MAX); + return _wgetcwd(buf, ibuflen); #else char fname[MAXPATHLEN]; wchar_t *wname; @@ -1731,11 +1737,12 @@ _Py_wgetcwd(wchar_t *buf, size_t size) wname = Py_DecodeLocale(fname, &len); if (wname == NULL) return NULL; - if (size <= len) { + /* wname must have space to store the trailing NUL character */ + if (buflen <= len) { PyMem_RawFree(wname); return NULL; } - wcsncpy(buf, wname, size); + wcsncpy(buf, wname, buflen); PyMem_RawFree(wname); return buf; #endif -- cgit v1.2.1 From faddaedd05ca81a9fed3f315e7bc8dcf455824a2 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 19 Mar 2019 02:58:14 +0100 Subject: bpo-36352: Avoid hardcoded MAXPATHLEN size in getpath.c (GH-12423) * Use Py_ARRAY_LENGTH() rather than hardcoded MAXPATHLEN in getpath.c. * Pass string length to functions modifying strings. --- Python/fileutils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Python/fileutils.c') diff --git a/Python/fileutils.c b/Python/fileutils.c index 0ac690a211..b933874193 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -1716,7 +1716,7 @@ _Py_wrealpath(const wchar_t *path, } #endif -/* Get the current directory. size is the buffer size in wide characters +/* Get the current directory. buflen is the buffer size in wide characters including the null character. Decode the path from the locale encoding. Return NULL on getcwd() error, on decoding error, or if 'buf' is -- cgit v1.2.1