* Bug #12246 fixed - Return an error message when reading invalid excel files (which... 24/10424/6
Simon Marchetto [Thu, 7 Feb 2013 16:01:44 +0000 (17:01 +0100)]
test_run("spreadsheet","bug_12246",["no_check_error_output"])

Change-Id: Ie5a51922df318dd15d85325548fa13a8f81780a8

scilab/CHANGES_5.4.X
scilab/modules/spreadsheet/src/c/xls.c
scilab/modules/spreadsheet/tests/nonreg_tests/bug_12246.tst [new file with mode: 0644]
scilab/modules/spreadsheet/tests/nonreg_tests/bug_12246.xls [new file with mode: 0644]

index 40a587f..32b3d5a 100644 (file)
@@ -343,6 +343,9 @@ Bug fixes
 
 * Bug #12240 fixed - Refactoring of the eigs function.
 
+* Bug #12246 fixed - Return an error message when reading invalid excel files
+                     (which have declared wrong column/row count)
+
 * Bug #12247 fixed - Fix a typo in some error messages.
 
 
index e22e627..5d7afb9 100644 (file)
@@ -129,6 +129,12 @@ void xls_read(int *fd, int *cur_pos, double **data, int **chainesind, int *N, in
                 if (*err > 0) goto ErrL;
                 C2F(mgetnc) (fd, (void*)&col, &one, typ_ushort, err);
                 if (*err > 0) goto ErrL;
+                // Check col and row are in bounds
+                if ((col >= longueur) || (row >= hauteur))
+                {
+                    *err = 2;
+                    goto ErrL;
+                }
                 C2F(mgetnc) (fd, (void*)&xf , &one, typ_ushort, err);
                 if (*err > 0) goto ErrL;
                 C2F(mgetnc) (fd, (void*) &rkvalue , &one, typ_int, err);
@@ -140,6 +146,12 @@ void xls_read(int *fd, int *cur_pos, double **data, int **chainesind, int *N, in
                 if (*err > 0) goto ErrL;
                 C2F(mgetnc) (fd, (void*)&col, &one, typ_ushort, err);
                 if (*err > 0) goto ErrL;
+                // Check col and row are in bounds
+                if ((col >= longueur) || (row >= hauteur))
+                {
+                    *err = 2;
+                    goto ErrL;
+                }
                 C2F(mgetnc) (fd, (void*)&xf , &one, typ_ushort, err);
                 if (*err > 0) goto ErrL;
                 C2F(mgetnc) (fd, (void*) &resultat , &one, typ_double, err);
@@ -152,6 +164,12 @@ void xls_read(int *fd, int *cur_pos, double **data, int **chainesind, int *N, in
                 if (*err > 0) goto ErrL;
                 C2F(mgetnc) (fd,  (void*)&colFirst, &one, typ_short, err);
                 if (*err > 0) goto ErrL;
+                // Check col and row are in bounds
+                if ((colFirst >= longueur) || (row >= hauteur))
+                {
+                    *err = 2;
+                    goto ErrL;
+                }
                 /*List of nc=lc-fc+1  XF/RK structures*/
                 ncol = (Len - 6) / 6;
                 for (i = 0; i < ncol; i++)
@@ -174,7 +192,15 @@ void xls_read(int *fd, int *cur_pos, double **data, int **chainesind, int *N, in
                 C2F(mgetnc) (fd, (void*) &indsst , &one, typ_int, err);
                 if (*err > 0) goto ErrL;
                 /*Allocation dans le tableau final*/
-                (*chainesind)[(labelsst1[1]) * (hauteur) + labelsst1[0]] = indsst + 1;
+                col = labelsst1[1];
+                row = labelsst1[0];
+                // Check col and row are in bounds
+                if ((col >= longueur) || (row >= hauteur))
+                {
+                    *err = 2;
+                    goto ErrL;
+                }
+                (*chainesind)[col * (hauteur) + row] = indsst + 1;
                 break;
             case 512:/* DIMENSIONS*/
                 C2F(mgetnc) (fd, (void*) &f_row, &one, typ_int, err);
@@ -213,6 +239,12 @@ void xls_read(int *fd, int *cur_pos, double **data, int **chainesind, int *N, in
                 if (*err > 0) goto ErrL;
                 C2F(mgetnc) (fd, (void*) &col, &one, typ_ushort, err);
                 if (*err > 0) goto ErrL;
+                // Check col and row are in bounds
+                if ((col >= longueur) || (row >= hauteur))
+                {
+                    *err = 2;
+                    goto ErrL;
+                }
                 C2F(mgetnc) (fd, (void*) &xf, &one, typ_ushort, err);
                 if (*err > 0) goto ErrL;
 
diff --git a/scilab/modules/spreadsheet/tests/nonreg_tests/bug_12246.tst b/scilab/modules/spreadsheet/tests/nonreg_tests/bug_12246.tst
new file mode 100644 (file)
index 0000000..b08ee2e
--- /dev/null
@@ -0,0 +1,26 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Simon Marchetto
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// English imposed to compare error message
+// <-- ENGLISH IMPOSED -->
+//
+// <-- NO CHECK REF -->
+//
+// <-- Non-regression test for bug 12246 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=12246
+//
+// <-- Short Description -->
+// Check that an error message is returned when
+//reading invalid excel files (which have declared wrong colum/row count)
+
+xlsPath = SCI + "/modules/spreadsheet/tests/nonreg_tests/bug_12246.xls";
+[fd,SST,Sheetnames,Sheetpos] = xls_open(xlsPath);
+
+errMsg = "xls_read: Failed to read expected data, may be invalid xls file.";
+assert_checkerror("[Value,TextInd] = xls_read(fd,Sheetpos(1))", errMsg);
diff --git a/scilab/modules/spreadsheet/tests/nonreg_tests/bug_12246.xls b/scilab/modules/spreadsheet/tests/nonreg_tests/bug_12246.xls
new file mode 100644 (file)
index 0000000..399a80a
Binary files /dev/null and b/scilab/modules/spreadsheet/tests/nonreg_tests/bug_12246.xls differ