Re: [Numpy-discussion] bug in PyArray_GetCastFunc
On Sat, Dec 3, 2011 at 5:28 PM, Geoffrey Irving irv...@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(PyObjecthttp://docs.python.org/release/2.7/c-api/structures.html#PyObject * *p*) Return true if its argument is a PyCObjecthttp://docs.python.org/release/2.7/c-api/cobject.html#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 ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] bug in PyArray_GetCastFunc
On Sun, Dec 4, 2011 at 10:02 AM, Charles R Harris charlesr.har...@gmail.com wrote: On Sat, Dec 3, 2011 at 5:28 PM, Geoffrey Irving irv...@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 ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] bug in PyArray_GetCastFunc
On Sun, Dec 4, 2011 at 6:30 PM, Geoffrey Irving irv...@naml.us wrote: On Sun, Dec 4, 2011 at 10:02 AM, Charles R Harris charlesr.har...@gmail.com wrote: On Sat, Dec 3, 2011 at 5:28 PM, Geoffrey Irving irv...@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. Good points. I may change it back ;) Chuck ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
[Numpy-discussion] bug in PyArray_GetCastFunc
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); } } ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion