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

This commit is contained in:
Daniel 2022-01-08 00:26:00 +02:00 committed by GitHub
parent 74d1663580
commit c9dc1f491e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 13 additions and 14 deletions

View File

@ -734,12 +734,15 @@ class MockWinreg:
return n.removeprefix(prefix) return n.removeprefix(prefix)
raise OSError("end of enumeration") raise OSError("end of enumeration")
def QueryValue(self, hkey): def QueryValue(self, hkey, subkey):
if verbose: if verbose:
print(f"QueryValue({hkey})") print(f"QueryValue({hkey}, {subkey})")
hkey = hkey.casefold() hkey = hkey.casefold()
if hkey not in self.open: if hkey not in self.open:
raise RuntimeError("key is not open") raise RuntimeError("key is not open")
if subkey:
subkey = subkey.casefold()
hkey = f'{hkey}\\{subkey}'
try: try:
return self.keys[hkey] return self.keys[hkey]
except KeyError: except KeyError:

View File

@ -400,6 +400,7 @@ Lars Damerow
Evan Dandrea Evan Dandrea
Eric Daniel Eric Daniel
Scott David Daniels Scott David Daniels
Derzsi Dániel
Lawrence D'Anna Lawrence D'Anna
Ben Darnell Ben Darnell
Kushal Das Kushal Das

View File

@ -0,0 +1,2 @@
Fixed an interpreter crash on bootup with multiple PythonPaths set in
the Windows registry. Patch by Derzsi Dániel.

View File

@ -127,7 +127,7 @@
# checked by looking for the BUILDDIR_TXT file, which contains the # checked by looking for the BUILDDIR_TXT file, which contains the
# relative path to the platlib dir. The executable_dir value is # relative path to the platlib dir. The executable_dir value is
# derived from joining the VPATH preprocessor variable to the # 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. # 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 # 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. # exist in the source tree, and the stdlib dir is set to prefix/Lib.
@ -642,19 +642,12 @@ elif not pythonpath:
i = 0 i = 0
while True: while True:
try: try:
keyname = winreg.EnumKey(key, i) v = winreg.QueryValue(key, 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
except OSError: except OSError:
break break
if isinstance(v, str):
pythonpath.append(v)
i += 1
finally: finally:
winreg.CloseKey(key) winreg.CloseKey(key)
except OSError: except OSError: