Author: Amaury Forgeot d'Arc <[email protected]>
Branch: 
Changeset: r78089:c7298ea71c4d
Date: 2015-06-14 16:01 +0200
http://bitbucket.org/pypy/pypy/changeset/c7298ea71c4d/

Log:    CPython issue #5700: flush() was not called in close() if
        closefd=False.

diff --git a/pypy/module/_io/interp_fileio.py b/pypy/module/_io/interp_fileio.py
--- a/pypy/module/_io/interp_fileio.py
+++ b/pypy/module/_io/interp_fileio.py
@@ -242,11 +242,18 @@
                                exception_name='w_IOError')
 
     def close_w(self, space):
+        try:
+            W_RawIOBase.close_w(self, space)
+        except OperationError:
+            if not self.closefd:
+                self.fd = -1
+                raise
+            self._close(space)
+            raise
         if not self.closefd:
             self.fd = -1
             return
         self._close(space)
-        W_RawIOBase.close_w(self, space)
 
     def _dircheck(self, space, w_filename):
         # On Unix, fopen will succeed for directories.
diff --git a/pypy/module/_io/test/test_fileio.py 
b/pypy/module/_io/test/test_fileio.py
--- a/pypy/module/_io/test/test_fileio.py
+++ b/pypy/module/_io/test/test_fileio.py
@@ -209,6 +209,22 @@
             if os.path.exists(self.tmpfile):
                 os.unlink(self.tmpfile)
 
+    def test_flush_error_on_close(self):
+        # Test that the file is closed despite failed flush
+        # and that flush() is called before file closed.
+        import _io, os
+        fd = os.open(self.tmpfile, os.O_RDONLY, 0666)
+        f = _io.FileIO(fd, 'r', closefd=False)
+        closed = []
+        def bad_flush():
+            closed[:] = [f.closed]
+            raise IOError()
+        f.flush = bad_flush
+        raises(IOError, f.close) # exception not swallowed
+        assert f.closed
+        assert closed         # flush() called
+        assert not closed[0]  # flush() called before file closed
+        os.close(fd)
 
 def test_flush_at_exit():
     from pypy import conftest
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to