Commit bf775542 authored by Benjamin Peterson's avatar Benjamin Peterson

iterators passed to writelines() can close their files; don't segfault #10125

parent f76942d6
......@@ -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;
......
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