]> granicus.if.org Git - python/commitdiff
Rewrite the AllocFunctionCallback function for better error handling.
authorThomas Heller <theller@ctypes.org>
Thu, 16 Mar 2006 19:24:27 +0000 (19:24 +0000)
committerThomas Heller <theller@ctypes.org>
Thu, 16 Mar 2006 19:24:27 +0000 (19:24 +0000)
Hope that fixes one or two Coverty warnings.

Modules/_ctypes/callbacks.c

index 2948d980d7c02d896a5f651c3b03a8af2b2f38a0..286faa351876895d26afbbd8362d54f12835e635 100644 (file)
@@ -307,19 +307,18 @@ THUNK AllocFunctionCallback(PyObject *callable,
 
        nArgs = PySequence_Size(converters);
        p = (ffi_info *)PyMem_Malloc(sizeof(ffi_info) + sizeof(ffi_type) * (nArgs + 1));
-       if (p == NULL) {
-               PyErr_NoMemory();
-               return NULL;
-       }
+       if (p == NULL)
+               return (THUNK)PyErr_NoMemory();
        p->pcl = MallocClosure();
        if (p->pcl == NULL) {
-               PyMem_Free(p);
                PyErr_NoMemory();
-               return NULL;
+               goto error;
        }
 
        for (i = 0; i < nArgs; ++i) {
                PyObject *cnv = PySequence_GetItem(converters, i);
+               if (cnv == NULL)
+                       goto error;
                p->atypes[i] = GetType(cnv);
                Py_DECREF(cnv);
        }
@@ -330,10 +329,8 @@ THUNK AllocFunctionCallback(PyObject *callable,
                p->restype = &ffi_type_void;
        } else {
                StgDictObject *dict = PyType_stgdict(restype);
-               if (dict == NULL) {
-                       PyMem_Free(p);
-                       return NULL;
-               }
+               if (dict == NULL)
+                       goto error;
                p->setfunc = dict->setfunc;
                p->restype = &dict->ffi_type;
        }
@@ -349,21 +346,25 @@ THUNK AllocFunctionCallback(PyObject *callable,
        if (result != FFI_OK) {
                PyErr_Format(PyExc_RuntimeError,
                             "ffi_prep_cif failed with %d", result);
-               PyMem_Free(p);
-               return NULL;
+               goto error;
        }
        result = ffi_prep_closure(p->pcl, &p->cif, closure_fcn, p);
        if (result != FFI_OK) {
                PyErr_Format(PyExc_RuntimeError,
                             "ffi_prep_closure failed with %d", result);
-               PyMem_Free(p);
-               return NULL;
+               goto error;
        }
 
        p->converters = converters;
        p->callable = callable;
-
        return (THUNK)p;
+
+  error:
+       if (p) {
+               FreeCallback((THUNK)p);
+               PyMem_Free(p);
+       }
+       return NULL;
 }
 
 /****************************************************************************