#3965: on Windows, open() crashes if the filename or the mode is invalid,

and if the filename is a unicode string.

Reviewed by Martin von Loewis.
This commit is contained in:
Amaury Forgeot d'Arc 2008-09-25 20:52:56 +00:00
parent 22d3c92480
commit 17617a07d1
3 changed files with 24 additions and 4 deletions

View File

@ -134,6 +134,16 @@ class OtherFileTests(unittest.TestCase):
f.close()
self.fail('%r is an invalid file mode' % mode)
# Some invalid modes fail on Windows, but pass on Unix
# Issue3965: avoid a crash on Windows when filename is unicode
for name in (TESTFN, unicode(TESTFN), unicode(TESTFN + '\t')):
try:
f = open(name, "rr")
except IOError:
pass
else:
f.close()
def testStdin(self):
# This causes the interpreter to exit on OSF1 v5.1.
if sys.platform != 'osf1V5':

View File

@ -12,6 +12,9 @@ What's New in Python 2.6 final
Core and Builtins
-----------------
- Issue #3965: Fixed a crash on Windows when open() is given an invalid
filename or mode, and the filename is a unicode string.
- Bug #3951: Py_USING_MEMORY_DEBUGGER should not be enabled by default.
Library

View File

@ -305,10 +305,17 @@ open_the_file(PyFileObject *f, char *name, char *mode)
#endif
/* EINVAL is returned when an invalid filename or
* an invalid mode is supplied. */
if (errno == EINVAL)
PyErr_Format(PyExc_IOError,
"invalid filename: %s or mode: %s",
name, mode);
if (errno == EINVAL) {
PyObject *v;
char message[100];
PyOS_snprintf(message, 100,
"invalid mode ('%.50s') or filename", mode);
v = Py_BuildValue("(isO)", errno, message, f->f_name);
if (v != NULL) {
PyErr_SetObject(PyExc_IOError, v);
Py_DECREF(v);
}
}
else
PyErr_SetFromErrnoWithFilenameObject(PyExc_IOError, f->f_name);
f = NULL;