summaryrefslogtreecommitdiffstats
path: root/PC
diff options
context:
space:
mode:
authorSteve Dower <steve.dower@python.org>2021-10-05 12:37:43 (GMT)
committerGitHub <noreply@github.com>2021-10-05 12:37:43 (GMT)
commit5146877623ebe8a2806411703b0de9c0aba179a1 (patch)
tree09351082bb64585fc180337338d0d6e25f3455e1 /PC
parentde4052fe0633e3a053e66c8477f13677054d6ede (diff)
downloadcpython-5146877623ebe8a2806411703b0de9c0aba179a1.zip
cpython-5146877623ebe8a2806411703b0de9c0aba179a1.tar.gz
cpython-5146877623ebe8a2806411703b0de9c0aba179a1.tar.bz2
bpo-45375: Fix assertion failure due to searching for stdlib in unnormalised paths (GH-28735)
Diffstat (limited to 'PC')
-rw-r--r--PC/getpathp.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/PC/getpathp.c b/PC/getpathp.c
index 16bb499..98a7549 100644
--- a/PC/getpathp.c
+++ b/PC/getpathp.c
@@ -265,7 +265,21 @@ canonicalize(wchar_t *buffer, const wchar_t *path)
return _PyStatus_NO_MEMORY();
}
- if (FAILED(PathCchCanonicalizeEx(buffer, MAXPATHLEN + 1, path, 0))) {
+ if (PathIsRelativeW(path)) {
+ wchar_t buff[MAXPATHLEN];
+ if (!GetCurrentDirectoryW(MAXPATHLEN, buff)) {
+ return _PyStatus_ERR("unable to find current working directory");
+ }
+ if (FAILED(PathCchCombineEx(buff, MAXPATHLEN + 1, buff, path, PATHCCH_ALLOW_LONG_PATHS))) {
+ return INIT_ERR_BUFFER_OVERFLOW();
+ }
+ if (FAILED(PathCchCanonicalizeEx(buffer, MAXPATHLEN + 1, buff, PATHCCH_ALLOW_LONG_PATHS))) {
+ return INIT_ERR_BUFFER_OVERFLOW();
+ }
+ return _PyStatus_OK();
+ }
+
+ if (FAILED(PathCchCanonicalizeEx(buffer, MAXPATHLEN + 1, path, PATHCCH_ALLOW_LONG_PATHS))) {
return INIT_ERR_BUFFER_OVERFLOW();
}
return _PyStatus_OK();
@@ -291,6 +305,9 @@ search_for_prefix(wchar_t *prefix, const wchar_t *argv0_path)
/* Search from argv0_path, until LANDMARK is found.
We guarantee 'prefix' is null terminated in bounds. */
wcscpy_s(prefix, MAXPATHLEN+1, argv0_path);
+ if (!prefix[0]) {
+ return 0;
+ }
wchar_t stdlibdir[MAXPATHLEN+1];
wcscpy_s(stdlibdir, Py_ARRAY_LENGTH(stdlibdir), prefix);
/* We initialize with the longest possible path, in case it doesn't fit.
@@ -925,6 +942,7 @@ calculate_module_search_path(PyCalculatePath *calculate,
the parent of that.
*/
if (prefix[0] == L'\0') {
+ PyStatus status;
wchar_t lookBuf[MAXPATHLEN+1];
const wchar_t *look = buf - 1; /* 'buf' is at the end of the buffer */
while (1) {
@@ -939,6 +957,10 @@ calculate_module_search_path(PyCalculatePath *calculate,
nchars = lookEnd-look;
wcsncpy(lookBuf, look+1, nchars);
lookBuf[nchars] = L'\0';
+ status = canonicalize(lookBuf, lookBuf);
+ if (_PyStatus_EXCEPTION(status)) {
+ return status;
+ }
/* Up one level to the parent */
reduce(lookBuf);
if (search_for_prefix(prefix, lookBuf)) {