diff options
-rw-r--r-- | Modules/getpath.c | 12 | ||||
-rw-r--r-- | Python/fileutils.c | 14 |
2 files changed, 17 insertions, 9 deletions
diff --git a/Modules/getpath.c b/Modules/getpath.c index 9e5934d..2275c84 100644 --- a/Modules/getpath.c +++ b/Modules/getpath.c @@ -231,12 +231,12 @@ joinpath(wchar_t *buffer, wchar_t *stuff) /* copy_absolute requires that path be allocated at least MAXPATHLEN + 1 bytes and that p be no more than MAXPATHLEN bytes. */ static void -copy_absolute(wchar_t *path, wchar_t *p) +copy_absolute(wchar_t *path, wchar_t *p, size_t pathlen) { if (p[0] == SEP) wcscpy(path, p); else { - if (!_Py_wgetcwd(path, MAXPATHLEN)) { + if (!_Py_wgetcwd(path, pathlen)) { /* unable to get the current directory */ wcscpy(path, p); return; @@ -251,11 +251,11 @@ copy_absolute(wchar_t *path, wchar_t *p) static void absolutize(wchar_t *path) { - wchar_t buffer[MAXPATHLEN + 1]; + wchar_t buffer[MAXPATHLEN+1]; if (path[0] == SEP) return; - copy_absolute(buffer, path); + copy_absolute(buffer, path, MAXPATHLEN+1); wcscpy(path, buffer); } @@ -295,7 +295,7 @@ search_for_prefix(wchar_t *argv0_path, wchar_t *home) } /* Search from argv0_path, until root is found */ - copy_absolute(prefix, argv0_path); + copy_absolute(prefix, argv0_path, MAXPATHLEN+1); do { n = wcslen(prefix); joinpath(prefix, lib_python); @@ -372,7 +372,7 @@ search_for_exec_prefix(wchar_t *argv0_path, wchar_t *home) } /* Search from argv0_path, until root is found */ - copy_absolute(exec_prefix, argv0_path); + copy_absolute(exec_prefix, argv0_path, MAXPATHLEN+1); do { n = wcslen(exec_prefix); joinpath(exec_prefix, lib_python); diff --git a/Python/fileutils.c b/Python/fileutils.c index 9423cb0..564e2c0 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -364,7 +364,8 @@ _Py_wrealpath(const wchar_t *path, } #endif -/* Get the current directory. Decode the path from the locale encoding. */ +/* Get the current directory. size is the buffer size in wide characters + including the null character. Decode the path from the locale encoding. */ wchar_t* _Py_wgetcwd(wchar_t *buf, size_t size) @@ -373,12 +374,19 @@ _Py_wgetcwd(wchar_t *buf, size_t size) return _wgetcwd(buf, size); #else char fname[PATH_MAX]; + wchar_t *wname; + if (getcwd(fname, PATH_MAX) == NULL) return NULL; - if (mbstowcs(buf, fname, size) >= size) { - errno = ERANGE; + wname = _Py_char2wchar(fname); + if (wname == NULL) + return NULL; + if (size <= wcslen(wname)) { + PyMem_Free(wname); return NULL; } + wcsncpy(buf, wname, size); + PyMem_Free(wname); return buf; #endif } |