Disallow opening files with modes 'aU' or 'wU' as specified by PEP
278. Closes bug 967182.
This commit is contained in:
parent
7961aa6135
commit
bbf12ba7b2
@ -40,6 +40,16 @@ for attr in 'name', 'mode', 'closed':
|
|||||||
raise TestFailed('expected exception setting file attr %r' % attr)
|
raise TestFailed('expected exception setting file attr %r' % attr)
|
||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
|
# check invalid mode strings
|
||||||
|
for mode in ("", "aU", "wU+"):
|
||||||
|
try:
|
||||||
|
f = file(TESTFN, mode)
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
f.close()
|
||||||
|
raise TestFailed('%r is an invalid file mode' % mode)
|
||||||
|
|
||||||
# verify writelines with instance sequence
|
# verify writelines with instance sequence
|
||||||
l = UserList(['1', '2'])
|
l = UserList(['1', '2'])
|
||||||
f = open(TESTFN, 'wb')
|
f = open(TESTFN, 'wb')
|
||||||
|
@ -12,6 +12,9 @@ What's New in Python 2.5 alpha 1?
|
|||||||
Core and builtins
|
Core and builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- bug #967182: disallow opening files with 'wU' or 'aU' as specified by PEP
|
||||||
|
278.
|
||||||
|
|
||||||
- patch #1109424: int, long, float, complex, and unicode now check for the
|
- patch #1109424: int, long, float, complex, and unicode now check for the
|
||||||
proper magic slot for type conversions when subclassed. Previously the
|
proper magic slot for type conversions when subclassed. Previously the
|
||||||
magic slot was ignored during conversion. Semantics now match the way
|
magic slot was ignored during conversion. Semantics now match the way
|
||||||
|
@ -128,6 +128,54 @@ fill_file_fields(PyFileObject *f, FILE *fp, PyObject *name, char *mode,
|
|||||||
return (PyObject *) f;
|
return (PyObject *) f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* check for known incorrect mode strings - problem is, platforms are
|
||||||
|
free to accept any mode characters they like and are supposed to
|
||||||
|
ignore stuff they don't understand... write or append mode with
|
||||||
|
universal newline support is expressly forbidden by PEP 278. */
|
||||||
|
/* zero return is kewl - one is un-kewl */
|
||||||
|
static int
|
||||||
|
check_the_mode(char *mode)
|
||||||
|
{
|
||||||
|
unsigned int len = strlen(mode);
|
||||||
|
|
||||||
|
switch (len) {
|
||||||
|
case 0:
|
||||||
|
PyErr_SetString(PyExc_ValueError, "empty mode string");
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
/* reject wU, aU */
|
||||||
|
case 2:
|
||||||
|
switch (mode[0]) {
|
||||||
|
case 'w':
|
||||||
|
case 'a':
|
||||||
|
if (mode[1] == 'U') {
|
||||||
|
PyErr_SetString(PyExc_ValueError,
|
||||||
|
"invalid mode string");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* reject w+U, a+U, wU+, aU+ */
|
||||||
|
case 3:
|
||||||
|
switch (mode[0]) {
|
||||||
|
case 'w':
|
||||||
|
case 'a':
|
||||||
|
if ((mode[1] == '+' && mode[2] == 'U') ||
|
||||||
|
(mode[1] == 'U' && mode[2] == '+')) {
|
||||||
|
PyErr_SetString(PyExc_ValueError,
|
||||||
|
"invalid mode string");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
open_the_file(PyFileObject *f, char *name, char *mode)
|
open_the_file(PyFileObject *f, char *name, char *mode)
|
||||||
{
|
{
|
||||||
@ -142,6 +190,9 @@ open_the_file(PyFileObject *f, char *name, char *mode)
|
|||||||
assert(mode != NULL);
|
assert(mode != NULL);
|
||||||
assert(f->f_fp == NULL);
|
assert(f->f_fp == NULL);
|
||||||
|
|
||||||
|
if (check_the_mode(mode))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
/* rexec.py can't stop a user from getting the file() constructor --
|
/* rexec.py can't stop a user from getting the file() constructor --
|
||||||
all they have to do is get *any* file object f, and then do
|
all they have to do is get *any* file object f, and then do
|
||||||
type(f). Here we prevent them from doing damage with it. */
|
type(f). Here we prevent them from doing damage with it. */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user