bug 8413 - fscanfMat crashed when file included text lines at the beginning. 31/2531/3
Allan CORNET [Fri, 19 Nov 2010 14:05:59 +0000 (15:05 +0100)]
Change-Id: I74cbc286dfc6be7d45ab42ce80b5b60a8f9099e5

scilab/CHANGES_5.3.X
scilab/modules/fileio/src/c/fscanfMat.c
scilab/modules/fileio/tests/nonreg_tests/bug_8413.dat [new file with mode: 0644]
scilab/modules/fileio/tests/nonreg_tests/bug_8413.dia.ref [new file with mode: 0644]
scilab/modules/fileio/tests/nonreg_tests/bug_8413.tst [new file with mode: 0644]

index 1312494..e6a4697 100644 (file)
@@ -345,6 +345,8 @@ Bug Fixes:
 
 * bug 8332 fixed - Some use of clipboard function crashed Scilab.
 
+* bug 8413 fixed - fscanfMat crashed when file included text lines at the beginning.
+
 
          Changes between version 5.3.0-beta-3 and 5.3.0-beta-4 of Scilab
          ===============================================================
index 3cd3d6d..325ebbb 100644 (file)
@@ -232,22 +232,33 @@ void freeFscanfMatResult(fscanfMatResult *resultStruct)
 /*--------------------------------------------------------------------------*/
 static BOOL itCanBeMatrixLine(char *line, char *format, char *separator)
 {
-#define SIZEKEYWORD 4 /* -Inf */
-    char str[SIZEKEYWORD];
-    double dValue = 0.;
-    int ierr = 0;
-
     if (line)
     {
+        int ierr = 0;
+        double dValue = 0.;
+
         ierr = sscanf(line, format, &dValue);
+
         if ((ierr == EOF) || (ierr == 0))
         {
-            ierr = sscanf(line, "%4s", str);
-            if ((ierr != 0) && (ierr != EOF))
+            char *str = strdup(line);
+            if (str)
             {
-                if (strncmp(str, NanString, (int)strlen(NanString)) == 0) return TRUE;
-                if (strncmp(str, NegInfString, (int)strlen(NegInfString)) == 0) return TRUE;
-                if (strncmp(str, InfString, (int)strlen(InfString)) == 0) return TRUE;
+                ierr = sscanf(line, "%4s", str);
+
+                if ((ierr != 0) && (ierr != EOF))
+                {
+                    if ((strncmp(str, NanString, (int)strlen(NanString)) == 0) ||
+                        (strncmp(str, NegInfString, (int)strlen(NegInfString)) == 0) ||
+                        (strncmp(str, InfString, (int)strlen(InfString)) == 0))
+                    {
+                        FREE(str);
+                        str = NULL;
+                        return TRUE;
+                    }
+                }
+                FREE(str);
+                str = NULL;
             }
         }
         else
@@ -337,10 +348,11 @@ static int getNbColumnsInLine(char *line, char *format, char *separator)
                 }
                 else
                 {
-#define SIZEKEYWORD 4 /* -Inf */
-                    char str[SIZEKEYWORD];
+                    char *str = strdup(splittedStr[i]);
                     strcpy(str, "");
+
                     ierr = sscanf(splittedStr[i], "%4s", str);
+
                     if ((ierr != 0) && (ierr != EOF))
                     {
                         if ( (strcmp(str, NanString) == 0) ||
@@ -354,14 +366,21 @@ static int getNbColumnsInLine(char *line, char *format, char *separator)
                             freeArrayOfString(splittedStr, nbTokens);
                             /* bug 6889 */
                             if (nbColums) nbColums--;
+                            FREE(str);
+                            str = NULL;
                             return nbColums;
                         }
                     }
                     else
                     {
+                        FREE(str);
+                        str = NULL;
                         freeArrayOfString(splittedStr, nbTokens);
                         return nbColums;
                     }
+
+                    FREE(str);
+                    str = NULL;
                 }
             }
             freeArrayOfString(splittedStr, nbTokens);
