[bug_14609] msscanf crash fixed. 97/18997/2
Cedric Delamarre [Fri, 27 Jan 2017 16:35:31 +0000 (17:35 +0100)]
  test_run fileio bug_14609

Change-Id: I6dc8045c27d3854207e0c235753476eeb6cd6cbf

scilab/CHANGES.md
scilab/modules/fileio/sci_gateway/cpp/sci_msscanf.cpp
scilab/modules/fileio/tests/nonreg_tests/bug_14609.dia.ref [new file with mode: 0644]
scilab/modules/fileio/tests/nonreg_tests/bug_14609.tst [new file with mode: 0644]

index 8cbf67d..440201b 100644 (file)
@@ -357,7 +357,7 @@ Bug Fixes
 * [#9153](http://bugzilla.scilab.org/show_bug.cgi?id=9153): The `isqualbitwise` help page was inaccurate and badly located
 * [#9161](http://bugzilla.scilab.org/show_bug.cgi?id=9161): Multiple insertions at a repeated index in a sparse matrice wrongly updated it.
 * [#9288](http://bugzilla.scilab.org/show_bug.cgi?id=9288): Dynamic palette with the most used blocks
-* [#9451](http://bugzilla.scilab.org/show_bug.cgi?id=9451): `test_run` output did not clearly distinguish heading lines of modules and tests lines 
+* [#9451](http://bugzilla.scilab.org/show_bug.cgi?id=9451): `test_run` output did not clearly distinguish heading lines of modules and tests lines
 * [#9825](http://bugzilla.scilab.org/show_bug.cgi?id=9825): `assert_computedigits` returns too much digits
 * [#9865](http://bugzilla.scilab.org/show_bug.cgi?id=9865): When making a plot with `point`(no line), no symbol was shown in the legend.
 * [#9876](http://bugzilla.scilab.org/show_bug.cgi?id=9876): Creating a complex structure with multiple hierarchy level and size failed.
@@ -420,6 +420,7 @@ Bug Fixes
 * [#14591](http://bugzilla.scilab.org/show_bug.cgi?id=14591): `<=` and `>=` elementwise operators comparing 2 hypermatrices of decimal numbers or encoded integers were inverted.
 * [#14593](http://bugzilla.scilab.org/show_bug.cgi?id=14593): Signs are no more drawn in BIGSOM and PRODUCT components.
 * [#14602](http://bugzilla.scilab.org/show_bug.cgi?id=14602): WRITEC_f block didn't work for x86 machines.
+* [#14609](http://bugzilla.scilab.org/show_bug.cgi?id=14609): "msscanf" crashes Scilab when 'niter' parameter is out of range.
 * [#14632](http://bugzilla.scilab.org/show_bug.cgi?id=14632): Zooming moves drawn axis offscreen
 * [#14640](http://bugzilla.scilab.org/show_bug.cgi?id=14640): `median(int8([10 60 80 100]))` returned -58 instead of 70 due to overflow when interpolating (60+80)>128
 * [#14648](http://bugzilla.scilab.org/show_bug.cgi?id=14648): `isinf` returned `%F` for complex numbers with both real and imag infinite parts.
index 974283a..8c385b3 100644 (file)
@@ -83,6 +83,12 @@ types::Function::ReturnValue sci_msscanf(types::typed_list &in, int _iRetCount,
     {
         iNiter = pStrRead->getRows();
     }
+    else if (iNiter > pStrRead->getRows())
+    {
+        Scierror(999, _("%s: An error occurred: Not enough entries.\n"), "msscanf");
+        return types::Function::Error;
+    }
+
     wcsFormat = in[size - 1]->getAs<types::String>()->get(0);
     nrow = iNiter;
     while (++rowcount < iNiter)
diff --git a/scilab/modules/fileio/tests/nonreg_tests/bug_14609.dia.ref b/scilab/modules/fileio/tests/nonreg_tests/bug_14609.dia.ref
new file mode 100644 (file)
index 0000000..7666585
--- /dev/null
@@ -0,0 +1,20 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2017 - Scilab Enterprises - Cedric Delamarre
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 14609 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=14609
+//
+// <-- Short Description -->
+// "msscanf" crashes Scilab when 'niter' parameter is out of range
+str = "D=msscanf(5,[""Alain 19"";""Pierre 15"";""Tom 12""],""%s %d"")";
+assert_checkfalse(execstr(str   ,"errcatch") == 0);
+refMsg = msprintf(_("%s: An error occurred: Not enough entries.\n"), "msscanf");
+assert_checkerror(str, refMsg);
diff --git a/scilab/modules/fileio/tests/nonreg_tests/bug_14609.tst b/scilab/modules/fileio/tests/nonreg_tests/bug_14609.tst
new file mode 100644 (file)
index 0000000..5a89844
--- /dev/null
@@ -0,0 +1,21 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2017 - Scilab Enterprises - Cedric Delamarre
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 14609 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=14609
+//
+// <-- Short Description -->
+// "msscanf" crashes Scilab when 'niter' parameter is out of range
+
+str = "D=msscanf(5,[""Alain 19"";""Pierre 15"";""Tom 12""],""%s %d"")";
+assert_checkfalse(execstr(str   ,"errcatch") == 0);
+refMsg = msprintf(_("%s: An error occurred: Not enough entries.\n"), "msscanf");
+assert_checkerror(str, refMsg);