summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2020-01-07 17:03:49 (GMT)
committerVinay Sajip <vinay_sajip@yahoo.co.uk>2020-01-07 17:03:49 (GMT)
commitd46dec981abdefba56336521c7587c8554bb1b9d (patch)
tree504fe1104295320ba8121177d24b44136abb942b
parent72995c5cdd7ad4af6252bbe129e8fc63f5006130 (diff)
downloadcpython-d46dec981abdefba56336521c7587c8554bb1b9d.zip
cpython-d46dec981abdefba56336521c7587c8554bb1b9d.tar.gz
cpython-d46dec981abdefba56336521c7587c8554bb1b9d.tar.bz2
bpo-39198: Ensure logging global lock is released on exception in isEnabledFor (GH-17689) (GH-17898)
(cherry picked from commit 950c6795aa0ffa85e103a13e7a04e08cb34c66ad)
-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 6e01714..b596f80 100644
--- a/Lib/logging/__init__.py
+++ b/Lib/logging/__init__.py
@@ -1619,12 +1619,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 0000000..ec4e81e
--- /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