* Bug #13119 fixed - fileio: mget and mgetl accepted decimal values as number of... 96/13396/3
Paul Bignier [Fri, 3 Jan 2014 15:36:31 +0000 (16:36 +0100)]
Change-Id: I0791e98034326bd1966b8375210ca0ae9bf1b2dc

scilab/CHANGES_5.5.X
scilab/modules/fileio/help/en_US/mget.xml
scilab/modules/fileio/sci_gateway/c/sci_mget.c
scilab/modules/fileio/sci_gateway/c/sci_mgetl.c
scilab/modules/fileio/tests/nonreg_tests/bug_13119.dia.ref [new file with mode: 0644]
scilab/modules/fileio/tests/nonreg_tests/bug_13119.tst [new file with mode: 0644]
scilab/modules/fileio/tests/nonreg_tests/bug_3427.dia.ref
scilab/modules/fileio/tests/nonreg_tests/bug_3427.tst

index 9f0ca94..816d477 100644 (file)
@@ -741,6 +741,8 @@ Scilab Bug Fixes
 
 * Bug #13116 fixed - qpsolve now respects upper-bounds constraints.
 
+* Bug #13119 fixed - mget and mgetl accepted decimal values as number of lines.
+
 * Bug #13121 fixed - ode "rk" option crashed Scilab when the user derivative function failed.
 
 * Bug #13127 fixed - There were no subticks with user defined ticks.
index 47bb11a..08029e5 100644 (file)
@@ -3,11 +3,11 @@
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2008 - INRIA
  * ...
- * 
+ *
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
  * you should have received as part of this distribution.  The terms
- * are also available at    
+ * are also available at
  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
  *
  -->
             <varlistentry>
                 <term>n</term>
                 <listitem>
-                    <para>a positive scalar: the number of items to be read.</para>
+                    <para>a positive integer scalar: the number of items to be read.</para>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>fd</term>
                 <listitem>
                     <para>
-                        a scalar: a file descriptor returned by the function <function>mopen</function>. <literal>-1</literal> 
-                        stands for last opened file. Default value is 
+                        a scalar: a file descriptor returned by the function <function>mopen</function>. <literal>-1</literal>
+                        stands for last opened file. Default value is
                         <literal>-1</literal>.
                     </para>
                 </listitem>
@@ -54,7 +54,7 @@
                 <term>type</term>
                 <listitem>
                     <para>
-                        a string: the binary format used to write all the entries of 
+                        a string: the binary format used to write all the entries of
                         <varname>x</varname>.
                     </para>
                 </listitem>
         <para>
             The <function>mget</function> function reads data in the input
             specified by the stream parameter <varname>fd</varname> and returns a
-            vector of floating point data. 
+            vector of floating point data.
         </para>
         
         <para>
-            The <function>mgeti</function> function reads data in the input 
-            specified by the stream parameter <varname>fd</varname> and returns a 
+            The <function>mgeti</function> function reads data in the input
+            specified by the stream parameter <varname>fd</varname> and returns a
             vector of integer data.
         </para>
         <para>
         </para>
         <para>
             The <varname>type</varname> parameter is a conversion specifier
