]> granicus.if.org Git - graphviz/commitdiff
Fix bug in SparseMatrix_copy tries to copy a pattern matrix which does
authorEmden Gansner <emdenrg@google.com>
Sat, 3 Sep 2016 17:05:16 +0000 (13:05 -0400)
committerEmden Gansner <emdenrg@google.com>
Sat, 3 Sep 2016 17:05:16 +0000 (13:05 -0400)
have values.

If a matrix is constructed using _from_coordinate_arrays, it calls
from_coordinate_arrays_internal with SUM_REPEATED_ALL. The latter function then
calls sum_repeated_entries. This causes values to be added to the array

Later, if the matrix is passed to make_undirected, this calls symmetrize,
which may call _copy. If _copy uses _new, the new array will use the input
array's type (pattern) and not create memory values, causing the memcpy to fail.

lib/sparse/SparseMatrix.c

index d38abe656acca73c39b3ddccff63754ff2de1b86..c5d37f495b290c46af6c6028129d6d2eaa6682ce 100644 (file)
@@ -2470,7 +2470,7 @@ SparseMatrix SparseMatrix_crop(SparseMatrix A, real epsilon){
 SparseMatrix SparseMatrix_copy(SparseMatrix A){
   SparseMatrix B;
   if (!A) return A;
-  B = SparseMatrix_new(A->m, A->n, A->nz, A->type, A->format);
+  B = SparseMatrix_general_new(A->m, A->n, A->nz, A->type, A->size, A->format);
   MEMCPY(B->ia, A->ia, sizeof(int)*((size_t)(A->m+1)));
   MEMCPY(B->ja, A->ja, sizeof(int)*((size_t)(A->ia[A->m])));
   if (A->a) MEMCPY(B->a, A->a, A->size*((size_t)A->nz));