mirror of
https://github.com/python/cpython.git
synced 2026-04-05 03:21:05 +00:00
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:
parent
5e8dc97a09
commit
7a076bed4c
3 changed files with 16 additions and 0 deletions
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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
|
||||
-----------------
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue