* Bug #12168 fixed - matfile_listvar crashed when listing variables of a closed MAT... 81/10181/2
Vincent COUVERT [Thu, 10 Jan 2013 16:20:42 +0000 (17:20 +0100)]
test_run("matio","bug_12168","no_check_error_output")

Change-Id: I3e63183b9fa576243dfc6d876979693d74af82d7

scilab/CHANGES_5.4.X
scilab/modules/matio/sci_gateway/c/sci_matfile_listvar.c
scilab/modules/matio/tests/nonreg_tests/bug_12168.dia.ref [new file with mode: 0644]
scilab/modules/matio/tests/nonreg_tests/bug_12168.tst [new file with mode: 0644]

index 6e727be..bd9ee4d 100644 (file)
@@ -261,6 +261,8 @@ Bug fixes
 
 * Bug #12166 fixed - There was a bad label with drawaxis.
 
+* Bug #12168 fixed - matfile_listvar crashed when listing variables of a closed MAT-file.
+
 * Bug #12179 fixed - Fix an incompatibility with MPI version of HDF5.
 
 * Bug #12184 fixed - Performances of the function 'derivat' improved.
index 992d799..8663163 100644 (file)
@@ -1,12 +1,12 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- * Copyright (C) 2008 - INRIA - Vincent COUVERT 
+ * Copyright (C) 2008 - INRIA - Vincent COUVERT
  * Copyright (C) 2010 - DIGITEO - Yann COLLETTE
- * 
+ *
  * 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-en.txt
  *
  */
 #include "strdup_Windows.h"
 #endif
 
+int sci_matfile_listvar(char *fname, unsigned long fname_len)
+{
+    int nbRow = 0, nbCol = 0;
+    mat_t *matfile = NULL;
+    matvar_t *matvar = NULL;
+    int fileIndex = 0;
+    char **varnames = NULL;
+    double *varclasses = NULL;
+    double *vartypes = NULL;
+    int nbvar = 0, var_type;
+    int * fd_addr = NULL;
+    double tmp_dbl;
+    SciErr sciErr;
+
+    CheckRhs(1, 1);
+    CheckLhs(1, 3);
 
+    /* First Rhs is the index of the file to read */
 
-#define MATIO_ERROR if(_SciErr.iErr)        \
-    {                                       \
-      printError(&_SciErr, 0);              \
-      return 0;                                     \
+    sciErr = getVarAddressFromPosition(pvApiCtx, 1, &fd_addr);
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 0;
+    }
+    sciErr = getVarType(pvApiCtx, fd_addr, &var_type);
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 0;
     }
 
