@@ -56,6 +56,32 @@ PyFile_Name(PyObject *f)
56
56
return ((PyFileObject * )f )-> f_name ;
57
57
}
58
58
59
+ /* On Unix, fopen will succeed for directories.
60
+ In Python, there should be no file objects referring to
61
+ directories, so we need a check. */
62
+
63
+ static PyFileObject *
64
+ dircheck (PyFileObject * f )
65
+ {
66
+ #if defined(HAVE_FSTAT ) && defined(S_IFDIR ) && defined(EISDIR )
67
+ struct stat buf ;
68
+ if (f -> f_fp == NULL )
69
+ return f ;
70
+ if (fstat (fileno (f -> f_fp ), & buf ) == 0 &&
71
+ S_ISDIR (buf .st_mode )) {
72
+ #ifdef HAVE_STRERROR
73
+ char * msg = strerror (EISDIR );
74
+ #else
75
+ char * msg = "Is a directory" ;
76
+ #endif
77
+ PyObject * exc = PyObject_CallFunction (PyExc_IOError , "(is)" , EISDIR , msg );
78
+ PyErr_SetObject (PyExc_IOError , exc );
79
+ return NULL ;
80
+ }
81
+ #endif
82
+ return f ;
83
+ }
84
+
59
85
60
86
static PyObject *
61
87
fill_file_fields (PyFileObject * f , FILE * fp , char * name , char * mode ,
@@ -77,6 +103,7 @@ fill_file_fields(PyFileObject *f, FILE *fp, char *name, char *mode,
77
103
if (f -> f_name == NULL || f -> f_mode == NULL )
78
104
return NULL ;
79
105
f -> f_fp = fp ;
106
+ f = dircheck (f );
80
107
return (PyObject * ) f ;
81
108
}
82
109
@@ -130,6 +157,7 @@ open_the_file(PyFileObject *f, char *name, char *mode)
130
157
PyErr_SetFromErrnoWithFilename (PyExc_IOError , name );
131
158
f = NULL ;
132
159
}
160
+ f = dircheck (f );
133
161
return (PyObject * )f ;
134
162
}
135
163
0 commit comments