summaryrefslogtreecommitdiffstats
path: root/Modules/_io/fileio.c
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2012-01-29 17:36:34 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2012-01-29 17:36:34 (GMT)
commit1334884ff2f5a3968e6a26157f869b4ca5de189b (patch)
tree6cd82b8fa2964ad30b617cac8d0eaf98890d82c0 /Modules/_io/fileio.c
parentc875d2032bf363da5e9e50928330f5ee2aa2fda2 (diff)
downloadcpython-1334884ff2f5a3968e6a26157f869b4ca5de189b.zip
cpython-1334884ff2f5a3968e6a26157f869b4ca5de189b.tar.gz
cpython-1334884ff2f5a3968e6a26157f869b4ca5de189b.tar.bz2
Issue #13848: open() and the FileIO constructor now check for NUL characters in the file name.
Patch by Hynek Schlawack.
Diffstat (limited to 'Modules/_io/fileio.c')
-rw-r--r--Modules/_io/fileio.c33
1 files changed, 11 insertions, 22 deletions
diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c
index f39f8b0..d5b03ee 100644
--- a/Modules/_io/fileio.c
+++ b/Modules/_io/fileio.c
@@ -253,34 +253,23 @@ fileio_init(PyObject *oself, PyObject *args, PyObject *kwds)
}
#ifdef MS_WINDOWS
- if (PyUnicode_Check(nameobj))
+ if (PyUnicode_Check(nameobj)) {
+ int rv = _PyUnicode_HasNULChars(nameobj);
+ if (rv) {
+ if (rv != -1)
+ PyErr_SetString(PyExc_TypeError, "embedded NUL character");
+ return -1;
+ }
widename = PyUnicode_AS_UNICODE(nameobj);
+ }
if (widename == NULL)
#endif
if (fd < 0)
{
- if (PyBytes_Check(nameobj) || PyByteArray_Check(nameobj)) {
- Py_ssize_t namelen;
- if (PyObject_AsCharBuffer(nameobj, &name, &namelen) < 0)
- return -1;
- }
- else {
- PyObject *u = PyUnicode_FromObject(nameobj);
-
- if (u == NULL)
- return -1;
-
- stringobj = PyUnicode_EncodeFSDefault(u);
- Py_DECREF(u);
- if (stringobj == NULL)
- return -1;
- if (!PyBytes_Check(stringobj)) {
- PyErr_SetString(PyExc_TypeError,
- "encoder failed to return bytes");
- goto error;
- }
- name = PyBytes_AS_STRING(stringobj);
+ if (!PyUnicode_FSConverter(nameobj, &stringobj)) {
+ return -1;
}
+ name = PyBytes_AS_STRING(stringobj);
}
s = mode;