[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