-            which may be set to any of the following flag characters (with default 
+            which may be set to any of the following flag characters (with default
             value <literal>"l"</literal>):
         </para>
         <para>
             <note>
-                On Windows, default behavior is to skip byte 13 (<literal>0x0D</literal>). 
-                <function>mopen</function> should be called with the 
-                <literal>'b'</literal> option, e.g. 
-                <code>fd1 = mopen(file1,'rb')</code>, so that all bytes will be read 
+                On Windows, default behavior is to skip byte 13 (<literal>0x0D</literal>).
+                <function>mopen</function> should be called with the
+                <literal>'b'</literal> option, e.g.
+                <code>fd1 = mopen(file1,'rb')</code>, so that all bytes will be read
                 without exception.
             </note>
         </para>
             </varlistentry>
         </variablelist>
         <para>
-            Bytes read is automatically swapped if necessary (by checking 
+            Bytes read is automatically swapped if necessary (by checking
             <literal>little=endian</literal> status).
         </para>
         <para>
-            This default swapping behavior can be suprressed by adding a flag in      
+            This default swapping behavior can be suprressed by adding a flag in
             the <function>mopen</function> function.
         </para>
         <para>
-            Formats <literal>"l"</literal>, <literal>"d"</literal> and 
-            <literal>"f"</literal> are only valid with the 
+            Formats <literal>"l"</literal>, <literal>"d"</literal> and
+            <literal>"f"</literal> are only valid with the
             <function>mget</function> function.
         </para>
     </refsection>
     <refsection>
         <title>Examples</title>
-        <programlisting role="example"><![CDATA[ 
+        <programlisting role="example"><![CDATA[
 file1 = fullfile(TMPDIR,'test1.bin');
 file2 = fullfile(TMPDIR,'test2.bin');
 fd1=mopen(file1,'wb');
index aa09791..29b7708 100644 (file)
@@ -12,6 +12,7 @@
 *
 */
 /*--------------------------------------------------------------------------*/
+#include <stdio.h>
 #include "stack-c.h"
 #include "gw_fileio.h"
 #include "MALLOC.h"
@@ -25,36 +26,42 @@ int sci_mget(char *fname, unsigned long fname_len)
 {
     int m1 = 0, n1 = 0, l1 = 0;
     int m2 = 0, n2 = 0, l2 = 0;
-    int        m3 = 0, n3 = 0, l3 = 0;
+    int m3 = 0, n3 = 0, l3 = 0;
     int l4 = 0;
     int err = 0;
     char *type = NULL;
     int fd = ALL_FILES_DESCRIPTOR;
     int n = 1;
     int one = 1;
+    SciIntMat varTwo;
 
     Nbvars = 0;
     CheckRhs(1, 3);
     CheckLhs(1, 1);
 
-    if ( Rhs >= 1)
+    if (Rhs >= 1)
     {
         if (GetType(1) == sci_matrix)
         {
-            GetRhsVar(1, MATRIX_OF_INTEGER_DATATYPE, &m1, &n1, &l1);
-            if (m1*n1 == 1)
+            GetRhsVar(1, MATRIX_OF_DOUBLE_DATATYPE, &m1, &n1, &l1);
+            if (*stk(l1) != (int) *stk(l1) || *stk(l1) < 0)
             {
-                n  = *istk(l1);
+                Scierror(999, _("%s: Wrong value for input argument #%d: A positive integer value expected.\n"), fname, 1);
+                return 0;
+            }
+            if (m1 * n1 == 1)
+            {
+                n  = (int) * stk(l1);
             }
             else
             {
-                Scierror(999, _("%s: Wrong size for input argument #%d: An integer expected.\n"), fname, 1);
+                Scierror(999, _("%s: Wrong size for input argument #%d: A positive integer value expected.\n"), fname, 1);
                 return 0;
             }
         }
         else
         {
-            Scierror(999, _("%s: Wrong type for input argument #%d: An integer expected.\n"), fname, 1);
+            Scierror(999, _("%s: Wrong type for input argument #%d: A positive integer value expected.\n"), fname, 1);
             return 0;
         }
     }
@@ -82,7 +89,7 @@ int sci_mget(char *fname, unsigned long fname_len)
         if (GetType(3) == sci_matrix)
         {
             GetRhsVar(3, MATRIX_OF_INTEGER_DATATYPE, &m3, &n3, &l3);
-            if (m3*n3 == 1)
+            if (m3 * n3 == 1)
             {
                 fd = *istk(l3);
             }
index 124e199..9a64726 100644 (file)
@@ -58,13 +58,19 @@ int sci_mgetl(char *fname, unsigned long fname_len)
             double dValue = 0.;
             if (!isScalar(pvApiCtx, piAddressVarTwo))
             {
-                Scierror(999, _("%s: Wrong size for input argument #%d: Integer expected.\n"), fname, 2);
+                Scierror(999, _("%s: Wrong size for input argument #%d: An integer value expected.\n"), fname, 2);
                 return 0;
             }
 
             if ( getScalarDouble(pvApiCtx, piAddressVarTwo, &dValue) == 0)
             {
-                numberOfLinesToRead = (int)dValue;
+                if (dValue != (int) dValue)
+                {
+                    Scierror(999, _("%s: Wrong value for input argument #%d: An integer value expected.\n"), fname, 2);
+                    return 0;
+                }
+
+                numberOfLinesToRead = (int) dValue;
             }
             else
             {
@@ -74,7 +80,7 @@ int sci_mgetl(char *fname, unsigned long fname_len)
         }
         else
         {
-            Scierror(999, _("%s: Wrong type for input argument #%d: Integer expected.\n"), fname, 2);
+            Scierror(999, _("%s: Wrong type for input argument #%d: An integer value expected.\n"), fname, 2);
             return 0;
         }
     }
diff --git a/scilab/modules/fileio/tests/nonreg_tests/bug_13119.dia.ref b/scilab/modules/fileio/tests/nonreg_tests/bug_13119.dia.ref
new file mode 100644 (file)
index 0000000..08191c5
--- /dev/null
@@ -0,0 +1,32 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 13119 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=13119
+//
+// <-- Short Description -->
+// mget and mgetl accepted decimal values as number of lines.
+curdir = pwd();
+cd(TMPDIR);
+fd = mopen("test", "wr"); // Open a file
+refMsg = msprintf(_("%s: Wrong value for input argument #%d: A positive integer value expected.\n"), "mget", 1);
+assert_checkerror("mget(-1, ""d"", fd)", refMsg);
+refMsg = msprintf(_("%s: Wrong value for input argument #%d: A positive integer value expected.\n"), "mget", 1);
+assert_checkerror("mget(1.5, ""d"", fd)", refMsg);
+refMsg2 = msprintf(_("%s: Wrong type for input argument #%d: A positive integer value expected.\n"), "mget", 1);
+assert_checkerror("mget(int8(1), ""d"", fd)", refMsg2);
+refMsg3 = msprintf(_("%s: Wrong value for input argument #%d: An integer value expected.\n"), "mgetl", 2);
+assert_checkerror("mgetl(""test"", 1.5)", refMsg3);
+refMsg4 = msprintf(_("%s: Wrong type for input argument #%d: An integer value expected.\n"), "mgetl", 2);
+assert_checkerror("mgetl(""test"", int8(1))", refMsg4);
+mclose(fd);
+deletefile("test");
+cd(curdir);
diff --git a/scilab/modules/fileio/tests/nonreg_tests/bug_13119.tst b/scilab/modules/fileio/tests/nonreg_tests/bug_13119.tst
new file mode 100644 (file)
index 0000000..74206bc
--- /dev/null
@@ -0,0 +1,41 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 13119 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=13119
+//
+// <-- Short Description -->
+// mget and mgetl accepted decimal values as number of lines.
+
+curdir = pwd();
+cd(TMPDIR);
+
+fd = mopen("test", "wr"); // Open a file
+
+refMsg = msprintf(_("%s: Wrong value for input argument #%d: A positive integer value expected.\n"), "mget", 1);
+assert_checkerror("mget(-1, ""d"", fd)", refMsg);
+
+refMsg = msprintf(_("%s: Wrong value for input argument #%d: A positive integer value expected.\n"), "mget", 1);
+assert_checkerror("mget(1.5, ""d"", fd)", refMsg);
+
+refMsg2 = msprintf(_("%s: Wrong type for input argument #%d: A positive integer value expected.\n"), "mget", 1);
+assert_checkerror("mget(int8(1), ""d"", fd)", refMsg2);
+
+refMsg3 = msprintf(_("%s: Wrong value for input argument #%d: An integer value expected.\n"), "mgetl", 2);
+assert_checkerror("mgetl(""test"", 1.5)", refMsg3);
+
+refMsg4 = msprintf(_("%s: Wrong type for input argument #%d: An integer value expected.\n"), "mgetl", 2);
+assert_checkerror("mgetl(""test"", int8(1))", refMsg4);
+
+mclose(fd);
+deletefile("test");
+
+cd(curdir);
index 7f76df0..f2bc6cf 100644 (file)
@@ -7,7 +7,7 @@
 // <-- Non-regression test for bug 3427 -->
 //
 // <-- Short Description -->
-//-->mgetl(TMPDIR+"/"+myFile,'r')                                           
+//-->mgetl(TMPDIR+"/"+myFile,'r')
 //mgetl: Wrong type for argument 2: Real or complex matrix expected.
 //=> Wrong error report.
 //The second input argument should be an integer scalar.
 // <-- Bugzilla URL -->
 // http://bugzilla.scilab.org/show_bug.cgi?id=3427
 //
-ierr = execstr('mgetl(''SCI/etc/scilab.start'',''r'');','errcatch');
+ierr = execstr("mgetl(''SCI/etc/scilab.start'',''r'');","errcatch");
 if ierr <> 999 then bugmes();quit;end
 err_msg = lasterror();
-ref_msg = msprintf(gettext("%s: Wrong type for input argument #%d: Integer expected.\n"),'mgetl',2);
+ref_msg = msprintf(gettext("%s: Wrong type for input argument #%d: An integer value expected.\n"),"mgetl",2);
 if err_msg <> ref_msg then bugmes();quit;end
-ierr = execstr('mgetl(''SCI/etc/scilab.start'',[5 5]);','errcatch');
+ierr = execstr("mgetl(''SCI/etc/scilab.start'',[5 5]);","errcatch");
 if ierr <> 999 then bugmes();quit;end
 err_msg = lasterror();
-ref_msg = msprintf(gettext("%s: Wrong size for input argument #%d: Integer expected.\n"),'mgetl',2);
+ref_msg = msprintf(gettext("%s: Wrong size for input argument #%d: An integer value expected.\n"),"mgetl",2);
 if err_msg <> ref_msg then bugmes();quit;end
index 4c340a2..3301109 100644 (file)
@@ -8,7 +8,7 @@
 // <-- Non-regression test for bug 3427 -->
 //
 // <-- Short Description -->
-//-->mgetl(TMPDIR+"/"+myFile,'r')                                           
+//-->mgetl(TMPDIR+"/"+myFile,'r')
 //mgetl: Wrong type for argument 2: Real or complex matrix expected.
 //=> Wrong error report.
 //The second input argument should be an integer scalar.
 // http://bugzilla.scilab.org/show_bug.cgi?id=3427
 //
 
-ierr = execstr('mgetl(''SCI/etc/scilab.start'',''r'');','errcatch');
+ierr = execstr("mgetl(''SCI/etc/scilab.start'',''r'');","errcatch");
 if ierr <> 999 then pause,end
 err_msg = lasterror();
-ref_msg = msprintf(gettext("%s: Wrong type for input argument #%d: Integer expected.\n"),'mgetl',2);
+ref_msg = msprintf(gettext("%s: Wrong type for input argument #%d: An integer value expected.\n"),"mgetl",2);
 
 if err_msg <> ref_msg then pause,end
 
-ierr = execstr('mgetl(''SCI/etc/scilab.start'',[5 5]);','errcatch');
+ierr = execstr("mgetl(''SCI/etc/scilab.start'',[5 5]);","errcatch");
 if ierr <> 999 then pause,end
 err_msg = lasterror();
-ref_msg = msprintf(gettext("%s: Wrong size for input argument #%d: Integer expected.\n"),'mgetl',2);
+ref_msg = msprintf(gettext("%s: Wrong size for input argument #%d: An integer value expected.\n"),"mgetl",2);
 
 if err_msg <> ref_msg then pause,end