Commit 0ae29cf6 authored by Antoine Pitrou's avatar Antoine Pitrou

The error detection code in FileIO.close() could fail to reflect the `errno`...

The error detection code in FileIO.close() could fail to reflect the `errno` value, and report it as -1 instead.
parent 652e7076
......@@ -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):
......
......@@ -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
================================
......
......@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment