Kaydet (Commit) 17617a07 authored tarafından Amaury Forgeot d'Arc's avatar Amaury Forgeot d'Arc

#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.
üst 22d3c924
...@@ -134,6 +134,16 @@ class OtherFileTests(unittest.TestCase): ...@@ -134,6 +134,16 @@ class OtherFileTests(unittest.TestCase):
f.close() f.close()
self.fail('%r is an invalid file mode' % mode) 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): def testStdin(self):
# This causes the interpreter to exit on OSF1 v5.1. # This causes the interpreter to exit on OSF1 v5.1.
if sys.platform != 'osf1V5': if sys.platform != 'osf1V5':
......
...@@ -12,6 +12,9 @@ What's New in Python 2.6 final ...@@ -12,6 +12,9 @@ What's New in Python 2.6 final
Core and Builtins 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. - Bug #3951: Py_USING_MEMORY_DEBUGGER should not be enabled by default.
Library Library
......
...@@ -305,10 +305,17 @@ open_the_file(PyFileObject *f, char *name, char *mode) ...@@ -305,10 +305,17 @@ open_the_file(PyFileObject *f, char *name, char *mode)
#endif #endif
/* EINVAL is returned when an invalid filename or /* EINVAL is returned when an invalid filename or
* an invalid mode is supplied. */ * an invalid mode is supplied. */
if (errno == EINVAL) if (errno == EINVAL) {
PyErr_Format(PyExc_IOError, PyObject *v;
"invalid filename: %s or mode: %s", char message[100];
name, mode); 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 else
PyErr_SetFromErrnoWithFilenameObject(PyExc_IOError, f->f_name); PyErr_SetFromErrnoWithFilenameObject(PyExc_IOError, f->f_name);
f = NULL; f = NULL;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment