From 5848d1ff35f8606b1678ff8cc29011b8fd4ef486 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Mon, 19 Jan 2009 00:08:08 +0000 Subject: [PATCH] raise an OSError for invalid fds #4991 --- Lib/test/test_fileio.py | 4 ++++ Misc/NEWS | 3 +++ Modules/_fileio.c | 20 ++++++++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/Lib/test/test_fileio.py b/Lib/test/test_fileio.py index d8cf415ed86..c089608d3c9 100644 --- a/Lib/test/test_fileio.py +++ b/Lib/test/test_fileio.py @@ -176,6 +176,10 @@ class OtherFileTests(unittest.TestCase): f.close() os.unlink(TESTFN) + def testInvalidFd(self): + self.assertRaises(ValueError, _fileio._FileIO, -10) + self.assertRaises(OSError, _fileio._FileIO, 10) + def testBadModeArgument(self): # verify that we get a sensible error message for bad mode argument bad_mode = "qwerty" diff --git a/Misc/NEWS b/Misc/NEWS index 2ed95a5ec51..293ab4aa2e2 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,9 @@ What's New in Python 2.7 alpha 1 Core and Builtins ----------------- +- Issue #4991: Passing invalid file descriptors to io.FileIO now raises an + OSError. + - Issue #4807: Port the _winreg module to Windows CE. - Issue #4935: The overflow checking code in the expandtabs() method common diff --git a/Modules/_fileio.c b/Modules/_fileio.c index 2dc3d743b85..0f09ecd8a3b 100644 --- a/Modules/_fileio.c +++ b/Modules/_fileio.c @@ -119,6 +119,24 @@ dircheck(PyFileIOObject* self, char *name) return 0; } +static int +check_fd(int fd) +{ +#if defined(HAVE_FSTAT) + struct stat buf; + if (fstat(fd, &buf) < 0 && errno == EBADF) { + PyObject *exc; + char *msg = strerror(EBADF); + exc = PyObject_CallFunction(PyExc_OSError, "(is)", + EBADF, msg); + PyErr_SetObject(PyExc_OSError, exc); + Py_XDECREF(exc); + return -1; + } +#endif + return 0; +} + static int fileio_init(PyObject *oself, PyObject *args, PyObject *kwds) @@ -151,6 +169,8 @@ fileio_init(PyObject *oself, PyObject *args, PyObject *kwds) "Negative filedescriptor"); return -1; } + if (check_fd(fd)) + return -1; } else { PyErr_Clear();