Issue #15247: FileIO now raises an error when given a file descriptor pointing to a directory.

This commit is contained in:
Antoine Pitrou 2012-07-06 18:48:24 +02:00
parent 01cca5e451
commit 9235b254dc
3 changed files with 16 additions and 12 deletions

View file

@ -166,22 +166,15 @@ fileio_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
directories, so we need a check. */
static int
dircheck(fileio* self, const char *name)
dircheck(fileio* self, PyObject *nameobj)
{
#if defined(HAVE_FSTAT) && defined(S_IFDIR) && defined(EISDIR)
struct stat buf;
if (self->fd < 0)
return 0;
if (fstat(self->fd, &buf) == 0 && S_ISDIR(buf.st_mode)) {
char *msg = strerror(EISDIR);
PyObject *exc;
if (internal_close(self))
return -1;
exc = PyObject_CallFunction(PyExc_IOError, "(iss)",
EISDIR, msg, name);
PyErr_SetObject(PyExc_IOError, exc);
Py_XDECREF(exc);
errno = EISDIR;
PyErr_SetFromErrnoWithFilenameObject(PyExc_IOError, nameobj);
return -1;
}
#endif
@ -373,9 +366,9 @@ fileio_init(PyObject *oself, PyObject *args, PyObject *kwds)
PyErr_SetFromErrnoWithFilename(PyExc_IOError, name);
goto error;
}
if (dircheck(self, name) < 0)
goto error;
}
if (dircheck(self, nameobj) < 0)
goto error;
#if defined(MS_WINDOWS) || defined(__CYGWIN__)
/* don't translate newlines (\r\n <=> \n) */