#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:
parent
22d3c92480
commit
17617a07d1
|
@ -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':
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue