[SciPy-dev] fitpack memory corruption

Paul Janzen pcj at linux.sez.to
Sat Mar 25 04:03:56 EST 2006


The following fragment crashes the Python interpreter on both Windows
and Linux due to memory corruption:

from scipy.interpolate import splrep
splrep(arange(10),arange(10),k=3,task=-1,t=[0,0,0,0,1,1,1,1]) 

Here is a simple patch against 1712 that at least fixes this case:

--- Lib\interpolate\__fitpack.h~	2006-03-17 04:43:36.000000000 -0800
+++ Lib\interpolate\__fitpack.h	2006-03-25 00:16:45.810340800 -0800
@@ -374,11 +374,11 @@
     ap_wrk = (PyArrayObject *)PyArray_FromDims(1,&n,PyArray_DOUBLE);
     ap_iwrk = (PyArrayObject *)PyArray_FromDims(1,&n,PyArray_INT);
     if (ap_wrk == NULL || ap_iwrk == NULL) goto fail;
+    memcpy(ap_wrk->data,wrk,n*sizeof(double));
+    memcpy(ap_iwrk->data,iwrk,n*sizeof(int));
   }
   memcpy(ap_t->data,t,n*sizeof(double));
   memcpy(ap_c->data,c,lc*sizeof(double));
-  memcpy(ap_wrk->data,wrk,n*sizeof(double));
-  memcpy(ap_iwrk->data,iwrk,n*sizeof(int));
   if (wa) free(wa);
   Py_DECREF(ap_x);
   Py_DECREF(ap_y);

Similar scenario at line 215:fitpack_surfit.

I still don't understand why the condition for copying into
ap_{i,}wrk->data (line 373) is iopt==0.  Doesn't the curfit
documentation imply that you want to persist wrk/iwrk iff iopt==1?

Also, it looks like the two assignments at 355 and 370 risk leaking
references?

    ap_t=(PyArrayObject*)PyArray_ContiguousFromObject(t_py,PyArray_DOUBLE, 0, 1);
...
  ap_t = (PyArrayObject *)PyArray_FromDims(1,&n,PyArray_DOUBLE);

As do the second assignments to ap_wrk/ap_iwrk. 

-- Paul




More information about the SciPy-Dev mailing list