summaryrefslogtreecommitdiffstats
path: root/Lib/pickle.py
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2014-10-04 20:15:27 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2014-10-04 20:15:27 (GMT)
commite1618491adc5c0ef214c25d4e3b882e8586a2fee (patch)
tree0d91357929681b4329601ede97fab846a182abac /Lib/pickle.py
parentfb8eaae6eb3996f9b02db81662be4e92b690d344 (diff)
downloadcpython-e1618491adc5c0ef214c25d4e3b882e8586a2fee.zip
cpython-e1618491adc5c0ef214c25d4e3b882e8586a2fee.tar.gz
cpython-e1618491adc5c0ef214c25d4e3b882e8586a2fee.tar.bz2
Issue #21905: Avoid RuntimeError in pickle.whichmodule() when sys.modules is mutated while iterating.
Patch by Olivier Grisel.
Diffstat (limited to 'Lib/pickle.py')
-rw-r--r--Lib/pickle.py4
1 files changed, 3 insertions, 1 deletions
diff --git a/Lib/pickle.py b/Lib/pickle.py
index 3fc2596..663773f 100644
--- a/Lib/pickle.py
+++ b/Lib/pickle.py
@@ -280,7 +280,9 @@ def whichmodule(obj, name, allow_qualname=False):
module_name = getattr(obj, '__module__', None)
if module_name is not None:
return module_name
- for module_name, module in sys.modules.items():
+ # Protect the iteration by using a list copy of sys.modules against dynamic
+ # modules that trigger imports of other modules upon calls to getattr.
+ for module_name, module in list(sys.modules.items()):
if module_name == '__main__' or module is None:
continue
try: