From 0ae29cf6176d3f80c1845cf23716a708acbe598b Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Fri, 13 Mar 2009 22:33:17 +0000 Subject: [PATCH] The error detection code in FileIO.close() could fail to reflect the `errno` value, and report it as -1 instead. --- Lib/test/test_fileio.py | 15 +++++++++++++++ Misc/NEWS | 3 +++ Modules/_fileio.c | 4 +--- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_fileio.py b/Lib/test/test_fileio.py index 498d3fc5a5..9f94053e47 100644 --- a/Lib/test/test_fileio.py +++ b/Lib/test/test_fileio.py @@ -2,6 +2,7 @@ import sys import os +import errno import unittest from array import array from weakref import proxy @@ -113,6 +114,20 @@ class AutoFileTests(unittest.TestCase): else: self.fail("Should have raised IOError") + def testErrnoOnClose(self): + # Test that the IOError's `errno` attribute is correctly set when + # close() fails. Here we first close the file descriptor ourselves so + # that close() fails with EBADF ('Bad file descriptor'). + f = self.f + os.close(f.fileno()) + self.f = None + try: + f.close() + except IOError as e: + self.assertEqual(e.errno, errno.EBADF) + else: + self.fail("Should have raised IOError") + class OtherFileTests(unittest.TestCase): diff --git a/Misc/NEWS b/Misc/NEWS index 4468df6f1c..21b4a9b993 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -18,6 +18,9 @@ Core and Builtins Library ------- +- The error detection code in FileIO.close() could fail to reflect the `errno` + value, and report it as -1 instead. + What's New in Python 3.1 alpha 1 ================================ diff --git a/Modules/_fileio.c b/Modules/_fileio.c index fd35d69879..32f679007a 100644 --- a/Modules/_fileio.c +++ b/Modules/_fileio.c @@ -97,10 +97,8 @@ fileio_close(PyFileIOObject *self) Py_RETURN_NONE; } errno = internal_close(self); - if (errno < 0) { - PyErr_SetFromErrno(PyExc_IOError); + if (errno < 0) return NULL; - } return PyObject_CallMethod((PyObject*)&PyRawIOBase_Type, "close", "O", self); -- 2.40.0