From c9dc1f491e8edb0bc433cde73190a3015d226891 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 8 Jan 2022 00:26:00 +0200 Subject: bpo-46297: Fix interpreter crash on startup with multiple PythonPaths set in registry (GH-30466) --- Lib/test/test_getpath.py | 7 +++++-- Misc/ACKS | 1 + .../2022-01-07-22-13-59.bpo-46297.83ThTl.rst | 2 ++ Modules/getpath.py | 17 +++++------------ 4 files changed, 13 insertions(+), 14 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2022-01-07-22-13-59.bpo-46297.83ThTl.rst diff --git a/Lib/test/test_getpath.py b/Lib/test/test_getpath.py index 232b680..1a336a4 100644 --- a/Lib/test/test_getpath.py +++ b/Lib/test/test_getpath.py @@ -734,12 +734,15 @@ class MockWinreg: 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 8baaf73..7f2e94d 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 0000000..558d239 --- /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 37d2ea0..6f2e038 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 @@ elif not pythonpath: 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: -- cgit v0.12