@@ -543,8 +562,7 @@ static double *getDoubleValuesInLine(char *line,
                 }
                 else
                 {
-#define SIZEKEYWORD 4 /* -Inf */
-                    char str[SIZEKEYWORD];
+                    char *str = strdup(line);
                     strcpy(str, "");
                     ierr = sscanf(splittedStr[i], "%4s", str);
                     if ((ierr != 0) && (ierr != EOF))
@@ -572,6 +590,7 @@ static double *getDoubleValuesInLine(char *line,
                         {
                             freeArrayOfString(splittedStr, nbTokens);
                             FREE(dValues); dValues = NULL;
+                            FREE(str); str = NULL;
                             return NULL;
                         }
                     }
@@ -579,8 +598,10 @@ static double *getDoubleValuesInLine(char *line,
                     {
                         freeArrayOfString(splittedStr, nbTokens);
                         FREE(dValues); dValues = NULL;
+                        FREE(str); str = NULL;
                         return NULL;
                     }
+                    FREE(str); str = NULL;
                 }
             }
             freeArrayOfString(splittedStr, nbTokens);
diff --git a/scilab/modules/fileio/tests/nonreg_tests/bug_8413.dat b/scilab/modules/fileio/tests/nonreg_tests/bug_8413.dat
new file mode 100644 (file)
index 0000000..e40a3eb
--- /dev/null
@@ -0,0 +1,4 @@
+jgkjhkh              sdfsdfsd             sdfsdfsdf           sdfsdfsd             fsdfsdfs              sdfsdf               sdfsdf               sdfsdf 
+1.038333130E+002     8.050000000E+001     6.416666412E+001     1.038333130E+002     8.050000000E+001     1.038333130E+002     6.416666412E+001     1.038333130E+002    
+1.026666870E+002     8.516668701E+001     6.533332825E+001     1.026666870E+002     8.516668701E+001     1.026666870E+002     6.533332825E+001     1.026666870E+002    
+9.916668701E+001     8.750000000E+001     6.883332825E+001     9.916668701E+001     8.750000000E+001     9.916668701E+001     6.883332825E+001     9.916668701E+001    
\ No newline at end of file
diff --git a/scilab/modules/fileio/tests/nonreg_tests/bug_8413.dia.ref b/scilab/modules/fileio/tests/nonreg_tests/bug_8413.dia.ref
new file mode 100644 (file)
index 0000000..2ca32c0
--- /dev/null
@@ -0,0 +1,24 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2010 - DIGITEO - Allan CORNET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- JVM NOT MANDATORY -->
+//
+// <-- Non-regression test for bug 8413 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=8413
+//
+// <-- Short Description -->
+// fscanfMat crashed when file included text lines at the beginning.
+//
+ierr = execstr("[r,v] = fscanfMat(""SCI/modules/fileio/tests/nonreg_tests/bug_8413.dat"");", "errcatch");
+if ierr <> 0 then bugmes();quit;end
+if type(v) <> 10 then bugmes();quit;end
+if type(r) <> 1 then bugmes();quit;end
+if size(v, "*") <> 1 then bugmes();quit;end
+if size(r, "r") <> 3 then bugmes();quit;end
+if size(r, "c") <> 8 then bugmes();quit;end
diff --git a/scilab/modules/fileio/tests/nonreg_tests/bug_8413.tst b/scilab/modules/fileio/tests/nonreg_tests/bug_8413.tst
new file mode 100644 (file)
index 0000000..fbbe54c
--- /dev/null
@@ -0,0 +1,25 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2010 - DIGITEO - Allan CORNET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- JVM NOT MANDATORY -->
+//
+// <-- Non-regression test for bug 8413 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=8413
+//
+// <-- Short Description -->
+// fscanfMat crashed when file included text lines at the beginning.
+//
+
+ierr = execstr("[r,v] = fscanfMat(""SCI/modules/fileio/tests/nonreg_tests/bug_8413.dat"");", "errcatch");
+if ierr <> 0 then pause, end
+if type(v) <> 10 then pause, end
+if type(r) <> 1 then pause, end
+if size(v, "*") <> 1 then pause, end
+if size(r, "r") <> 3 then pause, end
+if size(r, "c") <> 8 then pause, end