diff options
-rw-r--r-- | Lib/test/test_getpath.py | 7 | ||||
-rw-r--r-- | Misc/ACKS | 1 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Core and Builtins/2022-01-07-22-13-59.bpo-46297.83ThTl.rst | 2 | ||||
-rw-r--r-- | Modules/getpath.py | 17 |
4 files changed, 13 insertions, 14 deletions
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: @@ -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: |