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)
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:

View file

@ -400,6 +400,7 @@ Lars Damerow
Evan Dandrea
Eric Daniel
Scott David Daniels
Derzsi Dániel
Lawrence D'Anna
Ben Darnell
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

@ -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)
v = winreg.QueryValue(key, winreg.EnumKey(key, i))
except OSError:
break
if isinstance(v, str):
pythonpath.append(v)
i += 1
except OSError:
break
finally:
winreg.CloseKey(key)
except OSError: