Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 806d402

Browse files
committed
Merged revisions 68755 via svnmerge from
svn+ssh://[email protected]/python/trunk ........ r68755 | benjamin.peterson | 2009-01-18 18:08:08 -0600 (Sun, 18 Jan 2009) | 1 line raise an OSError for invalid fds #4991 ........
1 parent d994864 commit 806d402

2 files changed

Lines changed: 24 additions & 0 deletions

File tree

Lib/test/test_fileio.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,10 @@ def testUnicodeOpen(self):
175175
f.close()
176176
os.unlink(TESTFN)
177177

178+
def testInvalidFd(self):
179+
self.assertRaises(ValueError, _fileio._FileIO, -10)
180+
self.assertRaises(OSError, _fileio._FileIO, 10)
181+
178182
def testBadModeArgument(self):
179183
# verify that we get a sensible error message for bad mode argument
180184
bad_mode = "qwerty"

Modules/_fileio.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,24 @@ dircheck(PyFileIOObject* self, char *name)
138138
return 0;
139139
}
140140

141+
static int
142+
check_fd(int fd)
143+
{
144+
#if defined(HAVE_FSTAT)
145+
struct stat buf;
146+
if (fstat(fd, &buf) < 0 && errno == EBADF) {
147+
PyObject *exc;
148+
char *msg = strerror(EBADF);
149+
exc = PyObject_CallFunction(PyExc_OSError, "(is)",
150+
EBADF, msg);
151+
PyErr_SetObject(PyExc_OSError, exc);
152+
Py_XDECREF(exc);
153+
return -1;
154+
}
155+
#endif
156+
return 0;
157+
}
158+
141159

142160
static int
143161
fileio_init(PyObject *oself, PyObject *args, PyObject *kwds)
@@ -170,6 +188,8 @@ fileio_init(PyObject *oself, PyObject *args, PyObject *kwds)
170188
"Negative filedescriptor");
171189
return -1;
172190
}
191+
if (check_fd(fd))
192+
return -1;
173193
}
174194
else {
175195
PyErr_Clear();

0 commit comments

Comments
 (0)