From 6b3a2c4a48eeefce64de12060d4ba0f38a5f3033 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20v=2E=20L=C3=B6wis?= Date: Wed, 8 Aug 2001 05:30:36 +0000 Subject: [PATCH] Patch #448227: Raise an exception when a directory is passed to execfile. --- Python/bltinmodule.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index ec3c5fc0a04..fa6816279df 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -568,6 +568,8 @@ builtin_execfile(PyObject *self, PyObject *args) PyObject *res; FILE* fp; PyCompilerFlags cf; + int exists; + struct stat s; if (!PyArg_ParseTuple(args, "s|O!O!:execfile", &filename, @@ -586,10 +588,27 @@ builtin_execfile(PyObject *self, PyObject *args) PyEval_GetBuiltins()) != 0) return NULL; } - Py_BEGIN_ALLOW_THREADS - fp = fopen(filename, "r"); - Py_END_ALLOW_THREADS - if (fp == NULL) { + + exists = 0; + /* Test for existence or directory. */ + if (!stat(filename, &s)) { + if (S_ISDIR(s.st_mode)) + errno = EISDIR; + else + exists = 1; + } + + if (exists) { + Py_BEGIN_ALLOW_THREADS + fp = fopen(filename, "r"); + Py_END_ALLOW_THREADS + + if (fp == NULL) { + exists = 0; + } + } + + if (!exists) { PyErr_SetFromErrno(PyExc_IOError); return NULL; }