[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