[Python-checkins] bpo-46297: Fix interpreter crash on startup with multiple PythonPaths set in registry (GH-30466)

zooba webhook-mailer at python.org
Fri Jan 7 17:26:10 EST 2022


https://github.com/python/cpython/commit/c9dc1f491e8edb0bc433cde73190a3015d226891
commit: c9dc1f491e8edb0bc433cde73190a3015d226891
branch: main
author: Daniel <daniel at tohka.us>
committer: zooba <steve.dower at microsoft.com>
date: 2022-01-07T22:26:00Z
summary:

bpo-46297: Fix interpreter crash on startup with multiple PythonPaths set in registry (GH-30466)

files:
A Misc/NEWS.d/next/Core and Builtins/2022-01-07-22-13-59.bpo-46297.83ThTl.rst
M Lib/test/test_getpath.py
M Misc/ACKS
M Modules/getpath.py

diff --git a/Lib/test/test_getpath.py b/Lib/test/test_getpath.py
index 232b6805284354..1a336a4abcafdb 100644
--- a/Lib/test/test_getpath.py
+++ b/Lib/test/test_getpath.py
@@ -734,12 +734,15 @@ def EnumKey(self, hkey, i):
                 return n.removeprefix(prefix)
         raise OSError("end of enumeration")
 
-    def QueryValue(self, hkey):
+    def QueryValue(self, hkey, subkey):
         if verbose:
-            print(f"QueryValue({hkey})")
+            print(f"QueryValue({hkey}, {subkey})")
         hkey = hkey.casefold()
         if hkey not in self.open:
             raise RuntimeError("key is not open")
+        if subkey:
+            subkey = subkey.casefold()
+            hkey = f'{hkey}\\{subkey}'
         try:
             return self.keys[hkey]
         except KeyError:
diff --git a/Misc/ACKS b/Misc/ACKS
index 8baaf7304b603c..7f2e94dfa615f1 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -400,6 +400,7 @@ Lars Damerow
 Evan Dandrea
 Eric Daniel
 Scott David Daniels
+Derzsi Dániel
 Lawrence D'Anna
 Ben Darnell
 Kushal Das
diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-01-07-22-13-59.bpo-46297.83ThTl.rst b/Misc/NEWS.d/next/Core and Builtins/2022-01-07-22-13-59.bpo-46297.83ThTl.rst
new file mode 100644
index 00000000000000..558d2392d61029
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2022-01-07-22-13-59.bpo-46297.83ThTl.rst	
@@ -0,0 +1,2 @@
+Fixed an interpreter crash on bootup with multiple PythonPaths set in
+the Windows registry. Patch by Derzsi Dániel.
diff --git a/Modules/getpath.py b/Modules/getpath.py
index 37d2ea03b0bbd2..6f2e0385577221 100644
--- a/Modules/getpath.py
+++ b/Modules/getpath.py
@@ -127,7 +127,7 @@
 # checked by looking for the BUILDDIR_TXT file, which contains the
 # relative path to the platlib dir. The executable_dir value is
 # derived from joining the VPATH preprocessor variable to the
-# directory containing pybuilddir.txt. If it is not found, the 
+# directory containing pybuilddir.txt. If it is not found, the
 # BUILD_LANDMARK file is found, which is part of the source tree.
 # prefix is then found by searching up for a file that should only
 # exist in the source tree, and the stdlib dir is set to prefix/Lib.
@@ -642,19 +642,12 @@ def search_up(prefix, *landmarks, test=isfile):
                     i = 0
                     while True:
                         try:
-                            keyname = winreg.EnumKey(key, i)
-                            subkey = winreg.OpenKeyEx(key, keyname)
-                            if not subkey:
-                                continue
-                            try:
-                                v = winreg.QueryValue(subkey)
-                            finally:
-                                winreg.CloseKey(subkey)
-                            if isinstance(v, str):
-                                pythonpath.append(v)
-                            i += 1
+                            v = winreg.QueryValue(key, winreg.EnumKey(key, i))
                         except OSError:
                             break
+                        if isinstance(v, str):
+                            pythonpath.append(v)
+                        i += 1
                 finally:
                     winreg.CloseKey(key)
             except OSError:



More information about the Python-checkins mailing list