[Numpy-discussion] Ticket review: #848, leak in PyArray_DescrFromType

Michael Abbott michael at araneidae.co.uk
Tue Jul 15 03:48:38 EDT 2008


Only half of my patch for this bug has gone into trunk, and without the 
rest of my patch there remains a leak.

Furthermore, it remains necessary to perform an extra INCREF on typecode 
before calling PyArray_FromAny ... as otherwise there is the real 
possibility that typecode will have evaporated by the time it's passed to 
scalar_value later down in the routine.

I attach the patch I believe remains necessary against this routine:


--- numpy/core/src/scalartypes.inc.src  (revision 5411)
+++ numpy/core/src/scalartypes.inc.src  (working copy)
@@ -1925,19 +1925,30 @@
         goto finish;
     }

+    Py_XINCREF(typecode);
     arr = PyArray_FromAny(obj, typecode, 0, 0, FORCECAST, NULL);
-    if ((arr==NULL) || (PyArray_NDIM(arr) > 0)) return arr;
+    if ((arr==NULL) || (PyArray_NDIM(arr) > 0)) {
+        Py_XDECREF(typecode);
+        return arr;
+    }
     robj = PyArray_Return((PyArrayObject *)arr);

 finish:
-    if ((robj==NULL) || (robj->ob_type == type)) return robj;
+    if ((robj==NULL) || (robj->ob_type == type)) {
+        Py_XDECREF(typecode);
+        return robj;
+    }
     /* Need to allocate new type and copy data-area over */
     if (type->tp_itemsize) {
         itemsize = PyString_GET_SIZE(robj);
     }
     else itemsize = 0;
     obj = type->tp_alloc(type, itemsize);
-    if (obj == NULL) {Py_DECREF(robj); return NULL;}
+    if (obj == NULL) {
+        Py_XDECREF(typecode);
+        Py_DECREF(robj);
+        return NULL;
+    }
     if (typecode==NULL)
         typecode = PyArray_DescrFromType(PyArray_ at TYPE@);
     dest = scalar_value(obj, typecode);


I can see that there might be an argument that PyArray_FromAny has the 
semantics that it retains a reference to typecode unless it returns NULL 
... but I don't want to go there.  That would not be a good thing to rely 
on -- and even with those semantics the existing code still needs fixing.



More information about the NumPy-Discussion mailing list