On Sat, Dec 3, 2011 at 5:28 PM, Geoffrey Irving <irving@naml.us> wrote:
When attempting to cast to a user defined type, PyArray_GetCast looks
up the cast function in the dictionary but doesn't check if the entry
exists.  This causes segfaults.  Here's a patch.

Geoffrey

diff --git a/numpy/core/src/multiarray/convert_datatype.c
b/numpy/core/src/multiarray/convert_datatype.c
index 818d558..4b8f38b 100644
--- a/numpy/core/src/multiarray/convert_datatype.c
+++ b/numpy/core/src/multiarray/convert_datatype.c
@@ -81,7 +81,7 @@ PyArray_GetCastFunc(PyArray_Descr *descr, int type_num)
            key = PyInt_FromLong(type_num);
            cobj = PyDict_GetItem(obj, key);
            Py_DECREF(key);
-            if (NpyCapsule_Check(cobj)) {
+            if (cobj && NpyCapsule_Check(cobj)) {
                castfunc = NpyCapsule_AsVoidPtr(cobj);
            }
        }
__

I'm thinking NpyCapsule_Check should catch this. From the documentation it probably should:

int PyCObject_Check(PyObject *p)
Return true if its argument is a PyCObject

I don't think NULL is a valid PyCObject ;) However, it should be easy to add the NULL check to the numpy version of the function. I'll do that.

Chuck