diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2017-06-27 13:03:14 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-06-27 13:03:14 (GMT) |
commit | e613e6add5f07ff6aad5802924596b631b707d2a (patch) | |
tree | 8e3a53cf8a0851c17a2dc9bcbd975c2bec5ff846 /Objects/unicodeobject.c | |
parent | 65474b9d7a230943d4d3f1d7d51f77bb141240f0 (diff) | |
download | cpython-e613e6add5f07ff6aad5802924596b631b707d2a.zip cpython-e613e6add5f07ff6aad5802924596b631b707d2a.tar.gz cpython-e613e6add5f07ff6aad5802924596b631b707d2a.tar.bz2 |
bpo-30708: Check for null characters in PyUnicode_AsWideCharString(). (#2285)
Raise a ValueError if the second argument is NULL and the wchar_t\*
string contains null characters.
Diffstat (limited to 'Objects/unicodeobject.c')
-rw-r--r-- | Objects/unicodeobject.c | 49 |
1 files changed, 22 insertions, 27 deletions
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index b680421..646de0e 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -2953,8 +2953,7 @@ PyUnicode_FromFormat(const char *format, ...) #ifdef HAVE_WCHAR_H -/* Helper function for PyUnicode_AsWideChar() and PyUnicode_AsWideCharString(): - convert a Unicode object to a wide character string. +/* Convert a Unicode object to a wide character string. - If w is NULL: return the number of wide characters (including the null character) required to convert the unicode object. Ignore size argument. @@ -2962,14 +2961,18 @@ PyUnicode_FromFormat(const char *format, ...) - Otherwise: return the number of wide characters (excluding the null character) written into w. Write at most size wide characters (including the null character). */ -static Py_ssize_t -unicode_aswidechar(PyObject *unicode, - wchar_t *w, - Py_ssize_t size) +Py_ssize_t +PyUnicode_AsWideChar(PyObject *unicode, + wchar_t *w, + Py_ssize_t size) { Py_ssize_t res; const wchar_t *wstr; + if (unicode == NULL) { + PyErr_BadInternalCall(); + return -1; + } wstr = PyUnicode_AsUnicodeAndSize(unicode, &res); if (wstr == NULL) return -1; @@ -2986,23 +2989,12 @@ unicode_aswidechar(PyObject *unicode, return res + 1; } -Py_ssize_t -PyUnicode_AsWideChar(PyObject *unicode, - wchar_t *w, - Py_ssize_t size) -{ - if (unicode == NULL) { - PyErr_BadInternalCall(); - return -1; - } - return unicode_aswidechar(unicode, w, size); -} - wchar_t* PyUnicode_AsWideCharString(PyObject *unicode, Py_ssize_t *size) { - wchar_t* buffer; + const wchar_t *wstr; + wchar_t *buffer; Py_ssize_t buflen; if (unicode == NULL) { @@ -3010,19 +3002,22 @@ PyUnicode_AsWideCharString(PyObject *unicode, return NULL; } - buflen = unicode_aswidechar(unicode, NULL, 0); - if (buflen == -1) + wstr = PyUnicode_AsUnicodeAndSize(unicode, &buflen); + if (wstr == NULL) { return NULL; - buffer = PyMem_NEW(wchar_t, buflen); - if (buffer == NULL) { - PyErr_NoMemory(); + } + if (size == NULL && wcslen(wstr) != (size_t)buflen) { + PyErr_SetString(PyExc_ValueError, + "embedded null character"); return NULL; } - buflen = unicode_aswidechar(unicode, buffer, buflen); - if (buflen == -1) { - PyMem_FREE(buffer); + + buffer = PyMem_NEW(wchar_t, buflen + 1); + if (buffer == NULL) { + PyErr_NoMemory(); return NULL; } + memcpy(buffer, wstr, (buflen + 1) * sizeof(wchar_t)); if (size != NULL) *size = buflen; return buffer; |