* Bug 16007 fixed: non-integer index in sparse crashed Scilab 00/20900/5
St├ęphane Mottelet [Thu, 14 Mar 2019 17:33:03 +0000 (18:33 +0100)]
http://bugzilla.scilab.org/show_bug.cgi?id=16007

Positive fractionnal indices were supported, provided they were
greater than 1

Change-Id: I821cc4f5cbd2618cf6c5560d0478171b1389c846

scilab/CHANGES.md
scilab/modules/sparse/sci_gateway/cpp/sci_sparse.cpp
scilab/modules/sparse/tests/nonreg_tests/bug_16007.tst [new file with mode: 0644]

index bfd6991..f3d424f 100644 (file)
@@ -150,4 +150,5 @@ Bug Fixes
 * [#15577](http://bugzilla.scilab.org/show_bug.cgi?id=15577): `edit` did not accept a line number as text, as with `edit linspace 21`.
 * [#15983](http://bugzilla.scilab.org/show_bug.cgi?id=15983): `group()` regressed in 5.5.2 due to a too intrusive fix.
 * [#16005](http://bugzilla.scilab.org/show_bug.cgi?id=16005): The `intdec` example was biased and not robust when changing sampling frequencies.
+* [#16007](http://bugzilla.scilab.org/show_bug.cgi?id=16007): Non-integer index in sparse makes Scilab crash.
 * [#16021](http://bugzilla.scilab.org/show_bug.cgi?id=16021): `tand([-90 90])` answered [Nan Nan] instead of [-Inf, Inf]. `cotd([-90 90])` answered [Nan Nan] instead of [0 0]. `1 ./cosd([-90 90])` answered [Inf -Inf] instead of [Inf Inf].
index dd12151..1069478 100644 (file)
@@ -155,27 +155,33 @@ types::Function::ReturnValue sci_sparse(types::typed_list &in, int _piRetCount,
         }
 
         bool alloc = false;
-        double* i = pDij->get();
-        double* j = i + size;
+        double* pdbli = pDij->get();
+        double* pdblj = pdbli + size;
 
-        if ( (size > 0) && ((*std::min_element(i, i + size) <= 0) || (*std::min_element(j, j + size) <= 0)) )
+        for (int i = 0; i < 2*size; i++)
+        {
+            pdbli[i] = trunc(pdbli[i]);
+        }
+
+        if ( (size > 0) && ((*std::min_element(pdbli, pdbli + size) <= 0) || (*std::min_element(pdblj, pdblj + size) <= 0)) )
         {
             Scierror(999, _("%s: Invalid index.\n"), "sparse");
             return types::Function::Error;
         }
-
+        
         if (pDdims == nullptr)
         {
             pDdims = new types::Double(1, 2, false);
             pDdims->setZeros();
             if (size > 0)
             {
-                pDdims->set(0, *std::max_element(i, i + size));
-                pDdims->set(1, *std::max_element(j, j + size));
+                pDdims->set(0, *std::max_element(pdbli, pdbli + size));
+                pDdims->set(1, *std::max_element(pdblj, pdblj + size));
             }
             alloc = true;
         }
-        else if ( (size > 0) && ((pDdims->get(0) < *std::max_element(i, i + size)) || (pDdims->get(1) < *std::max_element(j, j + size))) )
+        else if ( (size > 0) && ((pDdims->get(0) < *std::max_element(pdbli, pdbli + size)) 
+                  || (pDdims->get(1) < *std::max_element(pdblj, pdblj + size))) )
         {
             Scierror(999, _("%s: Invalid index.\n"),"sparse");
             return types::Function::Error;
diff --git a/scilab/modules/sparse/tests/nonreg_tests/bug_16007.tst b/scilab/modules/sparse/tests/nonreg_tests/bug_16007.tst
new file mode 100644 (file)
index 0000000..66b40b4
--- /dev/null
@@ -0,0 +1,19 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2018 - St├ęphane Mottelet
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+//
+// <-- Non-regression test for bug 16007 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=16007
+//
+// <-- Short Description -->
+// non-integer index in sparse makes Scilab crash
+
+A=sparse([1 1.5], 1);
+assert_checkerror("sparse([1 0.5], 1)",sprintf(_("%s: Invalid index.\n"),"sparse"));
\ No newline at end of file