]> granicus.if.org Git - python/commitdiff
Check the allocation of b_objects and return if there was a failure.
authorNeal Norwitz <nnorwitz@gmail.com>
Sun, 23 Jul 2006 07:55:55 +0000 (07:55 +0000)
committerNeal Norwitz <nnorwitz@gmail.com>
Sun, 23 Jul 2006 07:55:55 +0000 (07:55 +0000)
Also fix a few memory leaks in other failure scenarios.

It seems that if b_objects == Py_None, we will have an extra ref to
b_objects.  Add XXX comment so hopefully someone documents why the
else isn't necessary or adds it in.

Reported by Klocwork #20

Modules/_ctypes/_ctypes.c

index a56663c31dc5ae7f04728d49caece618233f11f7..18c2db43be249f0f4fa86fb5e7c0b083d75896c2 100644 (file)
@@ -4521,18 +4521,27 @@ cast(void *ptr, PyObject *src, PyObject *ctype)
                if (obj->b_objects == Py_None) {
                        Py_DECREF(Py_None);
                        obj->b_objects = PyDict_New();
+                       if (!obj->b_objects) {
+                               Py_DECREF(result);
+                               return NULL;
+                       }
                }
+               /* XXX(nnorwitz): shouldn't the INCREF only be done in an else? */
                Py_INCREF(obj->b_objects);
                result->b_objects = obj->b_objects;
                if (result->b_objects) {
                        PyObject *index = PyLong_FromVoidPtr((void *)src);
                        int rc;
-                       if (index == NULL)
+                       if (index == NULL) {
+                               Py_DECREF(result);
                                return NULL;
+                       }
                        rc = PyDict_SetItem(result->b_objects, index, src);
                        Py_DECREF(index);
-                       if (rc == -1)
+                       if (rc == -1) {
+                               Py_DECREF(result);
                                return NULL;
+                       }
                }
        }
        /* Should we assert that result is a pointer type? */