summaryrefslogtreecommitdiffstats
path: root/Objects/unicodeobject.c
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2017-06-27 13:03:14 (GMT)
committerGitHub <noreply@github.com>2017-06-27 13:03:14 (GMT)
commite613e6add5f07ff6aad5802924596b631b707d2a (patch)
tree8e3a53cf8a0851c17a2dc9bcbd975c2bec5ff846 /Objects/unicodeobject.c
parent65474b9d7a230943d4d3f1d7d51f77bb141240f0 (diff)
downloadcpython-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.c49
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;