From bf775542b0798afcde4f338aef73553636a9069b Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Sat, 16 Oct 2010 19:20:12 +0000 Subject: iterators passed to writelines() can close their files; don't segfault #10125 --- Lib/test/test_file2k.py | 8 ++++++++ Misc/NEWS | 3 +++ Objects/fileobject.c | 5 +++++ 3 files changed, 16 insertions(+) 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 @@ 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. diff --git a/Misc/NEWS b/Misc/NEWS index c2b674b..b597bd5 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -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. 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 @@ 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; -- cgit v0.12