* Bug 15715 fixed: now %nan indexes do not crash Scilab 16/21016/2
St├ęphane Mottelet [Thu, 20 Jun 2019 08:53:06 +0000 (10:53 +0200)]
http://bugzilla.scilab.org/show_bug.cgi?id=15715

Change-Id: Ic3958e233c34548a1b873cda84ae3f42f962e16a

scilab/CHANGES.md
scilab/modules/ast/src/cpp/types/types_tools.cpp
scilab/modules/ast/tests/nonreg_tests/bug_15715.tst [new file with mode: 0644]

index 0b2f115..79f2f24 100644 (file)
@@ -160,6 +160,7 @@ Bug Fixes
 * [#15248](http://bugzilla.scilab.org/show_bug.cgi?id=15248): `lsq()`was leaking memory.
 * [#15577](http://bugzilla.scilab.org/show_bug.cgi?id=15577): `edit` did not accept a line number as text, as with `edit linspace 21`.
 * [#15668](http://bugzilla.scilab.org/show_bug.cgi?id=15668): `save(filename)` saved all predefined Scilab constants %e %pi etc.. (regression)
+* [#15715](http://bugzilla.scilab.org/show_bug.cgi?id=15715): `%nan` indices crashed Scilab. 
 * [#15812](http://bugzilla.scilab.org/show_bug.cgi?id=15812): On assigning variables the source variable may become become corrupted
 * [#15840](http://bugzilla.scilab.org/show_bug.cgi?id=15840): `grand(1,"prm",m)` yielded an unsqueezed size([size(m) 1]) hypermatrix
 * [#15964](http://bugzilla.scilab.org/show_bug.cgi?id=15954): A complex empty sparse matrix could be obtained after insertion.
index 8f132da..023cce5 100644 (file)
@@ -396,7 +396,7 @@ bool getImplicitIndex(GenericType* _pRef, typed_list* _pArgsIn, std::vector<int>
                 }
 
                 double val = start - 1;
-                std::generate(idx.begin(), idx.end(), [&val, step]{ double s = val; val += step; return (int)s; });
+                std::generate(idx.begin(), idx.end(), [&val, step] { double s = val; val += step; return (int)s; });
 
                 lstIdx.push_back(idx);
                 finalSize *= size;
@@ -530,10 +530,10 @@ int checkIndexesArguments(InternalType* _pRef, typed_list* _pArgsIn, typed_list*
             {
                 int size = pCurrentArg->getSize();
                 double* dbl = pCurrentArg->get();
-                double minIndex = _pRef==NULL || _pRef->isList()==false ? 1 : 0;
+                double minIndex = _pRef == NULL || _pRef->isList() == false ? 1 : 0;
                 for (int j = 0; j < size; ++j)
                 {
-                    if (dbl[j] < minIndex)
+                    if (dbl[j] < minIndex || isnan(dbl[j]))
                     {
                         if (pCurrentArg->isDeletable())
                         {
@@ -557,8 +557,8 @@ int checkIndexesArguments(InternalType* _pRef, typed_list* _pArgsIn, typed_list*
                 if (_pRef == NULL)
                 {
                     if (pIL->getStep()->isDouble() &&
-                        ((getIndex(pIL->getStep()) > 0 && pIL->getStart()->isDouble() && getIndex(pIL->getStart()) < 1) ||
-                        (getIndex(pIL->getStep()) < 0 && pIL->getEnd()->isDouble() && getIndex(pIL->getEnd()) < 1)))
+                            ((getIndex(pIL->getStep()) > 0 && pIL->getStart()->isDouble() && getIndex(pIL->getStart()) < 1) ||
+                             (getIndex(pIL->getStep()) < 0 && pIL->getEnd()->isDouble() && getIndex(pIL->getEnd()) < 1)))
                     {
                         pCurrentArg = NULL;
                     }
@@ -572,42 +572,43 @@ int checkIndexesArguments(InternalType* _pRef, typed_list* _pArgsIn, typed_list*
                     }
                 }
                 else
-                {        //evalute polynom with "MaxDim"
+                {
+                    //evalute polynom with "MaxDim"
                     int iMaxDim = _pRef->getAs<GenericType>()->getVarMaxDim(i, iDims);
-    #if defined(_SCILAB_DEBUGREF_)
+#if defined(_SCILAB_DEBUGREF_)
                     Double* pdbl = new Double(iMaxDim);
-    #else
+#else
                     Double dbl(iMaxDim);
-    #endif
+#endif
                     if (pIL->getStart()->isPoly())
                     {
                         Polynom *poPoly = pIL->getStart()->getAs<types::Polynom>();
-    #if defined(_SCILAB_DEBUGREF_)
+#if defined(_SCILAB_DEBUGREF_)
                         pIL->setStart(poPoly->evaluate(pdbl));
-    #else
+#else
                         pIL->setStart(poPoly->evaluate(&dbl));
-    #endif
+#endif
                     }
                     if (pIL->getStep()->isPoly())
                     {
                         Polynom *poPoly = pIL->getStep()->getAs<types::Polynom>();
-    #if defined(_SCILAB_DEBUGREF_)
+#if defined(_SCILAB_DEBUGREF_)
                         pIL->setStep(poPoly->evaluate(pdbl));
-    #else
+#else
                         pIL->setStep(poPoly->evaluate(&dbl));
-    #endif
+#endif
                     }
                     if (pIL->getEnd()->isPoly())
                     {
                         Polynom *poPoly = pIL->getEnd()->getAs<types::Polynom>();
-    #if defined(_SCILAB_DEBUGREF_)
+#if defined(_SCILAB_DEBUGREF_)
                         pIL->setEnd(poPoly->evaluate(pdbl));
-    #else
+#else
                         pIL->setEnd(poPoly->evaluate(&dbl));
-    #endif
+#endif
                     }
 
-    #if defined(_SCILAB_DEBUGREF_)
+#if defined(_SCILAB_DEBUGREF_)
                     pdbl->killMe();
 #endif
                 }
@@ -626,7 +627,7 @@ int checkIndexesArguments(InternalType* _pRef, typed_list* _pArgsIn, typed_list*
         else if (pIT->isString())
         {
             String* pStr = pIT->getAs<String>();
-            if(!_pRef)
+            if (!_pRef)
             {
                 bUndefine = true;
                 continue;
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_15715.tst b/scilab/modules/ast/tests/nonreg_tests/bug_15715.tst
new file mode 100644 (file)
index 0000000..f465121
--- /dev/null
@@ -0,0 +1,28 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2019 - 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 15715 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/15715
+//
+// <-- Short Description -->
+// Referencing a 2D array with one valid index and %nan for the second index causes a crash
+
+A = eye(3,3);
+message = msprintf(gettext("Invalid index.\n"));
+
+assert_checkerror("A(%nan,1)",message)
+assert_checkerror("A(%nan,%nan)",message)
+assert_checkerror("A(1,%nan)",message)
+assert_checkerror("A(%nan,%nan)=1",message)
+assert_checkerror("A(%nan,1)=1",message)
+assert_checkerror("A(1,%nan)=1",message)
+