Bug 10670 fixed: Avoid a crash when xmlRead had an arg with bad dims 64/6264/2
Calixte DENIZET [Tue, 14 Feb 2012 15:32:01 +0000 (16:32 +0100)]
Change-Id: I7f65f2b87d5c4693fcd96bcc8760ec2204626b99

21 files changed:
scilab/CHANGES_5.4.X
scilab/modules/xml/sci_gateway/cpp/sci_percent_XMLAttr_e.cpp
scilab/modules/xml/sci_gateway/cpp/sci_percent_XMLAttr_size.cpp
scilab/modules/xml/sci_gateway/cpp/sci_percent_XMLList_size.cpp
scilab/modules/xml/sci_gateway/cpp/sci_percent_c_i_XMLAttr.cpp
scilab/modules/xml/sci_gateway/cpp/sci_percent_foo_i_XMLList.cpp
scilab/modules/xml/sci_gateway/cpp/sci_percent_s_i_XMLList.cpp
scilab/modules/xml/sci_gateway/cpp/sci_xmlDelete.cpp
scilab/modules/xml/sci_gateway/cpp/sci_xmlDocument.cpp
scilab/modules/xml/sci_gateway/cpp/sci_xmlDump.cpp
scilab/modules/xml/sci_gateway/cpp/sci_xmlElement.cpp
scilab/modules/xml/sci_gateway/cpp/sci_xmlGetNsByHref.cpp
scilab/modules/xml/sci_gateway/cpp/sci_xmlGetNsByPrefix.cpp
scilab/modules/xml/sci_gateway/cpp/sci_xmlNs.cpp
scilab/modules/xml/sci_gateway/cpp/sci_xmlRead.cpp
scilab/modules/xml/sci_gateway/cpp/sci_xmlReadStr.cpp
scilab/modules/xml/sci_gateway/cpp/sci_xmlValidationFile.cpp
scilab/modules/xml/sci_gateway/cpp/sci_xmlWrite.cpp
scilab/modules/xml/sci_gateway/cpp/sci_xmlXPath.cpp
scilab/modules/xml/tests/nonreg_tests/bug_10670.dia.ref [new file with mode: 0644]
scilab/modules/xml/tests/nonreg_tests/bug_10670.tst [new file with mode: 0644]

index b8a9555..6082d51 100644 (file)
@@ -19,6 +19,8 @@ XML
 
 * Bug #10630 fixed - Fix a typo in one of the error message.
 
+* Bug #10670 fixed - Avoid a crash when xmlRead had an arg with a bad size.
+
 
 Help
 ====
index 03b2f76..5615cba 100644 (file)
@@ -60,13 +60,13 @@ int sci_percent_XMLAttr_e(char *fname, unsigned long fname_len)
         err = getMatrixOfDouble(pvApiCtx, prefixaddr, &rows, &cols, &indexes);
         if (rows != 1 || cols != 1)
         {
-            Scierror(999, gettext("%s: Wrong type for input argument #%d: A string or a real expected.\n"), fname, 1);
+            Scierror(999, gettext("%s: Wrong dimension for input argument #%d: A real expected.\n"), fname, 1);
             return 0;
         }
     }
     else
     {
-        if (!isStringType(pvApiCtx, prefixaddr))
+        if (!isStringType(pvApiCtx, prefixaddr) || !checkVarDimension(pvApiCtx, prefixaddr, 1, 1))
         {
             Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 1);
             return 0;
@@ -89,10 +89,10 @@ int sci_percent_XMLAttr_e(char *fname, unsigned long fname_len)
                 return 0;
             }
 
-            if (!isStringType(pvApiCtx, nameaddr))
+            if (!isStringType(pvApiCtx, nameaddr) || !checkVarDimension(pvApiCtx, nameaddr, 1, 1))
             {
                 freeAllocatedSingleString(prefix);
-                Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 1);
+                Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 2);
                 return 0;
             }
 
index 6b98981..ff32841 100644 (file)
@@ -73,7 +73,7 @@ int sci_percent_XMLAttr_size(char *fname, unsigned long fname_len)
             return 0;
         }
 
-        if (!isStringType(pvApiCtx, addr))
+        if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
         {
             Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 2);
             return 0;
index 557afd0..fc60539 100644 (file)
@@ -72,7 +72,7 @@ int sci_percent_XMLList_size(char *fname, unsigned long fname_len)
             return 0;
         }
 
-        if (!isStringType(pvApiCtx, addr))
+        if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
         {
             Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 2);
             return 0;