-int sci_matfile_listvar(char *fname,unsigned long fname_len)
-{
-  int nbRow = 0, nbCol = 0;
-  mat_t *matfile = NULL;
-  matvar_t *matvar = NULL;
-  int fileIndex = 0;
-  char **varnames = NULL;
-  double *varclasses = NULL;
-  double *vartypes = NULL;
-  int nbvar = 0, var_type;
-  int * fd_addr = NULL;
-  double tmp_dbl;
-  SciErr _SciErr;
-  
-  CheckRhs(1, 1);
-  CheckLhs(1, 3);
-  
-  /* First Rhs is the index of the file to read */
-  
-  _SciErr = getVarAddressFromPosition(pvApiCtx, 1, &fd_addr); MATIO_ERROR;
-  _SciErr = getVarType(pvApiCtx, fd_addr, &var_type); MATIO_ERROR;
-  
-  if (var_type == sci_matrix)
+    if (var_type == sci_matrix)
     {
-      getScalarDouble(pvApiCtx, fd_addr, &tmp_dbl);
-      if (!isScalar(pvApiCtx, fd_addr))
-       {
-         Scierror(999, _("%s: Wrong size for first input argument: Single double expected.\n"), fname);
-         return FALSE;
-       }
-      fileIndex = (int)tmp_dbl;
+        getScalarDouble(pvApiCtx, fd_addr, &tmp_dbl);
+        if (!isScalar(pvApiCtx, fd_addr))
+        {
+            Scierror(999, _("%s: Wrong size for first input argument: Single double expected.\n"), fname);
+            return FALSE;
+        }
+        fileIndex = (int)tmp_dbl;
     }
-  else
+    else
     {
-      Scierror(999, _("%s: Wrong type for first input argument: Double expected.\n"), fname);
-      return FALSE;
+        Scierror(999, _("%s: Wrong type for first input argument: Double expected.\n"), fname);
+        return FALSE;
     }
-  
-  /* Gets the corresponding matfile */
-  matfile_manager(MATFILEMANAGER_GETFILE, &fileIndex, &matfile);
-  
-  /* Back to the beginning of the file */
-  if (Mat_Rewind(matfile) != 0)
+
+    /* Gets the corresponding matfile */
+    matfile_manager(MATFILEMANAGER_GETFILE, &fileIndex, &matfile);
+
+    if (matfile == NULL)
     {
-      Scierror(999, _("%s: Could not rewind the file %s.\n"), "matfile_listvar", matfile->filename);
-      return FALSE;
+        Scierror(999, _("%s: Invalid file identifier.\n"), fname);
+        return FALSE;
     }
-  
-  matvar = Mat_VarReadNext(matfile);
-  while (matvar != NULL && matvar->name != NULL)
+
+    /* Back to the beginning of the file */
+    if (Mat_Rewind(matfile) != 0)
     {
-      nbvar++;
-      varnames = (char**) REALLOC(varnames, nbvar*sizeof(char*));
-      if (varnames == NULL)
-       {
-         Scierror(999, _("%s: No more memory.\n"), "matfile_listvar");
-         return FALSE;
-       }
-      varnames[nbvar-1] = strdup(matvar->name);
-      varclasses = (double*) REALLOC(varclasses, nbvar*sizeof(double));
-      if (varnames == NULL)
-       {
-         Scierror(999, _("%s: No more memory.\n"), "matfile_listvar");
-         return FALSE;
-       }
-      varclasses[nbvar-1] = (double) matvar->class_type;
-      vartypes = (double*) REALLOC(vartypes, nbvar*sizeof(double));
-      if (varnames == NULL)
-       {
-         Scierror(999, _("%s: No more memory.\n"), "matfile_listvar");
-         return FALSE;
-       }
-      vartypes[nbvar-1] = (double) matvar->data_type;
-      
-      Mat_VarFree(matvar);
-      matvar = Mat_VarReadNext(matfile);
+        Scierror(999, _("%s: Could not rewind the file %s.\n"), "matfile_listvar", matfile->filename);
+        return FALSE;
     }
-  
-  Mat_VarFree(matvar);
-  
-  /* Return the variable names list */
-  nbRow = nbvar; nbCol = 1;
-  _SciErr = createMatrixOfString(pvApiCtx, Rhs+1, nbRow, nbCol, varnames); MATIO_ERROR;
-  LhsVar(1) = Rhs+1;
-  
-  /* Return the variable classes */
-  if (Lhs >= 2)
+
+    matvar = Mat_VarReadNext(matfile);
+    while (matvar != NULL && matvar->name != NULL)
     {
-      _SciErr = createMatrixOfDouble(pvApiCtx, Rhs+2, nbRow, nbCol, varclasses); MATIO_ERROR;
-      LhsVar(2) = Rhs+2;
+        nbvar++;
+        varnames = (char**) REALLOC(varnames, nbvar * sizeof(char*));
+        if (varnames == NULL)
+        {
+            Scierror(999, _("%s: No more memory.\n"), "matfile_listvar");
+            return FALSE;
+        }
+        varnames[nbvar - 1] = strdup(matvar->name);
+        varclasses = (double*) REALLOC(varclasses, nbvar * sizeof(double));
+        if (varnames == NULL)
+        {
+            Scierror(999, _("%s: No more memory.\n"), "matfile_listvar");
+            return FALSE;
+        }
+        varclasses[nbvar - 1] = (double) matvar->class_type;
+        vartypes = (double*) REALLOC(vartypes, nbvar * sizeof(double));
+        if (varnames == NULL)
+        {
+            Scierror(999, _("%s: No more memory.\n"), "matfile_listvar");
+            return FALSE;
+        }
+        vartypes[nbvar - 1] = (double) matvar->data_type;
+
+        Mat_VarFree(matvar);
+        matvar = Mat_VarReadNext(matfile);
     }
-  
-  /* Return the variable types */
-  if (Lhs >= 3)
+
+    Mat_VarFree(matvar);
+
+    /* Return the variable names list */
+    nbRow = nbvar;
+    nbCol = 1;
+    sciErr = createMatrixOfString(pvApiCtx, Rhs + 1, nbRow, nbCol, varnames);
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 0;
+    }
+    LhsVar(1) = Rhs + 1;
+
+    /* Return the variable classes */
+    if (Lhs >= 2)
     {
-      _SciErr = createMatrixOfDouble(pvApiCtx, Rhs+3, nbRow, nbCol, vartypes); MATIO_ERROR;
-      LhsVar(3) = Rhs+3;
+        sciErr = createMatrixOfDouble(pvApiCtx, Rhs + 2, nbRow, nbCol, varclasses);
+        if (sciErr.iErr)
+        {
+            printError(&sciErr, 0);
+            return 0;
+        }
+        LhsVar(2) = Rhs + 2;
     }
