summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerek Brown <derek@allderek.com>2020-01-07 08:40:23 -0800
committerVinay Sajip <vinay_sajip@yahoo.co.uk>2020-01-07 16:40:23 +0000
commit950c6795aa0ffa85e103a13e7a04e08cb34c66ad (patch)
treedb44f0644d4fadec34da5f55c9460e1623f7f52f
parent5b23f7618d434f3000bde482233c8642a6eb2c67 (diff)
downloadcpython-git-950c6795aa0ffa85e103a13e7a04e08cb34c66ad.tar.gz
bpo-39198: Ensure logging global lock is released on exception in isEnabledFor (GH-17689)
-rw-r--r--Lib/logging/__init__.py15
-rw-r--r--Misc/NEWS.d/next/Library/2020-01-02-20-21-03.bpo-39198.nzwGyG.rst1
2 files changed, 10 insertions, 6 deletions
diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py
index 62a87a71b1..59d5fa5b64 100644
--- a/Lib/logging/__init__.py
+++ b/Lib/logging/__init__.py
@@ -1687,12 +1687,15 @@ class Logger(Filterer):
return self._cache[level]
except KeyError:
_acquireLock()
- if self.manager.disable >= level:
- is_enabled = self._cache[level] = False
- else:
- is_enabled = self._cache[level] = level >= self.getEffectiveLevel()
- _releaseLock()
-
+ try:
+ if self.manager.disable >= level:
+ is_enabled = self._cache[level] = False
+ else:
+ is_enabled = self._cache[level] = (
+ level >= self.getEffectiveLevel()
+ )
+ finally:
+ _releaseLock()
return is_enabled
def getChild(self, suffix):
diff --git a/Misc/NEWS.d/next/Library/2020-01-02-20-21-03.bpo-39198.nzwGyG.rst b/Misc/NEWS.d/next/Library/2020-01-02-20-21-03.bpo-39198.nzwGyG.rst
new file mode 100644
index 0000000000..ec4e81e2bb
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2020-01-02-20-21-03.bpo-39198.nzwGyG.rst
@@ -0,0 +1 @@
+If an exception were to be thrown in `Logger.isEnabledFor` (say, by asyncio timeouts or stopit) , the `logging` global lock may not be released appropriately, resulting in deadlock. This change wraps that block of code with `try...finally` to ensure the lock is released. \ No newline at end of file