iterators passed to writelines() can close their files; don't segfault #10125
This commit is contained in:
parent
f76942d6bf
commit
bf775542b0
|
@ -135,6 +135,14 @@ class AutoFileTests(unittest.TestCase):
|
|||
def testReadWhenWriting(self):
|
||||
self.assertRaises(IOError, self.f.read)
|
||||
|
||||
def testNastyWritelinesGenerator(self):
|
||||
def nasty():
|
||||
for i in range(5):
|
||||
if i == 3:
|
||||
self.f.close()
|
||||
yield str(i)
|
||||
self.assertRaises(ValueError, self.f.writelines, nasty())
|
||||
|
||||
def testIssue5677(self):
|
||||
# Remark: Do not perform more than one test per open file,
|
||||
# since that does NOT catch the readline error on Windows.
|
||||
|
|
|
@ -10,6 +10,9 @@ What's New in Python 2.7.1?
|
|||
Core and Builtins
|
||||
-----------------
|
||||
|
||||
- Issue #10125: Don't segfault when the iterator passed to ``file.writelines()``
|
||||
closes the file.
|
||||
|
||||
- Issue #9997: Don't let the name "top" have special significance in scope
|
||||
resolution.
|
||||
|
||||
|
|
|
@ -1849,6 +1849,11 @@ file_writelines(PyFileObject *f, PyObject *seq)
|
|||
}
|
||||
PyList_SetItem(list, j, line);
|
||||
}
|
||||
/* The iterator might have closed the file on us. */
|
||||
if (f->f_fp == NULL) {
|
||||
err_closed();
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
if (j == 0)
|
||||
break;
|
||||
|
|
Loading…
Reference in New Issue