[Python-checkins] bpo-45375: Fix assertion failure due to searching for stdlib in unnormalised paths (GH-28735)

zooba webhook-mailer at python.org
Tue Oct 5 08:37:55 EDT 2021


https://github.com/python/cpython/commit/5146877623ebe8a2806411703b0de9c0aba179a1
commit: 5146877623ebe8a2806411703b0de9c0aba179a1
branch: main
author: Steve Dower <steve.dower at python.org>
committer: zooba <steve.dower at microsoft.com>
date: 2021年10月05日T13:37:43+01:00
summary:
bpo-45375: Fix assertion failure due to searching for stdlib in unnormalised paths (GH-28735)
files:
A Misc/NEWS.d/next/Windows/2021-10-05-12-41-53.bpo-45375.CohPP-.rst
M PC/getpathp.c
M PCbuild/regen.targets
diff --git a/Misc/NEWS.d/next/Windows/2021-10-05-12-41-53.bpo-45375.CohPP-.rst b/Misc/NEWS.d/next/Windows/2021-10-05-12-41-53.bpo-45375.CohPP-.rst
new file mode 100644
index 0000000000000..c72164373abe6
--- /dev/null
+++ b/Misc/NEWS.d/next/Windows/2021-10-05-12-41-53.bpo-45375.CohPP-.rst
@@ -0,0 +1,2 @@
+Fixes an assertion failure due to searching for the standard library in
+unnormalised paths.
diff --git a/PC/getpathp.c b/PC/getpathp.c
index 16bb4997f819b..98a754976c670 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)) {
diff --git a/PCbuild/regen.targets b/PCbuild/regen.targets
index 9492cff2d8c3e..c0bde1ec6ba51 100644
--- a/PCbuild/regen.targets
+++ b/PCbuild/regen.targets
@@ -104,7 +104,9 @@
 Condition="($(Platform) == 'Win32' or $(Platform) == 'x64') and
 $(Configuration) != 'PGInstrument' and $(Configuration) != 'PGUpdate'">
 <Message Text="Regenerate @(_TestFrozenOutputs->'%(Filename)%(Extension)', ' ')" Importance="high" />
- <Exec Command="$(PythonExe) Programs\freeze_test_frozenmain.py Programs/test_frozenmain.h"
+ <Exec Command='setlocal
+set PYTHONPATH=$(PySourcePath)Lib
+"$(PythonExe)" Programs\freeze_test_frozenmain.py Programs\test_frozenmain.h'
 WorkingDirectory="$(PySourcePath)" />
 </Target>
 


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /