[Numpy-discussion] bug in PyArray_GetCastFunc

Geoffrey Irving irving at naml.us
Sun Dec 4 20:30:48 EST 2011


On Sun, Dec 4, 2011 at 10:02 AM, Charles R Harris
<charlesr.harris at gmail.com> wrote:
>
>
> On Sat, Dec 3, 2011 at 5:28 PM, Geoffrey Irving <irving at 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.

That would work, but I think would match the rest of the Python API
better if NpyCapsule_Check required a nonnull argument.
PyCapsule_Check and essentially every other Python API function have
documented undefined behavior if you pass in null, so it might be
surprising one numpy macro violates this.  Incidentally, every other
use of NpyCapsule_Check correctly tests for null.

Geoffrey



More information about the NumPy-Discussion mailing list