From 5de1594e2886aa1c779ba0a041d48d4ccea56a06 Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Mon, 17 May 2010 20:00:52 +0000 Subject: [PATCH] Merged revisions 81275 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r81275 | antoine.pitrou | 2010-05-17 21:56:59 +0200 (lun., 17 mai 2010) | 4 lines Issue #7079: Fix a possible crash when closing a file object while using it from another thread. Patch by Daniel Stutzbach. ........ --- Lib/test/test_file.py | 12 +++++++++++- Misc/NEWS | 3 +++ Objects/fileobject.c | 6 ++++-- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_file.py b/Lib/test/test_file.py index c5e5ea16df..d77fb42354 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 c68fb60cb6..43d4c4bfa7 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 b9d909705c..df5a102ab4 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; } -- 2.50.0