On Sat, Jul 12, 2008 at 8:42 AM, Michael Abbott <michael@araneidae.co.uk> wrote:
> PyArray_DescrFromType can return NULL
Yah, you noticed ;)

> Yet it is unchecked in several places:
Pity about that.  Easy enough to fix though -- just don't lose track of
ref counts.  In fact, I've already submitted a patch to this function (but
not addressing this issue).

> static int
> PyArray_CanCastSafely(int fromtype, int totype)
> {
>     PyArray_Descr *from, *to;
>     register int felsize, telsize;
>
>     if (fromtype == totype) return 1;
>     if (fromtype == PyArray_BOOL) return 1;
>     if (totype == PyArray_BOOL) return 0;
>     if (totype == PyArray_OBJECT || totype == PyArray_VOID) return 1;
>     if (fromtype == PyArray_OBJECT || fromtype == PyArray_VOID) return 0;
>
>     from = PyArray_DescrFromType(fromtype);
     if (from == NULL)  return 0;

>     /*
>      * cancastto is a PyArray_NOTYPE terminated C-int-array of types that
>      * the data-type can be cast to safely.
>      */
>     if (from->f->cancastto) {
>         int *curtype;
>         curtype = from->f->cancastto;
>         while (*curtype != PyArray_NOTYPE) {
>             if (*curtype++ == totype) return 1;
>         }
>     }
>     if (PyTypeNum_ISUSERDEF(totype)) return 0;
>
>     to = PyArray_DescrFromType(totype);
     if (to == NULL)  { Py_DECREF(from); return 0; }

>     telsize = to->elsize;
>     felsize = from->elsize;
>     Py_DECREF(from);
>     Py_DECREF(to);
>       ...
> }
>
> Furthermore, the last function can fail, but doesn't seem to have an error
> return. What is the best way to go about cleaning this up?

Given the question the function is asking, returning false seems good
enough for "failure".

Good point, but  a memory error may have been set by PyArray_DescrNew. My impression is that the routine was originally intended to return references to static singleton instances, in which case it couldn't fail.  I think we need a separate static instance for PyArray_CHARLTR instead of making a copy of a string type and fudging a few members so that it too can't fail. The array indexing for user defined types probably needs bounds checking also, but I'm not sure what to do there.

Chuck