* Bug #13468 fixed - Fileio: Scilab hanged when incorrect format was used for file... 66/17966/2
Paul Bignier [Thu, 10 Jul 2014 14:39:03 +0000 (16:39 +0200)]
Change-Id: Ibc8d4a01dac4927232ff4627d525e103b20571d3

scilab/CHANGES
scilab/modules/fileio/sci_gateway/cpp/sci_mfscanf.cpp
scilab/modules/fileio/sci_gateway/cpp/sci_msscanf.cpp
scilab/modules/fileio/src/c/do_xxscanf.c
scilab/modules/fileio/tests/nonreg_tests/bug_13468.dat [new file with mode: 0644]
scilab/modules/fileio/tests/nonreg_tests/bug_13468.dia.ref [new file with mode: 0644]
scilab/modules/fileio/tests/nonreg_tests/bug_13468.tst [new file with mode: 0644]

index 33d1578..b523257 100644 (file)
@@ -327,6 +327,8 @@ In 6.0.0:
 
 * Bug #13465 fixed - The display of polyline .display_function and .display_function properties was not conventional
 
+* Bug #13468 fixed - Scilab hanged when incorrect format was used for file reading using mfscanf.
+
 * Bug #13769 fixed - t = "abc..//ghi" was parsed as a continued + comment
 
 * Bug #13810 fixed - householder(v, k*v) returned column of %nan. Input parameters were not checked. The Householder matrix could not be returned. Help pages were inaccurate and without examples. There was no householder() demo.
index 0c74712..f50ac99 100644 (file)
@@ -128,6 +128,10 @@ types::Function::ReturnValue sci_mfscanf(types::typed_list &in, int _iRetCount,
 
         // get data
         int err = do_xxscanf(L"mfscanf", fDesc, wcsFormat, &args, NULL, &retval, buf, type);
+        if (err == DO_XXPRINTF_MISMATCH)
+        {
+            break;
+        }
         if (err < 0)
         {
             return types::Function::Error;
index 8a7589e..487bcc8 100644 (file)
@@ -91,6 +91,10 @@ types::Function::ReturnValue sci_msscanf(types::typed_list &in, int _iRetCount,
             break;
         }
         int err = do_xxscanf(L"sscanf", (FILE *)0, wcsFormat, &args, pStrRead->get(rowcount), &retval, buf, type);
+        if (err == DO_XXPRINTF_MISMATCH)
+        {
+            break;
+        }
         if (err < 0)
         {
             return types::Function::Error;
index bc19459..34709de 100644 (file)
@@ -305,7 +305,7 @@ int do_xxscanf (const wchar_t *fname, FILE *fp, const wchar_t *format, int *narg
 
                 case L'n':
                     n_directive_count++;
-                //pass to next statement
+                    //pass to next statement
 
                 case L'i':
                 case L'd':
@@ -442,6 +442,10 @@ int do_xxscanf (const wchar_t *fname, FILE *fp, const wchar_t *format, int *narg
         }
     }
 
+    if (*retval == 0)
+    {
+        return DO_XXPRINTF_MISMATCH;
+    }
     return 0;
 }
 
diff --git a/scilab/modules/fileio/tests/nonreg_tests/bug_13468.dat b/scilab/modules/fileio/tests/nonreg_tests/bug_13468.dat
new file mode 100644 (file)
index 0000000..249d0e2
--- /dev/null
@@ -0,0 +1,5 @@
+#x-axis        y-axis
+0.7    0.1
+1.0    1.3
+2.1    4.1
+3.2    9.01
diff --git a/scilab/modules/fileio/tests/nonreg_tests/bug_13468.dia.ref b/scilab/modules/fileio/tests/nonreg_tests/bug_13468.dia.ref
new file mode 100644 (file)
index 0000000..ae19305
--- /dev/null
@@ -0,0 +1,22 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 13468 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=13468
+//
+// <-- Short Description -->
+// Scilab hanged when incorrect format was used for file reading using mfscanf.
+f = mopen(pathconvert("SCI/modules/fileio/tests/nonreg_tests")+"bug_13468.dat");
+[n, a, b] = mfscanf(-1, f, "%lg %lg");
+mclose(f);
+assert_checkequal(n, 0);
+assert_checkequal(a, []);
+assert_checkequal(b, []);
diff --git a/scilab/modules/fileio/tests/nonreg_tests/bug_13468.tst b/scilab/modules/fileio/tests/nonreg_tests/bug_13468.tst
new file mode 100644 (file)
index 0000000..1684f2d
--- /dev/null
@@ -0,0 +1,24 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 13468 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=13468
+//
+// <-- Short Description -->
+// Scilab hanged when incorrect format was used for file reading using mfscanf.
+
+f = mopen(pathconvert("SCI/modules/fileio/tests/nonreg_tests")+"bug_13468.dat");
+[n, a, b] = mfscanf(-1, f, "%lg %lg");
+mclose(f);
+
+assert_checkequal(n, 0);
+assert_checkequal(a, []);
+assert_checkequal(b, []);