Backport of r64767 from trunk

Fixes Issue #3309: Fix bz2.BZFile iterator to release its internal lock
properly when raising an exception due to the bz2file being closed.
Prevents a deadlock.
This commit is contained in:
Gregory P. Smith 2008-08-17 23:06:19 +00:00
parent 5e8dc97a09
commit 7a076bed4c
3 changed files with 16 additions and 0 deletions

View file

@ -110,6 +110,17 @@ def testIterator(self):
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()

View file

@ -148,6 +148,10 @@ Library
up in the child process to prevent deadlock and report proper thread counts
if the new process uses the threading module.
- Issue #3309: Fix bz2.BZFile iterator to release its internal lock
properly when raising an exception due to the bz2file being closed.
Prevents a deadlock.
Extension Modules
-----------------

View file

@ -1437,6 +1437,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;