iterators passed to writelines() can close their files; don't segfault #10125
diff --git a/Lib/test/test_file2k.py b/Lib/test/test_file2k.py
index fc8bfe9..ab09f21 100644
--- a/Lib/test/test_file2k.py
+++ b/Lib/test/test_file2k.py
@@ -135,6 +135,14 @@
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.
diff --git a/Misc/NEWS b/Misc/NEWS
index c2b674b..b597bd5 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@
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.
diff --git a/Objects/fileobject.c b/Objects/fileobject.c
index b7de6a1..2647b54 100644
--- a/Objects/fileobject.c
+++ b/Objects/fileobject.c
@@ -1849,6 +1849,11 @@
}
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;