bpo-46297: Fix interpreter crash on startup with multiple PythonPaths set in registry (GH-30466)
This commit is contained in:
parent
74d1663580
commit
c9dc1f491e
@ -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:
|
||||||
|
@ -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
|
||||||
|
@ -0,0 +1,2 @@
|
|||||||
|
Fixed an interpreter crash on bootup with multiple PythonPaths set in
|
||||||
|
the Windows registry. Patch by Derzsi Dániel.
|
@ -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:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user