-  
-  freeArrayOfString(varnames, nbvar);
-  FREE(varclasses);
-  FREE(vartypes);
-
-  PutLhsVar();
-  
-  return TRUE;
+
+    /* Return the variable types */
+    if (Lhs >= 3)
+    {
+        sciErr = createMatrixOfDouble(pvApiCtx, Rhs + 3, nbRow, nbCol, vartypes);
+        if (sciErr.iErr)
+        {
+            printError(&sciErr, 0);
+            return 0;
+        }
+        LhsVar(3) = Rhs + 3;
+    }
+
+    freeArrayOfString(varnames, nbvar);
+    FREE(varclasses);
+    FREE(vartypes);
+
+    PutLhsVar();
+
+    return TRUE;
 }
diff --git a/scilab/modules/matio/tests/nonreg_tests/bug_12168.dia.ref b/scilab/modules/matio/tests/nonreg_tests/bug_12168.dia.ref
new file mode 100644 (file)
index 0000000..bed0857
--- /dev/null
@@ -0,0 +1,23 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Vincent COUVERT
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 12168 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=12168
+//
+// <-- Short Description -->
+// Segfault when listing a closed matfile.
+A = rand(10,10);
+testfile = fullfile(TMPDIR, "bug_12168.mat");
+savematfile(testfile, "A", "-v6");
+fd = matfile_open(testfile);
+matfile_close(fd);
+refMsg = msprintf(_("%s: Invalid file identifier.\n"), "matfile_listvar");
+assert_checkerror("matfile_listvar(fd);", refMsg);
diff --git a/scilab/modules/matio/tests/nonreg_tests/bug_12168.tst b/scilab/modules/matio/tests/nonreg_tests/bug_12168.tst
new file mode 100644 (file)
index 0000000..478def4
--- /dev/null
@@ -0,0 +1,25 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Vincent COUVERT
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 12168 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=12168
+//
+// <-- Short Description -->
+// Segfault when listing a closed matfile.
+
+
+A = rand(10,10);
+testfile = fullfile(TMPDIR, "bug_12168.mat");
+savematfile(testfile, "A", "-v6");
+fd = matfile_open(testfile);
+matfile_close(fd);
+refMsg = msprintf(_("%s: Invalid file identifier.\n"), "matfile_listvar");
+assert_checkerror("matfile_listvar(fd);", refMsg);