From 9b0d1d647e3d2ec9d299e5c9f49b02fbbb810a5a Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 9 Aug 2017 14:29:12 +0300 Subject: bpo-31070: Fix a race condition in importlib _get_module_lock(). (#3033) --- Lib/importlib/_bootstrap.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'Lib/importlib/_bootstrap.py') diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py index 493c272afa..fbd9392d41 100644 --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -172,8 +172,18 @@ def _get_module_lock(name): lock = _DummyModuleLock(name) else: lock = _ModuleLock(name) - def cb(_): - del _module_locks[name] + + def cb(ref, name=name): + _imp.acquire_lock() + try: + # bpo-31070: Check if another thread created a new lock + # after the previous lock was destroyed + # but before the weakref callback was called. + if _module_locks.get(name) is ref: + del _module_locks[name] + finally: + _imp.release_lock() + _module_locks[name] = _weakref.ref(lock, cb) finally: _imp.release_lock() -- cgit v1.2.1