[Python-checkins] r85097 - in python/branches/py3k/Modules/_ctypes: callproc.c cfield.c
victor.stinner
python-checkins at python.org
Wed Sep 29 12:37:16 CEST 2010
Author: victor.stinner
Date: Wed Sep 29 12:37:16 2010
New Revision: 85097
Log:
Issue #9979: Use PyUnicode_AsWideCharString() in _ctypes module
* Convert unicode to wide character string before creating the PyCapsule
object
* Catch integer overflow
* Avoid useless memset()
* Prepare the support of surrogates
Modified:
python/branches/py3k/Modules/_ctypes/callproc.c
python/branches/py3k/Modules/_ctypes/cfield.c
Modified: python/branches/py3k/Modules/_ctypes/callproc.c
==============================================================================
--- python/branches/py3k/Modules/_ctypes/callproc.c (original)
+++ python/branches/py3k/Modules/_ctypes/callproc.c Wed Sep 29 12:37:16 2010
@@ -665,24 +665,15 @@
pa->keep = obj;
return 0;
#else
- int size = PyUnicode_GET_SIZE(obj);
pa->ffi_type = &ffi_type_pointer;
- size += 1; /* terminating NUL */
- size *= sizeof(wchar_t);
- pa->value.p = PyMem_Malloc(size);
- if (!pa->value.p) {
- PyErr_NoMemory();
+ pa->value.p = PyUnicode_AsWideCharString((PyUnicodeObject *)obj, NULL);
+ if (pa->value.p == NULL)
return -1;
- }
- memset(pa->value.p, 0, size);
pa->keep = PyCapsule_New(pa->value.p, CTYPES_CAPSULE_NAME_PYMEM, pymem_destructor);
if (!pa->keep) {
PyMem_Free(pa->value.p);
return -1;
}
- if (-1 == PyUnicode_AsWideChar((PyUnicodeObject *)obj,
- pa->value.p, PyUnicode_GET_SIZE(obj)))
- return -1;
return 0;
#endif
}
@@ -1147,7 +1138,7 @@
}
for (i = 0; i < argcount; ++i) {
atypes[i] = args[i].ffi_type;
- if (atypes[i]->type == FFI_TYPE_STRUCT
+ if (atypes[i]->type == FFI_TYPE_STRUCT
#ifdef _WIN64
&& atypes[i]->size <= sizeof(void *)
#endif
Modified: python/branches/py3k/Modules/_ctypes/cfield.c
==============================================================================
--- python/branches/py3k/Modules/_ctypes/cfield.c (original)
+++ python/branches/py3k/Modules/_ctypes/cfield.c Wed Sep 29 12:37:16 2010
@@ -1433,15 +1433,11 @@
PyObject *keep;
wchar_t *buffer;
- int size = PyUnicode_GET_SIZE(value);
- size += 1; /* terminating NUL */
- size *= sizeof(wchar_t);
- buffer = (wchar_t *)PyMem_Malloc(size);
+ buffer = PyUnicode_AsWideCharString((PyUnicodeObject *)value, NULL);
if (!buffer) {
Py_DECREF(value);
- return PyErr_NoMemory();
+ return NULL;
}
- memset(buffer, 0, size);
keep = PyCapsule_New(buffer, CTYPES_CFIELD_CAPSULE_NAME_PYMEM, pymem_destructor);
if (!keep) {
Py_DECREF(value);
@@ -1449,12 +1445,6 @@
return NULL;
}
*(wchar_t **)ptr = (wchar_t *)buffer;
- if (-1 == PyUnicode_AsWideChar((PyUnicodeObject *)value,
- buffer, PyUnicode_GET_SIZE(value))) {
- Py_DECREF(value);
- Py_DECREF(keep);
- return NULL;
- }
Py_DECREF(value);
return keep;
}
More information about the Python-checkins
mailing list