[Scipy-svn] r7095 - trunk/scipy/sparse/sparsetools

scipy-svn at scipy.org scipy-svn at scipy.org
Sat Jan 29 13:00:38 EST 2011


Author: ptvirtan
Date: 2011-01-29 12:00:37 -0600 (Sat, 29 Jan 2011)
New Revision: 7095

Modified:
   trunk/scipy/sparse/sparsetools/csr_wrap.cxx
   trunk/scipy/sparse/sparsetools/numpy.i
Log:
BUG: sparse: fix crash on deref of std::vector of size 0 (fixes #1210)

Modified: trunk/scipy/sparse/sparsetools/csr_wrap.cxx
===================================================================
--- trunk/scipy/sparse/sparsetools/csr_wrap.cxx	2011-01-28 23:06:33 UTC (rev 7094)
+++ trunk/scipy/sparse/sparsetools/csr_wrap.cxx	2011-01-29 18:00:37 UTC (rev 7095)
@@ -42504,21 +42504,27 @@
   {
     npy_intp length = (arg10)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_INT); 
-    memcpy(PyArray_DATA(obj), &((*(arg10))[0]), sizeof(int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg10))[0]), sizeof(int)*length);
+    }
     delete arg10; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
   {
     npy_intp length = (arg11)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_INT); 
-    memcpy(PyArray_DATA(obj), &((*(arg11))[0]), sizeof(int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg11))[0]), sizeof(int)*length);
+    }
     delete arg11; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
   {
     npy_intp length = (arg12)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_BYTE); 
-    memcpy(PyArray_DATA(obj), &((*(arg12))[0]), sizeof(signed char)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg12))[0]), sizeof(signed char)*length);
+    }
     delete arg12; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
@@ -42681,21 +42687,27 @@
   {
     npy_intp length = (arg10)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_INT); 
-    memcpy(PyArray_DATA(obj), &((*(arg10))[0]), sizeof(int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg10))[0]), sizeof(int)*length);
+    }
     delete arg10; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
   {
     npy_intp length = (arg11)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_INT); 
-    memcpy(PyArray_DATA(obj), &((*(arg11))[0]), sizeof(int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg11))[0]), sizeof(int)*length);
+    }
     delete arg11; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
   {
     npy_intp length = (arg12)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_UBYTE); 
-    memcpy(PyArray_DATA(obj), &((*(arg12))[0]), sizeof(unsigned char)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg12))[0]), sizeof(unsigned char)*length);
+    }
     delete arg12; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
@@ -42858,21 +42870,27 @@
   {
     npy_intp length = (arg10)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_INT); 
-    memcpy(PyArray_DATA(obj), &((*(arg10))[0]), sizeof(int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg10))[0]), sizeof(int)*length);
+    }
     delete arg10; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
   {
     npy_intp length = (arg11)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_INT); 
-    memcpy(PyArray_DATA(obj), &((*(arg11))[0]), sizeof(int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg11))[0]), sizeof(int)*length);
+    }
     delete arg11; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
   {
     npy_intp length = (arg12)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_SHORT); 
-    memcpy(PyArray_DATA(obj), &((*(arg12))[0]), sizeof(short)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg12))[0]), sizeof(short)*length);
+    }
     delete arg12; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
@@ -43035,21 +43053,27 @@
   {
     npy_intp length = (arg10)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_INT); 
-    memcpy(PyArray_DATA(obj), &((*(arg10))[0]), sizeof(int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg10))[0]), sizeof(int)*length);
+    }
     delete arg10; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
   {
     npy_intp length = (arg11)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_INT); 
-    memcpy(PyArray_DATA(obj), &((*(arg11))[0]), sizeof(int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg11))[0]), sizeof(int)*length);
+    }
     delete arg11; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
   {
     npy_intp length = (arg12)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_USHORT); 
-    memcpy(PyArray_DATA(obj), &((*(arg12))[0]), sizeof(unsigned short)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg12))[0]), sizeof(unsigned short)*length);
+    }
     delete arg12; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
@@ -43212,21 +43236,27 @@
   {
     npy_intp length = (arg10)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_INT); 
-    memcpy(PyArray_DATA(obj), &((*(arg10))[0]), sizeof(int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg10))[0]), sizeof(int)*length);
+    }
     delete arg10; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
   {
     npy_intp length = (arg11)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_INT); 
