diff options
author | Victor Stinner <victor.stinner@haypocalc.com> | 2011-11-21 01:11:26 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@haypocalc.com> | 2011-11-21 01:11:26 (GMT) |
commit | ea90e0fd9568bb8faedbe84d20c48ff595b6736f (patch) | |
tree | fd8399aae6fea99dc77fcd2488723450e6768788 /Modules | |
parent | 8ef18872b40cd66e356a5e744c467557a9607d66 (diff) | |
download | cpython-ea90e0fd9568bb8faedbe84d20c48ff595b6736f.zip cpython-ea90e0fd9568bb8faedbe84d20c48ff595b6736f.tar.gz cpython-ea90e0fd9568bb8faedbe84d20c48ff595b6736f.tar.bz2 |
ctypes check for PyUnicode_GET_SIZE() failure
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/_ctypes/_ctypes.c | 8 | ||||
-rw-r--r-- | 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 338c4f7..b45eea9 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 6cf311f..73ac519 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 |