summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2010-05-17 20:00:52 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2010-05-17 20:00:52 (GMT)
commit5de1594e2886aa1c779ba0a041d48d4ccea56a06 (patch)
tree07751cc7f3c15f3155e8bc1edf190bfe04c07655
parent831755694a4fb264538a208adf3f750988d67b0e (diff)
downloadcpython-5de1594e2886aa1c779ba0a041d48d4ccea56a06.zip
cpython-5de1594e2886aa1c779ba0a041d48d4ccea56a06.tar.gz
cpython-5de1594e2886aa1c779ba0a041d48d4ccea56a06.tar.bz2
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. ........
-rw-r--r--Lib/test/test_file.py12
-rw-r--r--Misc/NEWS3
-rw-r--r--Objects/fileobject.c6
3 files changed, 18 insertions, 3 deletions
diff --git a/Lib/test/test_file.py b/Lib/test/test_file.py
index c5e5ea1..d77fb42 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 c68fb60..43d4c4b 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 b9d9097..df5a102 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;
}