# HG changeset patch # User Rik # Date 1400870903 25200 # Node ID ac0c04e4d141dee5f98c3a0bd7b4e4c603f17174 # Parent 4293f49795d930850d16e855255f1e696f56c192 Fix segfault with sparse inputs to complex() (bug #42290). * data.cc (Fcomplex): Correctly call SparseComplexMatrix constructor with nrows, ncols, initial_value. Use in-place operator += to clarify code. diff -r 4293f49795d9 -r ac0c04e4d141 libinterp/corefcn/data.cc --- a/libinterp/corefcn/data.cc Fri May 23 12:20:05 2014 -0400 +++ b/libinterp/corefcn/data.cc Fri May 23 11:48:23 2014 -0700 @@ -3121,17 +3121,16 @@ result = Complex (0, 1) * SparseComplexMatrix (im_val); else { - result = SparseComplexMatrix (im_val.dims (), re_val (0)); octave_idx_type nr = im_val.rows (); octave_idx_type nc = im_val.cols (); + result = SparseComplexMatrix (nr, nc, re_val(0)); for (octave_idx_type j = 0; j < nc; j++) { octave_idx_type off = j * nr; for (octave_idx_type i = im_val.cidx (j); i < im_val.cidx (j + 1); i++) - result.data (im_val.ridx (i) + off) = - result.data (im_val.ridx (i) + off) + + result.data (im_val.ridx (i) + off) += Complex (0, im_val.data (i)); } } @@ -3144,19 +3143,17 @@ result = SparseComplexMatrix (re_val); else { - result = SparseComplexMatrix (re_val.rows (), - re_val.cols (), - Complex (0, im_val (0))); octave_idx_type nr = re_val.rows (); octave_idx_type nc = re_val.cols (); + result = SparseComplexMatrix (nr, nc, + Complex (0, im_val(0))); for (octave_idx_type j = 0; j < nc; j++) { octave_idx_type off = j * nr; for (octave_idx_type i = re_val.cidx (j); i < re_val.cidx (j + 1); i++) - result.data (re_val.ridx (i) + off) = - result.data (re_val.ridx (i) + off) + + result.data (re_val.ridx (i) + off) += re_val.data (i); } }