-    memcpy(PyArray_DATA(obj), &((*(arg11))[0]), sizeof(int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg11))[0]), sizeof(int)*length);
+    }
     delete arg11; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
   {
     npy_intp length = (arg12)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_INT); 
-    memcpy(PyArray_DATA(obj), &((*(arg12))[0]), sizeof(int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg12))[0]), sizeof(int)*length);
+    }
     delete arg12; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
@@ -43389,21 +43419,27 @@
   {
     npy_intp length = (arg10)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_INT); 
-    memcpy(PyArray_DATA(obj), &((*(arg10))[0]), sizeof(int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg10))[0]), sizeof(int)*length);
+    }
     delete arg10; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
   {
     npy_intp length = (arg11)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_INT); 
-    memcpy(PyArray_DATA(obj), &((*(arg11))[0]), sizeof(int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg11))[0]), sizeof(int)*length);
+    }
     delete arg11; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
   {
     npy_intp length = (arg12)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_UINT); 
-    memcpy(PyArray_DATA(obj), &((*(arg12))[0]), sizeof(unsigned int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg12))[0]), sizeof(unsigned int)*length);
+    }
     delete arg12; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
@@ -43566,21 +43602,27 @@
   {
     npy_intp length = (arg10)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_INT); 
-    memcpy(PyArray_DATA(obj), &((*(arg10))[0]), sizeof(int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg10))[0]), sizeof(int)*length);
+    }
     delete arg10; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
   {
     npy_intp length = (arg11)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_INT); 
-    memcpy(PyArray_DATA(obj), &((*(arg11))[0]), sizeof(int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg11))[0]), sizeof(int)*length);
+    }
     delete arg11; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
   {
     npy_intp length = (arg12)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_LONGLONG); 
-    memcpy(PyArray_DATA(obj), &((*(arg12))[0]), sizeof(long long)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg12))[0]), sizeof(long long)*length);
+    }
     delete arg12; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
@@ -43743,21 +43785,27 @@
   {
     npy_intp length = (arg10)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_INT); 
-    memcpy(PyArray_DATA(obj), &((*(arg10))[0]), sizeof(int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg10))[0]), sizeof(int)*length);
+    }
     delete arg10; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
   {
     npy_intp length = (arg11)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_INT); 
-    memcpy(PyArray_DATA(obj), &((*(arg11))[0]), sizeof(int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg11))[0]), sizeof(int)*length);
+    }
     delete arg11; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
   {
     npy_intp length = (arg12)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_ULONGLONG); 
-    memcpy(PyArray_DATA(obj), &((*(arg12))[0]), sizeof(unsigned long long)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg12))[0]), sizeof(unsigned long long)*length);
+    }
     delete arg12; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
@@ -43920,21 +43968,27 @@
   {
     npy_intp length = (arg10)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_INT); 
-    memcpy(PyArray_DATA(obj), &((*(arg10))[0]), sizeof(int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg10))[0]), sizeof(int)*length);
+    }
     delete arg10; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
   {
     npy_intp length = (arg11)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_INT); 
-    memcpy(PyArray_DATA(obj), &((*(arg11))[0]), sizeof(int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg11))[0]), sizeof(int)*length);
+    }
     delete arg11; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
   {
     npy_intp length = (arg12)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_FLOAT); 
-    memcpy(PyArray_DATA(obj), &((*(arg12))[0]), sizeof(float)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg12))[0]), sizeof(float)*length);
+    }
     delete arg12; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
@@ -44097,21 +44151,27 @@
   {
     npy_intp length = (arg10)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_INT); 
-    memcpy(PyArray_DATA(obj), &((*(arg10))[0]), sizeof(int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg10))[0]), sizeof(int)*length);
+    }
     delete arg10; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
   {
     npy_intp length = (arg11)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_INT); 
-    memcpy(PyArray_DATA(obj), &((*(arg11))[0]), sizeof(int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg11))[0]), sizeof(int)*length);
+    }
     delete arg11; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
   {
     npy_intp length = (arg12)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_DOUBLE); 
-    memcpy(PyArray_DATA(obj), &((*(arg12))[0]), sizeof(double)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg12))[0]), sizeof(double)*length);
+    }
     delete arg12; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
@@ -44274,21 +44334,27 @@
   {
     npy_intp length = (arg10)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_INT); 
