]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-45375: Fix assertion failure due to searching for stdlib in unnormalised paths...
authorSteve Dower <steve.dower@python.org>
Tue, 5 Oct 2021 12:37:43 +0000 (13:37 +0100)
committerGitHub <noreply@github.com>
Tue, 5 Oct 2021 12:37:43 +0000 (13:37 +0100)
Misc/NEWS.d/next/Windows/2021-10-05-12-41-53.bpo-45375.CohPP-.rst [new file with mode: 0644]
PC/getpathp.c
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 (file)
index 0000000..c721643
--- /dev/null
@@ -0,0 +1,2 @@
+Fixes an assertion failure due to searching for the standard library in
+unnormalised paths.
index 16bb4997f819b7fb95d5577a330783fcae9d2431..98a754976c670866f1a3c4d437bc789d1f632bda 100644 (file)
@@ -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)) {
index 9492cff2d8c3eaaec288e453c5db2f8382691524..c0bde1ec6ba51155a224213b97a4375078c29bb9 100644 (file)
           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>