index b8cb3e8..f5bffc8 100644 (file)
@@ -70,7 +70,7 @@ int sci_percent_c_i_XMLAttr(char *fname, unsigned long fname_len)
     }
     else
     {
-        if (!isStringType(pvApiCtx, prefixaddr))
+        if (!isStringType(pvApiCtx, prefixaddr) || !checkVarDimension(pvApiCtx, prefixaddr, 1, 1))
         {
             Scierror(999, gettext("%s: Wrong type for input argument #%d: A string or a single integer expected.\n"), fname, 1);
             return 0;
@@ -93,7 +93,7 @@ int sci_percent_c_i_XMLAttr(char *fname, unsigned long fname_len)
                 return 0;
             }
 
-            if (!isStringType(pvApiCtx, nameaddr))
+            if (!isStringType(pvApiCtx, nameaddr) || !checkVarDimension(pvApiCtx, nameaddr, 1, 1))
             {
                 freeAllocatedSingleString(prefix);
                 Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 1);
@@ -156,7 +156,7 @@ int sci_percent_c_i_XMLAttr(char *fname, unsigned long fname_len)
         return 0;
     }
 
-    if (!isStringType(pvApiCtx, rhsaddr))
+    if (!isStringType(pvApiCtx, rhsaddr) || !checkVarDimension(pvApiCtx, rhsaddr, 1, 1))
     {
         if (prefix)
         {
index 9d97e6a..e9d3aa9 100644 (file)
@@ -63,7 +63,7 @@ int sci_percent_foo_i_XMLList(char *fname, unsigned long fname_len)
         return 0;
     }
 
-    if (!isDoubleType(pvApiCtx, indexaddr))
+    if (!isDoubleType(pvApiCtx, indexaddr) || !checkVarDimension(pvApiCtx, indexaddr, 1, 1))
     {
         Scierror(999, gettext("%s: Wrong type for input argument #%d: A double expected.\n"), fname, 1);
         return 0;
@@ -114,7 +114,7 @@ int sci_percent_foo_i_XMLList(char *fname, unsigned long fname_len)
             return 0;
         }
 
-        if (!isStringType(pvApiCtx, retaddr))
+        if (!isStringType(pvApiCtx, retaddr) || !checkVarDimension(pvApiCtx, retaddr, 1, 1))
         {
             Scierror(999, gettext("%s: xmlFormat must return a string.\n"), fname);
             return 0;
index d609a5b..21bd62a 100644 (file)
@@ -55,7 +55,7 @@ int sci_percent_s_i_XMLList(char *fname, unsigned long fname_len)
         return 0;
     }
 
-    if (!isDoubleType(pvApiCtx, indexaddr))
+    if (!isDoubleType(pvApiCtx, indexaddr) || !checkVarDimension(pvApiCtx, indexaddr, 1, 1))
     {
         Scierror(999, gettext("%s: Wrong type for input argument #%d: A double expected.\n"), fname, 1);
         return 0;
@@ -115,7 +115,7 @@ int sci_percent_s_i_XMLList(char *fname, unsigned long fname_len)
             return 0;
         }
 
-        if (!isStringType(pvApiCtx, retaddr))
+        if (!isStringType(pvApiCtx, retaddr) || !checkVarDimension(pvApiCtx, retaddr, 1, 1))
         {
             Scierror(999, gettext("%s: xmlFormat must return a string.\n"), fname);
             return 0;
index 54a7aaa..2a23df6 100644 (file)
@@ -55,6 +55,12 @@ int sci_xmlDelete(char *fname, unsigned long fname_len)
 
     if (isStringType(pvApiCtx, addr))
     {
+        if (!checkVarDimension(pvApiCtx, addr, 1, 1))
+        {
+            Scierror(999, gettext("%s: Wrong dimension for input argument #%d: A string expected.\n"), fname, 1);
+            return 0;
+        }
+
         if (getAllocatedSingleString(pvApiCtx, addr, &com) != 0)
         {
             Scierror(999, _("%s: No more memory.\n"), fname);
index 48ee77b..0edfb30 100644 (file)
@@ -50,7 +50,7 @@ int sci_xmlDocument(char *fname, unsigned long fname_len)
             return 0;
         }
 
-        if (!isStringType(pvApiCtx, addr))
+        if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
         {
             Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, i + 1);
             return 0;
index bc8279a..c3e0f0d 100644 (file)
@@ -38,6 +38,7 @@ int sci_xmlDump(char *fname, unsigned long fname_len)
     XMLObject *obj = 0;
     int id;
     int type;
+    int b;
     SciErr err;
     int *addr = 0;
 
@@ -81,14 +82,12 @@ int sci_xmlDump(char *fname, unsigned long fname_len)
             return 0;
         }
 
-        if (!isBooleanType(pvApiCtx, addr))
+        if (!isBooleanType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
         {
             Scierror(999, gettext("%s: Wrong type for input argument #%d: A %s expected.\n"), fname, 2, "boolean");
             return 0;
         }
 
-        int b;
-
         if (getScalarBoolean(pvApiCtx, addr, &b))
         {
             return 0;
index 75d765d..81803b8 100644 (file)
@@ -68,7 +68,7 @@ int sci_xmlElement(char *fname, unsigned long fname_len)
         return 0;
     }
 
-    if (!isStringType(pvApiCtx, addr))
+    if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
     {
         Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 2);
         return 0;
index 00b49b5..9a99d01 100644 (file)
@@ -67,7 +67,7 @@ int sci_xmlGetNsByHref(char *fname, unsigned long fname_len)
         return 0;
     }
 
-    if (!isStringType(pvApiCtx, addr))
+    if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
     {
         Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 2);
         return 0;
index 99f598e..27ce63f 100644 (file)
@@ -67,7 +67,7 @@ int sci_xmlGetNsByPrefix(char *fname, unsigned long fname_len)
         return 0;
     }
 
-    if (!isStringType(pvApiCtx, addr))
+    if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
     {
         Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 2);
         return 0;
index 48243e0..ef4a074 100644 (file)
@@ -72,7 +72,7 @@ int sci_xmlNs(char *fname, unsigned long fname_len)
             return 0;
         }
 
