summaryrefslogtreecommitdiffstats
path: root/Python/fileutils.c
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2017-06-28 06:27:35 (GMT)
committerGitHub <noreply@github.com>2017-06-28 06:27:35 (GMT)
commit0834905d9b61291b1fc5e05a1ffbc69de9c9379f (patch)
tree456e79426ec816ba7e0a0bef7e94a6f8423b2786 /Python/fileutils.c
parent413c0a92bcc92efe92849fe5e711163da453410b (diff)
downloadcpython-0834905d9b61291b1fc5e05a1ffbc69de9c9379f.zip
cpython-0834905d9b61291b1fc5e05a1ffbc69de9c9379f.tar.gz
cpython-0834905d9b61291b1fc5e05a1ffbc69de9c9379f.tar.bz2
[3.6] bpo-13617: Reject embedded null characters in wchar* strings. (GH-2302) (#2462)
Based on patch by Victor Stinner. Add private C API function _PyUnicode_AsUnicode() which is similar to PyUnicode_AsUnicode(), but checks for null characters.. (cherry picked from commit f7eae0adfcd4c50034281b2c69f461b43b68db84)
Diffstat (limited to 'Python/fileutils.c')
-rw-r--r--Python/fileutils.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/Python/fileutils.c b/Python/fileutils.c
index f3764e4..97505e5 100644
--- a/Python/fileutils.c
+++ b/Python/fileutils.c
@@ -711,21 +711,32 @@ _Py_stat(PyObject *path, struct stat *statbuf)
#ifdef MS_WINDOWS
int err;
struct _stat wstatbuf;
- wchar_t *wpath;
+ const wchar_t *wpath;
- wpath = PyUnicode_AsUnicode(path);
+ wpath = _PyUnicode_AsUnicode(path);
if (wpath == NULL)
return -2;
+
err = _wstat(wpath, &wstatbuf);
if (!err)
statbuf->st_mode = wstatbuf.st_mode;
return err;
#else
int ret;
- PyObject *bytes = PyUnicode_EncodeFSDefault(path);
+ PyObject *bytes;
+ char *cpath;
+
+ bytes = PyUnicode_EncodeFSDefault(path);
if (bytes == NULL)
return -2;
- ret = stat(PyBytes_AS_STRING(bytes), statbuf);
+
+ /* check for embedded null bytes */
+ if (PyBytes_AsStringAndSize(bytes, &cpath, NULL) == -1) {
+ Py_DECREF(bytes);
+ return -2;
+ }
+
+ ret = stat(cpath, statbuf);
Py_DECREF(bytes);
return ret;
#endif
@@ -1080,7 +1091,7 @@ _Py_fopen_obj(PyObject *path, const char *mode)
FILE *f;
int async_err = 0;
#ifdef MS_WINDOWS
- wchar_t *wpath;
+ const wchar_t *wpath;
wchar_t wmode[10];
int usize;
@@ -1094,7 +1105,7 @@ _Py_fopen_obj(PyObject *path, const char *mode)
Py_TYPE(path));
return NULL;
}
- wpath = PyUnicode_AsUnicode(path);
+ wpath = _PyUnicode_AsUnicode(path);
if (wpath == NULL)
return NULL;