Patch #448227: Raise an exception when a directory is passed to execfile.
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index ec3c5fc..fa68162 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -568,6 +568,8 @@
 	PyObject *res;
 	FILE* fp;
 	PyCompilerFlags cf;
+	int exists;
+	struct stat s;
 
 	if (!PyArg_ParseTuple(args, "s|O!O!:execfile",
 			&filename,
@@ -586,10 +588,27 @@
 					 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;
 	}