From: Benjamin Peterson Date: Sat, 16 Oct 2010 19:20:12 +0000 (+0000) Subject: iterators passed to writelines() can close their files; don't segfault #10125 X-Git-Tag: v2.7.1rc1~147 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bf775542b0798afcde4f338aef73553636a9069b;p=python 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 fc8bfe9c5d..ab09f2161b 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 c2b674b245..b597bd5783 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 b7de6a10cd..2647b54269 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;