-    memcpy(PyArray_DATA(obj), &((*(arg10))[0]), sizeof(int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg10))[0]), sizeof(int)*length);
+    }
     delete arg10; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
   {
     npy_intp length = (arg11)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_INT); 
-    memcpy(PyArray_DATA(obj), &((*(arg11))[0]), sizeof(int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg11))[0]), sizeof(int)*length);
+    }
     delete arg11; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
   {
     npy_intp length = (arg12)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_LONGDOUBLE); 
-    memcpy(PyArray_DATA(obj), &((*(arg12))[0]), sizeof(long double)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg12))[0]), sizeof(long double)*length);
+    }
     delete arg12; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
@@ -44451,21 +44517,27 @@
   {
     npy_intp length = (arg10)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_INT); 
-    memcpy(PyArray_DATA(obj), &((*(arg10))[0]), sizeof(int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg10))[0]), sizeof(int)*length);
+    }
     delete arg10; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
   {
     npy_intp length = (arg11)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_INT); 
-    memcpy(PyArray_DATA(obj), &((*(arg11))[0]), sizeof(int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg11))[0]), sizeof(int)*length);
+    }
     delete arg11; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
   {
     npy_intp length = (arg12)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_CFLOAT); 
-    memcpy(PyArray_DATA(obj), &((*(arg12))[0]), sizeof(npy_cfloat_wrapper)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg12))[0]), sizeof(npy_cfloat_wrapper)*length);
+    }
     delete arg12; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
@@ -44628,21 +44700,27 @@
   {
     npy_intp length = (arg10)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_INT); 
-    memcpy(PyArray_DATA(obj), &((*(arg10))[0]), sizeof(int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg10))[0]), sizeof(int)*length);
+    }
     delete arg10; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
   {
     npy_intp length = (arg11)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_INT); 
-    memcpy(PyArray_DATA(obj), &((*(arg11))[0]), sizeof(int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg11))[0]), sizeof(int)*length);
+    }
     delete arg11; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
   {
     npy_intp length = (arg12)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_CDOUBLE); 
-    memcpy(PyArray_DATA(obj), &((*(arg12))[0]), sizeof(npy_cdouble_wrapper)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg12))[0]), sizeof(npy_cdouble_wrapper)*length);
+    }
     delete arg12; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
@@ -44805,21 +44883,27 @@
   {
     npy_intp length = (arg10)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_INT); 
-    memcpy(PyArray_DATA(obj), &((*(arg10))[0]), sizeof(int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg10))[0]), sizeof(int)*length);
+    }
     delete arg10; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
   {
     npy_intp length = (arg11)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_INT); 
-    memcpy(PyArray_DATA(obj), &((*(arg11))[0]), sizeof(int)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg11))[0]), sizeof(int)*length);
+    }
     delete arg11; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }
   {
     npy_intp length = (arg12)->size(); 
     PyObject *obj = PyArray_SimpleNew(1, &length,PyArray_CLONGDOUBLE); 
-    memcpy(PyArray_DATA(obj), &((*(arg12))[0]), sizeof(npy_clongdouble_wrapper)*length);
+    if (length > 0) {
+      memcpy(PyArray_DATA(obj), &((*(arg12))[0]), sizeof(npy_clongdouble_wrapper)*length);
+    }
     delete arg12; 
     resultobj = helper_appendToTuple( resultobj, (PyObject *)obj ); 
   }

Modified: trunk/scipy/sparse/sparsetools/numpy.i
===================================================================
--- trunk/scipy/sparse/sparsetools/numpy.i	2011-01-28 23:06:33 UTC (rev 7094)
+++ trunk/scipy/sparse/sparsetools/numpy.i	2011-01-29 18:00:37 UTC (rev 7095)
@@ -524,7 +524,9 @@
 %typemap( argout ) std::vector<ctype>* array_argout { 
   npy_intp length = ($1)->size(); 
   PyObject *obj = PyArray_SimpleNew(1, &length, ##atype); 
-  memcpy(PyArray_DATA(obj), &((*($1))[0]), sizeof(ctype)*length);
+  if (length > 0) {
+    memcpy(PyArray_DATA(obj), &((*($1))[0]), sizeof(ctype)*length);
+  }
   delete $1; 
   $result = helper_appendToTuple( $result, (PyObject *)obj ); 
 }; 




More information about the Scipy-svn mailing list