From ea90e0fd9568bb8faedbe84d20c48ff595b6736f Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 21 Nov 2011 02:11:26 +0100 Subject: [PATCH] ctypes check for PyUnicode_GET_SIZE() failure --- Modules/_ctypes/_ctypes.c | 8 +++++++- Modules/_ctypes/cfield.c | 14 +++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 338c4f7ce87..b45eea9ca3c 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -1142,6 +1142,8 @@ static int WCharArray_set_value(CDataObject *self, PyObject *value) { Py_ssize_t result = 0; + Py_UNICODE *wstr; + Py_ssize_t len; if (value == NULL) { PyErr_SetString(PyExc_TypeError, @@ -1155,7 +1157,11 @@ WCharArray_set_value(CDataObject *self, PyObject *value) return -1; } else Py_INCREF(value); - if ((unsigned)PyUnicode_GET_SIZE(value) > self->b_size/sizeof(wchar_t)) { + + wstr = PyUnicode_AsUnicodeAndSize(value, &len); + if (wstr == NULL) + return -1; + if ((unsigned)len > self->b_size/sizeof(wchar_t)) { PyErr_SetString(PyExc_ValueError, "string too long"); result = -1; diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c index 6cf311f94c0..73ac519ae7c 100644 --- a/Modules/_ctypes/cfield.c +++ b/Modules/_ctypes/cfield.c @@ -1259,6 +1259,7 @@ 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 */ @@ -1271,7 +1272,10 @@ U_set(void *ptr, PyObject *value, Py_ssize_t length) return NULL; } else Py_INCREF(value); - size = PyUnicode_GET_SIZE(value); + + wstr = PyUnicode_AsUnicodeAndSize(value, &size); + if (wstr == NULL) + return NULL; if (size > length) { PyErr_Format(PyExc_ValueError, "string too long (%zd, maximum length %zd)", @@ -1471,15 +1475,15 @@ BSTR_set(void *ptr, PyObject *value, Py_ssize_t size) /* create a BSTR from value */ if (value) { - Py_ssize_t size = PyUnicode_GET_SIZE(value); wchar_t* wvalue; + Py_ssize_t size; + wvalue = PyUnicode_AsUnicodeAndSize(value, &size); + if (wvalue == NULL) + return NULL; if ((unsigned) size != size) { PyErr_SetString(PyExc_ValueError, "String too long for BSTR"); return NULL; } - wvalue = PyUnicode_AsUnicode(value); - if (wvalue == NULL) - return NULL; bstr = SysAllocStringLen(wvalue, (unsigned)size); Py_DECREF(value); } else