From 3b1e6b2f833d1e030b2ff853e1a942dc0de968f5 Mon Sep 17 00:00:00 2001 From: "Gregory P. Smith" Date: Mon, 7 Jul 2008 04:31:58 +0000 Subject: [PATCH] - Issue #3309: Fix bz2.BZFile itererator to release its internal lock properly when raising an exception due to the bz2file being closed. Prevents a deadlock. --- Lib/test/test_bz2.py | 11 +++++++++++ Misc/NEWS | 4 ++++ Modules/bz2module.c | 1 + 3 files changed, 16 insertions(+) diff --git a/Lib/test/test_bz2.py b/Lib/test/test_bz2.py index b8b3c031027..c4d9b6968a3 100644 --- a/Lib/test/test_bz2.py +++ b/Lib/test/test_bz2.py @@ -112,6 +112,17 @@ class BZ2FileTest(BaseTest): self.assertEqual(list(iter(bz2f)), sio.readlines()) bz2f.close() + def testClosedIteratorDeadlock(self): + # "Test that iteration on a closed bz2file releases the lock." + # http://bugs.python.org/issue3309 + self.createTempFile() + bz2f = BZ2File(self.filename) + bz2f.close() + self.assertRaises(ValueError, bz2f.next) + # This call will deadlock of the above .next call failed to + # release the lock. + self.assertRaises(ValueError, bz2f.readlines) + def testXReadLines(self): # "Test BZ2File.xreadlines()" self.createTempFile() diff --git a/Misc/NEWS b/Misc/NEWS index 2dfa33ab51f..c544739aefc 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -68,6 +68,10 @@ Library - Issue #2113: Fix error in subprocess.Popen if the select system call is interrupted by a signal. +- Issue #3309: Fix bz2.BZFile itererator to release its internal lock + properly when raising an exception due to the bz2file being closed. + Prevents a deadlock. + Build ----- diff --git a/Modules/bz2module.c b/Modules/bz2module.c index bbabe101e58..16201bd6486 100644 --- a/Modules/bz2module.c +++ b/Modules/bz2module.c @@ -1451,6 +1451,7 @@ BZ2File_iternext(BZ2FileObject *self) PyStringObject* ret; ACQUIRE_LOCK(self); if (self->mode == MODE_CLOSED) { + RELEASE_LOCK(self); PyErr_SetString(PyExc_ValueError, "I/O operation on closed file"); return NULL;