]> granicus.if.org Git - python/commitdiff
Merged revisions 81275 via svnmerge from
authorAntoine Pitrou <solipsis@pitrou.net>
Mon, 17 May 2010 20:00:52 +0000 (20:00 +0000)
committerAntoine Pitrou <solipsis@pitrou.net>
Mon, 17 May 2010 20:00:52 +0000 (20:00 +0000)
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
Misc/NEWS
Objects/fileobject.c

index c5e5ea16df7d2aa4db8bf9e47bd94e8f971afa1f..d77fb423544b27e2315d61c13377179d85389275 100644 (file)
@@ -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)
index c68fb60cb60fd3052fec0f7c111a99d0acb199a8..43d4c4bfa734cee0621f6524d1708cb227a3535c 100644 (file)
--- 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
index b9d909705cf5ca2785f6baa4b1e425102535c437..df5a102ab45c1b560d678c753b8b265b1fa4efc1 100644 (file)
@@ -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;
 }