summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorInada Naoki <songofacandy@gmail.com>2019-04-19 07:07:19 (GMT)
committerGitHub <noreply@github.com>2019-04-19 07:07:19 (GMT)
commit9d062d690b768252204992fc6ab7c3873a87442d (patch)
treee31cacc3cefbe167ea7aef30289fc1d6a99ef5b9
parente8113f51a8bdf33188ee30a1c038a298329e7bfa (diff)
downloadcpython-9d062d690b768252204992fc6ab7c3873a87442d.zip
cpython-9d062d690b768252204992fc6ab7c3873a87442d.tar.gz
cpython-9d062d690b768252204992fc6ab7c3873a87442d.tar.bz2
ctypes: remove use of legacy unicode API (GH-12340)
PyUnicode_AsUnicodeAndSize() -> PyUnicode_AsWideChar()
-rw-r--r--Modules/_ctypes/_ctypes.c14
-rw-r--r--Modules/_ctypes/cfield.c20
2 files changed, 19 insertions, 15 deletions
diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c
index ac071bb..13cf76a 100644
--- a/Modules/_ctypes/_ctypes.c
+++ b/Modules/_ctypes/_ctypes.c
@@ -1304,8 +1304,6 @@ static int
WCharArray_set_value(CDataObject *self, PyObject *value, void *Py_UNUSED(ignored))
{
Py_ssize_t result = 0;
- Py_UNICODE *wstr;
- Py_ssize_t len;
if (value == NULL) {
PyErr_SetString(PyExc_TypeError,
@@ -1320,12 +1318,14 @@ WCharArray_set_value(CDataObject *self, PyObject *value, void *Py_UNUSED(ignored
} else
Py_INCREF(value);
- wstr = PyUnicode_AsUnicodeAndSize(value, &len);
- if (wstr == NULL)
+ Py_ssize_t len = PyUnicode_AsWideChar(value, NULL, 0);
+ if (len < 0) {
return -1;
- if ((size_t)len > self->b_size/sizeof(wchar_t)) {
- PyErr_SetString(PyExc_ValueError,
- "string too long");
+ }
+ // PyUnicode_AsWideChar() returns number of wchars including trailing null byte,
+ // when it is called with NULL.
+ if (((size_t)len-1) > self->b_size/sizeof(wchar_t)) {
+ PyErr_SetString(PyExc_ValueError, "string too long");
result = -1;
goto done;
}
diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c
index 5f194e21..157c32f 100644
--- a/Modules/_ctypes/cfield.c
+++ b/Modules/_ctypes/cfield.c
@@ -1229,9 +1229,6 @@ U_get(void *ptr, Py_ssize_t size)
static PyObject *
U_set(void *ptr, PyObject *value, Py_ssize_t length)
{
- Py_UNICODE *wstr;
- Py_ssize_t size;
-
/* It's easier to calculate in characters than in bytes */
length /= sizeof(wchar_t);
@@ -1242,9 +1239,14 @@ U_set(void *ptr, PyObject *value, Py_ssize_t length)
return NULL;
}
- wstr = PyUnicode_AsUnicodeAndSize(value, &size);
- if (wstr == NULL)
+ Py_ssize_t size = PyUnicode_AsWideChar(value, NULL, 0);
+ if (size < 0) {
return NULL;
+ }
+ // PyUnicode_AsWideChar() returns number of wchars including trailing null byte,
+ // when it is called with NULL.
+ size--;
+ assert(size >= 0);
if (size > length) {
PyErr_Format(PyExc_ValueError,
"string too long (%zd, maximum length %zd)",
@@ -1421,16 +1423,18 @@ BSTR_set(void *ptr, PyObject *value, Py_ssize_t size)
/* create a BSTR from value */
if (value) {
- wchar_t* wvalue;
Py_ssize_t wsize;
- wvalue = PyUnicode_AsUnicodeAndSize(value, &wsize);
- if (wvalue == NULL)
+ wchar_t *wvalue = PyUnicode_AsWideCharString(value, &wsize);
+ if (wvalue == NULL) {
return NULL;
+ }
if ((unsigned) wsize != wsize) {
PyErr_SetString(PyExc_ValueError, "String too long for BSTR");
+ PyMem_Free(wvalue);
return NULL;
}
bstr = SysAllocStringLen(wvalue, (unsigned)wsize);
+ PyMem_Free(wvalue);
} else
bstr = NULL;