Bug fix #15302: Wrong load() calling sequence can crash Scilab 83/19483/2
Antoine ELIAS [Fri, 13 Oct 2017 09:15:56 +0000 (11:15 +0200)]
Change-Id: I28a0142fd50b7ee9ad53bce310e44c43a0d84395

scilab/CHANGES.md
scilab/modules/hdf5/sci_gateway/cpp/sci_hdf5_load.cpp
scilab/modules/hdf5/sci_gateway/cpp/sci_hdf5_load_v3.cpp
scilab/modules/hdf5/tests/nonreg_tests/bug_15302.tst [new file with mode: 0644]

index d345210..67bd6b4 100644 (file)
@@ -478,6 +478,7 @@ the [development mailing list](dev@lists.scilab.org) for a particular toolbox.
 * [#15285](http://bugzilla.scilab.org/show_bug.cgi?id=15285): `resize_matrix` did not manage conversion into `int64` and `uint64`.
 * [#15300](http://bugzilla.scilab.org/show_bug.cgi?id=15300): Distributive assignments like `a=(1,2)` crashed Scilab.
 * [#15301](http://bugzilla.scilab.org/show_bug.cgi?id=15301): Sequence constructor `:` failed when a bound was an outputless funtion call.
+* [#15302](http://bugzilla.scilab.org/show_bug.cgi?id=15302): `load` crashed when inputs arguments are not strings.
 * [#15308](http://bugzilla.scilab.org/show_bug.cgi?id=15308): Unlike `evstr(["1 2";"3 4"])`, `evstr(["1;2" "3;4"])` was not accepted.
 
 ### Bugs fixed in 6.0.0:
index 925ddc7..1b0c771 100644 (file)
@@ -44,10 +44,19 @@ types::Function::ReturnValue sci_hdf5_load(types::typed_list &in, int _iRetCount
         return types::Function::Error;
     }
 
-    if (in[0]->getId() != types::InternalType::IdScalarString)
+    for (int i = 0; i < in.size(); ++i)
     {
-        Scierror(999, _("%s: Wrong size for input argument #%d: string expected.\n"), fname.data(), 1);
-        return types::Function::Error;
+        if (in[i]->isString() == false)
+        {
+            Scierror(999, _("%s: Wrong type for input argument #%d: string expected.\n"), fname.data(), i+1);
+            return types::Function::Error;
+        }
+
+        if (in[i]->getAs<types::String>()->isScalar() == false)
+        {
+            Scierror(999, _("%s: Wrong size for input argument #%d: string expected.\n"), fname.data(), i + 1);
+            return types::Function::Error;
+        }
     }
 
     wchar_t* wcfilename = expandPathVariableW(in[0]->getAs<types::String>()->get()[0]);
@@ -131,7 +140,6 @@ types::Function::ReturnValue sci_hdf5_load(types::typed_list &in, int _iRetCount
 
     if (ret != types::Function::OK)
     {
-        Scierror(999, _("%s: Unable to load '%s'\n"), fname.data(), filename.data());
         return types::Function::Error;
     }
 
index b07ac8f..6c03482 100644 (file)
@@ -110,6 +110,8 @@ types::Function::ReturnValue sci_hdf5_load_v3(types::typed_list &in, int _iRetCo
     int iVersion = getSODFormatAttribute(iFile);
     if (iVersion != SOD_FILE_VERSION)
     {
+        //close the file
+        closeHDF5File(iFile);
         //can't read file with version newer that me !
         Scierror(999, _("%s: Wrong SOD file format version. Expected: %d Found: %d\n"), fname.data(), SOD_FILE_VERSION, iVersion);
         return types::Function::Error;
@@ -126,6 +128,8 @@ types::Function::ReturnValue sci_hdf5_load_v3(types::typed_list &in, int _iRetCo
 
             if (import_variable(iFile, var) == false)
             {
+                //close the file
+                closeHDF5File(iFile);
                 Scierror(999, _("%s: Unable to load \'%s\'.\n"), fname.data(), var.data());
                 return types::Function::Error;
             }
@@ -146,6 +150,8 @@ types::Function::ReturnValue sci_hdf5_load_v3(types::typed_list &in, int _iRetCo
                 FREE(var);
                 if (import_variable(iFile, s) == false)
                 {
+                    //close the file
+                    closeHDF5File(iFile);
                     Scierror(999, _("%s: Unable to load \'%s\'.\n"), fname.data(), s.data());
                     return types::Function::Error;
                 }
diff --git a/scilab/modules/hdf5/tests/nonreg_tests/bug_15302.tst b/scilab/modules/hdf5/tests/nonreg_tests/bug_15302.tst
new file mode 100644 (file)
index 0000000..fa72669
--- /dev/null
@@ -0,0 +1,21 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2017 - ESI - Antoine ELIAS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- NO CHECK REF -->
+//
+// <-- Non-regression test for bug 15302 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/15302
+//
+// <-- Short Description -->
+// Wrong load() calling sequence can crash Scilab!
+
+a = 1;
+save("TMPDIR/file.sod", "a");
+msg = msprintf(_("%s: Wrong type for input argument #%d: string expected.\n"), "load", 2);
+assert_checkerror("load(""TMPDIR/file.sod"", a);", msg);