-        if (!isStringType(pvApiCtx, addr))
+        if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
         {
             Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, i + 2);
             return 0;
index 33d1f73..6eaae6d 100644 (file)
@@ -52,11 +52,12 @@ int sci_xmlRead(char *fname, unsigned long fname_len)
         return 0;
     }
 
-    if (!isStringType(pvApiCtx, addr))
+    if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
     {
         Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 1);
         return 0;
     }
+
     if (getAllocatedSingleString(pvApiCtx, addr, &path) != 0)
     {
         Scierror(999, _("%s: No more memory.\n"), fname);
@@ -74,7 +75,7 @@ int sci_xmlRead(char *fname, unsigned long fname_len)
             return 0;
         }
 
-        if (!isBooleanType(pvApiCtx, addr))
+        if (!isBooleanType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
         {
             freeAllocatedSingleString(path);
             Scierror(999, gettext("%s: Wrong type for input argument #%d: A boolean expected.\n"), fname, 2);
index 80bad9f..054f010 100644 (file)
@@ -72,7 +72,7 @@ int sci_xmlReadStr(char *fname, unsigned long fname_len)
             return 0;
         }
 
-        if (!isBooleanType(pvApiCtx, addr))
+        if (!isBooleanType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
         {
             delete code;
 
index b8e0353..9dccbb0 100644 (file)
@@ -53,11 +53,12 @@ template < class T > int sci_xmlValidationFile(char *fname, void *pvApiCtx)
         return 0;
     }
 
-    if (!isStringType(pvApiCtx, addr))
+    if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
     {
         Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 1);
         return 0;
     }
+
     if (getAllocatedSingleString(pvApiCtx, addr, &path) != 0)
     {
         Scierror(999, _("%s: No more memory.\n"), fname);
index 118d7a3..0c9339e 100644 (file)
@@ -94,6 +94,12 @@ int sci_xmlWrite(char *fname, unsigned long fname_len)
 
         if (isStringType(pvApiCtx, addr))
         {
+            if (!checkVarDimension(pvApiCtx, addr, 1, 1))
+            {
+                Scierror(999, gettext("%s: Wrong dimension for input argument #%d: A string expected.\n"), fname, 2);
+                return 0;
+            }
+
             if (getAllocatedSingleString(pvApiCtx, addr, &path) != 0)
             {
                 Scierror(999, _("%s: No more memory.\n"), fname);
@@ -113,13 +119,19 @@ int sci_xmlWrite(char *fname, unsigned long fname_len)
         }
         else
         {
-
             if (!document->URL)
             {
                 Scierror(999, gettext("%s: The XML Document has not an URI and there is no second argument.\n"), fname);
                 return 0;
             }
             expandedPath = strdup((const char *)document->URL);
+
+            if (!isBooleanType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
+            {
+                Scierror(999, gettext("%s: Wrong dimension for input argument #%d: A boolean expected.\n"), fname, 2);
+                return 0;
+            }
+
             getScalarBoolean(pvApiCtx, addr, &indent);
         }
 
@@ -133,7 +145,7 @@ int sci_xmlWrite(char *fname, unsigned long fname_len)
                 return 0;
             }
 
-            if (!isBooleanType(pvApiCtx, addr))
+            if (!isBooleanType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
             {
                 Scierror(999, gettext("%s: Wrong type for input argument #%d: A boolean expected.\n"), fname, 3);
                 return 0;
index c9dfab0..6a29c39 100644 (file)
@@ -96,11 +96,12 @@ int sci_xmlXPath(char *fname, unsigned long fname_len)
         return 0;
     }
 
-    if (!isStringType(pvApiCtx, addr))
+    if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
     {
         Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 2);
         return 0;
     }
+
     if (getAllocatedSingleString(pvApiCtx, addr, &query) != 0)
     {
         Scierror(999, _("%s: No more memory.\n"), fname);
@@ -164,38 +165,38 @@ int sci_xmlXPath(char *fname, unsigned long fname_len)
     switch (xpath->getResultType())
     {
     case XPATH_NODESET:
+    {
+        const XMLNodeSet *set = xpath->getNodeSet();
+
+        if (set->getSize() == 0)
         {
-            const XMLNodeSet *set = xpath->getNodeSet();
-
-            if (set->getSize() == 0)
-            {
-                createMatrixOfDouble(pvApiCtx, Rhs + 1, 0, 0, 0);
-            }
-            set->createOnStack(Rhs + 1, pvApiCtx);
-            mustDelete = false;
-            break;
+            createMatrixOfDouble(pvApiCtx, Rhs + 1, 0, 0, 0);
         }
+        set->createOnStack(Rhs + 1, pvApiCtx);
+        mustDelete = false;
+        break;
+    }
     case XPATH_BOOLEAN:
-        {
-            int b = xpath->getBooleanValue();
+    {
+        int b = xpath->getBooleanValue();
 
-            createScalarBoolean(pvApiCtx, Rhs + 1, b);
-            break;
-        }
+        createScalarBoolean(pvApiCtx, Rhs + 1, b);
+        break;
+    }
     case XPATH_NUMBER:
-        {
-            double d = xpath->getFloatValue();
+    {
+        double d = xpath->getFloatValue();
 
-            createScalarDouble(pvApiCtx, Rhs + 1, d);
-            break;
-        }
+        createScalarDouble(pvApiCtx, Rhs + 1, d);
+        break;
+    }
     case XPATH_STRING:
-        {
-            const char *str = xpath->getStringValue();
+    {
+        const char *str = xpath->getStringValue();
 
-            createSingleString(pvApiCtx, Rhs + 1, str);
-            break;
-        }
+        createSingleString(pvApiCtx, Rhs + 1, str);
+        break;
+    }
     default:
         delete xpath;
         Scierror(999, gettext("%s: XPath query returned a not handled type: %i\n"), fname, xpath->getResultType());
diff --git a/scilab/modules/xml/tests/nonreg_tests/bug_10670.dia.ref b/scilab/modules/xml/tests/nonreg_tests/bug_10670.dia.ref
new file mode 100644 (file)
index 0000000..6f1a4e2
--- /dev/null
@@ -0,0 +1,19 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2012 - Scilab Enterprises - Calixte DENIZET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- JVM NOT MANDATORY -->
+//
+// <-- Non-regression test for bug 10670 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/10670
+//
+// <-- Short Description -->
+// There was a crash with xmlRead when argument had a bad dimension.
+//
+asserterrmsg = sprintf(gettext("%s: Wrong type for input argument #%d: A string expected.\n"), "xmlRead" , 1);
+assert_checkerror("xmlRead([""aze"" ""aze""])", asserterrmsg);
diff --git a/scilab/modules/xml/tests/nonreg_tests/bug_10670.tst b/scilab/modules/xml/tests/nonreg_tests/bug_10670.tst
new file mode 100644 (file)
index 0000000..86873be
--- /dev/null
@@ -0,0 +1,20 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2012 - Scilab Enterprises - Calixte DENIZET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- JVM NOT MANDATORY -->
+//
+// <-- Non-regression test for bug 10670 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/10670
+//
+// <-- Short Description -->
+// There was a crash with xmlRead when argument had a bad dimension.
+//
+
+asserterrmsg = sprintf(gettext("%s: Wrong type for input argument #%d: A string expected.\n"), "xmlRead" , 1);
+assert_checkerror("xmlRead([""aze"" ""aze""])", asserterrmsg);
\ No newline at end of file