diff --git a/Lib/test/test_file.py b/Lib/test/test_file.py index c5e5ea16df7..d77fb423544 100644 --- a/Lib/test/test_file.py +++ b/Lib/test/test_file.py @@ -417,6 +417,7 @@ class FileThreadingTests(unittest.TestCase): self._count_lock = threading.Lock() self.close_count = 0 self.close_success_count = 0 + self.use_buffering = False def tearDown(self): if self.f: @@ -430,7 +431,10 @@ class FileThreadingTests(unittest.TestCase): pass def _create_file(self): - self.f = open(self.filename, "w+") + if self.use_buffering: + self.f = open(self.filename, "w+", buffering=1024*16) + else: + self.f = open(self.filename, "w+") def _close_file(self): with self._count_lock: @@ -517,6 +521,12 @@ class FileThreadingTests(unittest.TestCase): print >> self.f, '' self._test_close_open_io(io_func) + def test_close_open_print_buffered(self): + self.use_buffering = True + def io_func(): + print >> self.f, '' + self._test_close_open_io(io_func) + def test_close_open_read(self): def io_func(): self.f.read(0) diff --git a/Misc/NEWS b/Misc/NEWS index c68fb60cb60..43d4c4bfa73 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,9 @@ What's New in Python 2.6.6 alpha 1? Core and Builtins ----------------- +- Issue #7079: Fix a possible crash when closing a file object while using + it from another thread. Patch by Daniel Stutzbach. + - Issue #1533: fix inconsistency in range function argument processing: any non-float non-integer argument is now converted to an integer (if possible) using its __int__ method. Previously, only diff --git a/Objects/fileobject.c b/Objects/fileobject.c index b9d909705cf..df5a102ab45 100644 --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -568,8 +568,10 @@ static PyObject * file_close(PyFileObject *f) { PyObject *sts = close_the_file(f); - PyMem_Free(f->f_setbuf); - f->f_setbuf = NULL; + if (sts) { + PyMem_Free(f->f_setbuf); + f->f_setbuf = NULL; + } return sts; }