From: Gregory P. Smith Date: Mon, 7 Jul 2008 04:31:58 +0000 (+0000) Subject: - Issue #3309: Fix bz2.BZFile itererator to release its internal lock X-Git-Tag: v2.6b2~96 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3b1e6b2f833d1e030b2ff853e1a942dc0de968f5;p=thirdparty%2FPython%2Fcpython.git - 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. --- diff --git a/Lib/test/test_bz2.py b/Lib/test/test_bz2.py index b8b3c0310271..c4d9b6968a34 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 2dfa33ab51ff..c544739aefc0 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 bbabe101e583..16201bd6486c 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;