Commit 7a076bed authored by Gregory P. Smith's avatar Gregory P. Smith

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.
parent 5e8dc97a
...@@ -110,6 +110,17 @@ class BZ2FileTest(BaseTest): ...@@ -110,6 +110,17 @@ class BZ2FileTest(BaseTest):
self.assertEqual(list(iter(bz2f)), sio.readlines()) self.assertEqual(list(iter(bz2f)), sio.readlines())
bz2f.close() 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): def testXReadLines(self):
# "Test BZ2File.xreadlines()" # "Test BZ2File.xreadlines()"
self.createTempFile() self.createTempFile()
......
...@@ -148,6 +148,10 @@ Library ...@@ -148,6 +148,10 @@ Library
up in the child process to prevent deadlock and report proper thread counts up in the child process to prevent deadlock and report proper thread counts
if the new process uses the threading module. 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 Extension Modules
----------------- -----------------
......
...@@ -1437,6 +1437,7 @@ BZ2File_iternext(BZ2FileObject *self) ...@@ -1437,6 +1437,7 @@ BZ2File_iternext(BZ2FileObject *self)
PyStringObject* ret; PyStringObject* ret;
ACQUIRE_LOCK(self); ACQUIRE_LOCK(self);
if (self->mode == MODE_CLOSED) { if (self->mode == MODE_CLOSED) {
RELEASE_LOCK(self);
PyErr_SetString(PyExc_ValueError, PyErr_SetString(PyExc_ValueError,
"I/O operation on closed file"); "I/O operation on closed file");
return NULL; return NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment