hdf5: fix memory leaks 38/12838/3
Antoine ELIAS [Mon, 7 Oct 2013 10:24:43 +0000 (12:24 +0200)]
Coverity ID: 1099554, 1098512, 1098911, 1098912, 1098913, 1098914, 1098915, 1098916, 1099296, 1097852, 1097853, 1098266, 1098267, 1098268, 1099030
             1099031, 1099032, 1099033, 1099034, 1099035, 1099036, 1099037, 1099038, 1098567, 1099046, 1099047, 1099252, 1098937, 1099554, 1097681
             1097682, 1098887, 1097881, 1098882, 1097675, 1097856, 1097857, 1097858, 1097859, 1097860, 1097861, 1098274, 1098275, 1098276, 1099062
             1099063, 1099064, 1099065, 1099066, 1099067, 1099068, 1099341, 1099396, 1099043, 1099044, 1099045, 1099251, 1099340

Change-Id: I22c2ed11d60e23b56941d944840636d21ae33e4a

scilab/modules/hdf5/sci_gateway/cpp/sci_export_to_hdf5.cpp
scilab/modules/hdf5/sci_gateway/cpp/sci_import_from_hdf5.cpp
scilab/modules/hdf5/sci_gateway/cpp/sci_is_hdf5_file.cpp
scilab/modules/hdf5/sci_gateway/cpp/sci_listvar_in_hdf5.cpp
scilab/modules/hdf5/src/c/h5_fileManagement.c
scilab/modules/hdf5/src/c/h5_readDataFromFile.c
scilab/modules/hdf5/src/c/h5_readDataFromFile_v1.c
scilab/modules/hdf5/src/c/h5_writeDataToFile.c
scilab/modules/hdf5/src/cpp/import_from_hdf5_v1.cpp
scilab/modules/hdf5/src/cpp/listvar_in_hdf5_v1.cpp

index 6471cc1..3fe54eb 100644 (file)
@@ -98,6 +98,8 @@ int sci_export_to_hdf5(char *fname, unsigned long fname_len)
             sciErr = getVarAddressFromName(pvApiCtx, pstNameList[i], &piAddrList[i]);
             if (sciErr.iErr)
             {
+                freeArrayOfString(pstNameList, iRhs);
+                FREE(piAddrList);
                 Scierror(999, _("%s: Wrong value for input argument #%d: Defined variable expected.\n"), fname, i + 1);
                 printError(&sciErr, 0);
                 return 1;
@@ -125,7 +127,6 @@ int sci_export_to_hdf5(char *fname, unsigned long fname_len)
 
     if (iH5File < 0)
     {
-        FREE(pstFileName);
         if (iH5File == -2)
         {
             Scierror(999, _("%s: Wrong value for input argument #%d: \"%s\" is a directory"), fname, 1, pstNameList[0]);
@@ -135,6 +136,9 @@ int sci_export_to_hdf5(char *fname, unsigned long fname_len)
             Scierror(999, _("%s: Cannot open file %s.\n"), fname, pstNameList[0]);
         }
 
+        FREE(piAddrList);
+        freeArrayOfString(pstNameList, iRhs);
+        FREE(pstFileName);
         return 1;
     }
 
@@ -146,6 +150,9 @@ int sci_export_to_hdf5(char *fname, unsigned long fname_len)
             //to update version must be the same
             closeHDF5File(iH5File);
             Scierror(999, _("%s: Wrong SOD file format version. Expected: %d Found: %d\n"), fname, SOD_FILE_VERSION, iVersion);
+            FREE(piAddrList);
+            freeArrayOfString(pstNameList, iRhs);
+            FREE(pstFileName);
             return 1;
         }
     }
@@ -166,6 +173,9 @@ int sci_export_to_hdf5(char *fname, unsigned long fname_len)
                 {
                     closeHDF5File(iH5File);
                     Scierror(999, _("%s: Unable to delete existing variable \"%s\"."), fname, pstNameList[i]);
+                    FREE(piAddrList);
+                    freeArrayOfString(pstNameList, iRhs);
+                    FREE(pstFileName);
                     return 1;
                 }
             }
@@ -173,6 +183,9 @@ int sci_export_to_hdf5(char *fname, unsigned long fname_len)
             {
                 closeHDF5File(iH5File);
                 Scierror(999, _("%s: Variable \'%s\' already exists in file \'%s\'\nUse -append option to replace existing variable\n."), fname, pstNameList[i], pstNameList[0]);
+                FREE(piAddrList);
+                freeArrayOfString(pstNameList, iRhs);
+                FREE(pstFileName);
                 return 1;
             }
         }
@@ -191,6 +204,9 @@ int sci_export_to_hdf5(char *fname, unsigned long fname_len)
         {
             closeHDF5File(iH5File);
             Scierror(999, _("%s: Unable to update Scilab version in \"%s\"."), fname, pstNameList[0]);
+            FREE(piAddrList);
+            freeArrayOfString(pstNameList, iRhs);
+            FREE(pstFileName);
             return 1;
         }
 
@@ -198,6 +214,9 @@ int sci_export_to_hdf5(char *fname, unsigned long fname_len)
         {
             closeHDF5File(iH5File);
             Scierror(999, _("%s: Unable to update HDF5 format version in \"%s\"."), fname, pstNameList[0]);
+            FREE(piAddrList);
+            freeArrayOfString(pstNameList, iRhs);
+            FREE(pstFileName);
             return 1;
         }
     }
@@ -211,7 +230,10 @@ int sci_export_to_hdf5(char *fname, unsigned long fname_len)
         //remove file
         deleteafile(pstFileName);
     }
+
     FREE(pstFileName);
+    freeArrayOfString(pstNameList, iRhs);
+    FREE(piAddrList);
 
     //create boolean return value
     int *piReturn = NULL;
@@ -231,16 +253,6 @@ int sci_export_to_hdf5(char *fname, unsigned long fname_len)
         piReturn[0] = 0;
     }
 
-
-    //free memory
-    for (int i = 0 ; i < iRhs ; i++)
-    {
-        FREE(pstNameList[i]);
-    }
-    FREE(pstNameList);
-
-    FREE(piAddrList);
-
     LhsVar(1) = iRhs + 1;
     PutLhsVar();
     return 0;
@@ -355,8 +367,8 @@ static bool export_void(int _iH5File, int *_piVar, char* _pstName)
         return false;
     }
 
-    char pstMsg[] = "void";
-    print_type(pstMsg);
+    //char pstMsg[] = "void";
+    //print_type(pstMsg);
     return true;
 }
 
@@ -368,8 +380,8 @@ static bool export_undefined(int _iH5File, int *_piVar, char* _pstName)
         return false;
     }
 
-    char pstMsg[] = "void";
-    print_type(pstMsg);
+    //char pstMsg[] = "void";
+    //print_type(pstMsg);
     return true;
 }
 
@@ -389,9 +401,9 @@ static bool export_list(int _iH5File, int *_piVar, char* _pstName, int _iVarType
     //create groupe name
     char* pstGroupName = createGroupName(_pstName);
 
-    char pstMsg[256];
-    sprintf(pstMsg, "list (%d)", iItemNumber);
-    print_type(pstMsg);
+    //char pstMsg[256];
+    //sprintf(pstMsg, "list (%d)", iItemNumber);
+    //print_type(pstMsg);
 
     iLevel++;
     //open list
@@ -475,9 +487,9 @@ static bool export_double(int _iH5File, int *_piVar, char* _pstName)
         return false;
     }
 
-    char pstMsg[512];
-    sprintf(pstMsg, "double (%d x %d)", piDims[0], piDims[1]);
-    print_type(pstMsg);
+    //char pstMsg[512];
+    //sprintf(pstMsg, "double (%d x %d)", piDims[0], piDims[1]);
+    //print_type(pstMsg);
     return true;
 }
 
@@ -491,8 +503,6 @@ static bool export_poly(int _iH5File, int *_piVar, char* _pstName)
     int iVarNameLen = 0;
     int piDims[2];
 
-
-
     SciErr sciErr = getPolyVariableName(pvApiCtx, _piVar, pstVarName, &iVarNameLen);
     if (sciErr.iErr)
     {
@@ -502,67 +512,25 @@ static bool export_poly(int _iH5File, int *_piVar, char* _pstName)
 
     if (isVarComplex(pvApiCtx, _piVar))
     {
-        sciErr = getComplexMatrixOfPoly(pvApiCtx, _piVar, &piDims[0], &piDims[1], NULL, NULL, NULL);
-        if (sciErr.iErr)
+        if (getAllocatedMatrixOfComplexPoly(pvApiCtx, _piVar, &piDims[0], &piDims[1], &piNbCoef, &pdblReal, &pdblImg))
         {
-            printError(&sciErr, 0);
-            return false;
-        }
-
-        piNbCoef = (int*)MALLOC(piDims[0] * piDims[1] * sizeof(int));
-        sciErr = getComplexMatrixOfPoly(pvApiCtx, _piVar, &piDims[0], &piDims[1], piNbCoef, NULL, NULL);
-        if (sciErr.iErr)
-        {
-            printError(&sciErr, 0);
-            return false;
-        }
-
-        pdblReal = (double**)MALLOC(sizeof(double*) * piDims[0] * piDims[1]);
-        pdblImg = (double**)MALLOC(sizeof(double*) * piDims[0] * piDims[1]);
-        for (int i = 0 ; i < piDims[0] * piDims[1] ; i++)
-        {
-            pdblReal[i] = (double*)MALLOC(sizeof(double) * piNbCoef[i]);// for null termination
-            pdblImg[i] = (double*)MALLOC(sizeof(double) * piNbCoef[i]);// for null termination
-        }
-        sciErr = getComplexMatrixOfPoly(pvApiCtx, _piVar, &piDims[0], &piDims[1], piNbCoef, pdblReal, pdblImg);
-        if (sciErr.iErr)
-        {
-            printError(&sciErr, 0);
+            freeAllocatedMatrixOfComplexPoly(piDims[0], piDims[1], piNbCoef, pdblReal, pdblImg);
             return false;
         }
 
         iRet = writePolyComplexMatrix(_iH5File, _pstName, pstVarName, 2, piDims, piNbCoef, pdblReal, pdblImg);
+        freeAllocatedMatrixOfComplexPoly(piDims[0], piDims[1], piNbCoef, pdblReal, pdblImg);
     }
     else
     {
-        sciErr = getMatrixOfPoly(pvApiCtx, _piVar, &piDims[0], &piDims[1], NULL, NULL);
-        if (sciErr.iErr)
+        if (getAllocatedMatrixOfPoly(pvApiCtx, _piVar, &piDims[0], &piDims[1], &piNbCoef, &pdblReal))
         {
-            printError(&sciErr, 0);
-            return false;
-        }
-
-        piNbCoef = (int*)MALLOC(piDims[0] * piDims[1] * sizeof(int));
-        sciErr = getMatrixOfPoly(pvApiCtx, _piVar, &piDims[0], &piDims[1], piNbCoef, NULL);
-        if (sciErr.iErr)
-        {
-            printError(&sciErr, 0);
-            return false;
-        }
-
-        pdblReal = (double**)MALLOC(sizeof(double*) * piDims[0] * piDims[1]);
-        for (int i = 0 ; i < piDims[0] * piDims[1] ; i++)
-        {
-            pdblReal[i] = (double*)MALLOC(sizeof(double) * piNbCoef[i]);// for null termination
-        }
-        sciErr = getMatrixOfPoly(pvApiCtx, _piVar, &piDims[0], &piDims[1], piNbCoef, pdblReal);
-        if (sciErr.iErr)
-        {
-            printError(&sciErr, 0);
+            freeAllocatedMatrixOfPoly(piDims[0], piDims[1], piNbCoef, pdblReal);
             return false;
         }
 
         iRet = writePolyMatrix(_iH5File, _pstName, pstVarName, 2, piDims, piNbCoef, pdblReal);
+        freeAllocatedMatrixOfPoly(piDims[0], piDims[1], piNbCoef, pdblReal);
     }
 
     if (iRet)
@@ -570,29 +538,9 @@ static bool export_poly(int _iH5File, int *_piVar, char* _pstName)
         return false;
     }
 
-    char pstMsg[512];
-    sprintf(pstMsg, "poly (%d x %d)", piDims[0], piDims[1]);
-    print_type(pstMsg);
-
-    if (pdblReal)
-    {
-        for (int i = 0 ; i < piDims[0] * piDims[1] ; i++)
-        {
-            FREE(pdblReal[i]);
-        }
-        FREE(pdblReal);
-    }
-
-    if (pdblImg)
-    {
-        for (int i = 0 ; i < piDims[0] * piDims[1] ; i++)
-        {
-            FREE(pdblImg[i]);
-        }
-        FREE(pdblImg);
-    }
-
-    FREE(piNbCoef);
+    //char pstMsg[512];
+    //sprintf(pstMsg, "poly (%d x %d)", piDims[0], piDims[1]);
+    //print_type(pstMsg);
     return true;
 }
 
@@ -616,9 +564,9 @@ static bool export_boolean(int _iH5File, int *_piVar, char* _pstName)
         return false;
     }
 
-    char pstMsg[512];
-    sprintf(pstMsg, "bool (%d x %d)", piDims[0], piDims[1]);
-    print_type(pstMsg);
+    //char pstMsg[512];
+    //sprintf(pstMsg, "bool (%d x %d)", piDims[0], piDims[1]);
+    //print_type(pstMsg);
     return true;
 }
 
@@ -644,9 +592,9 @@ static bool export_boolean_sparse(int _iH5File, int *_piVar, char* _pstName)
         return false;
     }
 
-    char pstMsg[512];
-    sprintf(pstMsg, "boolean sparse (%d x %d)", piDims[0], piDims[1]);
-    print_type(pstMsg);
+    //char pstMsg[512];
+    //sprintf(pstMsg, "boolean sparse (%d x %d)", piDims[0], piDims[1]);
+    //print_type(pstMsg);
     return true;
 }
 
@@ -689,15 +637,15 @@ static bool export_sparse(int _iH5File, int *_piVar, char* _pstName)
         return false;
     }
 
-    char pstMsg[512];
-    sprintf(pstMsg, "sparse (%d x %d)", piDims[0], piDims[1]);
-    print_type(pstMsg);
+    //char pstMsg[512];
+    //sprintf(pstMsg, "sparse (%d x %d)", piDims[0], piDims[1]);
+    //print_type(pstMsg);
     return true;
 }
 
 static bool export_matlab_sparse(int *_piVar, char* _pstName)
 {
-    print_type(_pstName);
+    //print_type(_pstName);
     return false;
 }
 
@@ -799,22 +747,21 @@ static bool export_ints(int _iH5File, int *_piVar, char* _pstName)
         return false;
     }
 
-    char pstMsg[512];
-    sprintf(pstMsg, "int%d (%d x %d)", 8 * iPrec, piDims[0], piDims[1]);
-    print_type(pstMsg);
+    //char pstMsg[512];
+    //sprintf(pstMsg, "int%d (%d x %d)", 8 * iPrec, piDims[0], piDims[1]);
+    //print_type(pstMsg);
     return true;
 }
 
 static bool export_handles(int *_piVar, char* _pstName)
 {
-    print_type(_pstName);
+    //print_type(_pstName);
     return false;
 }
 
 static bool export_strings(int _iH5File, int *_piVar, char* _pstName)
 {
     int iRet = 0;
-    int* piLen = NULL;
     char** pstData = NULL;
     int piDims[2];
 
@@ -825,63 +772,51 @@ static bool export_strings(int _iH5File, int *_piVar, char* _pstName)
         return false;
     }
 
-    piLen = (int*)MALLOC(piDims[0] * piDims[1] * sizeof(int));
-    sciErr = getMatrixOfString(pvApiCtx, _piVar, &piDims[0], &piDims[1], piLen, NULL);
-    if (sciErr.iErr)
-    {
-        printError(&sciErr, 0);
-        return false;
-    }
-
-    pstData = (char**)MALLOC(sizeof(char*) * piDims[0] * piDims[1]);
-    for (int i = 0 ; i < piDims[0] * piDims[1] ; i++)
+    if (getAllocatedMatrixOfString(pvApiCtx, _piVar, &piDims[0], &piDims[1], &pstData))
     {
-        pstData[i] = (char*)MALLOC(sizeof(char) * (piLen[i] + 1));// for null termination
-    }
+        if (pstData)
+        {
+            freeAllocatedMatrixOfString(piDims[0], piDims[1], pstData);
+        }
 
-    sciErr = getMatrixOfString(pvApiCtx, _piVar, &piDims[0], &piDims[1], piLen, pstData);
-    if (sciErr.iErr)
-    {
-        printError(&sciErr, 0);
         return false;
     }
 
     iRet = writeStringMatrix(_iH5File, _pstName, 2, piDims, pstData);
-
+    freeAllocatedMatrixOfString(piDims[0], piDims[1], pstData);
     if (iRet)
     {
         return false;
     }
 
-    char pstMsg[512];
-    sprintf(pstMsg, "string (%d x %d)", piDims[0], piDims[1]);
-    print_type(pstMsg);
+    //char pstMsg[512];
+    //sprintf(pstMsg, "string (%d x %d)", piDims[0], piDims[1]);
+    //print_type(pstMsg);
 
-    freeArrayOfString(pstData, piDims[0] * piDims[1]);
     return true;
 }
 
 static bool export_u_function(int *_piVar, char* _pstName)
 {
-    print_type(_pstName);
+    //print_type(_pstName);
     return false;
 }
 
 static bool export_c_function(int *_piVar, char* _pstName)
 {
-    print_type(_pstName);
+    //print_type(_pstName);
     return false;
 }
 
 static bool export_lib(int *_piVar, char* _pstName)
 {
-    print_type(_pstName);
+    //print_type(_pstName);
     return false;
 }
 
 static bool export_lufact_pointer(int *_piVar, char* _pstName)
 {
-    print_type(_pstName);
+    /*print_type*/(_pstName);
     return false;
 }
 
@@ -940,11 +875,9 @@ static bool isVarExist(int _iFile, char* _pstVarName)
             {
                 return true;
             }
-
-            FREE(pstVarNameList[i]);
         }
 
-        FREE(pstVarNameList);
+        freeArrayOfString(pstVarNameList, iNbItem);
     }
 
     return false;
index 6aede85..d392b2a 100644 (file)
@@ -27,6 +27,7 @@ extern "C"
 #include "intmacr2tree.h"
 #include "expandPathVariable.h"
 #include "stdlib.h"
+#include "freeArrayOfString.h"
 }
 
 #include "import_from_hdf5_v1.hxx"
@@ -67,6 +68,11 @@ int sci_import_from_hdf5(char *fname, unsigned long fname_len)
 
     if (getAllocatedSingleString(pvApiCtx, piAddr, &pstFilename))
     {
+        if (pstFilename)
+        {
+            freeAllocatedSingleString(pstFilename);
+        }
+
         Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), fname, 2);
         return 1;
     }
@@ -121,6 +127,11 @@ int sci_import_from_hdf5(char *fname, unsigned long fname_len)
 
             if (getAllocatedSingleString(pvApiCtx, piAddr, &pstVarName))
             {
+                if (pstVarName)
+                {
+                    freeAllocatedSingleString(pstVarName);
+                }
+
                 Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), fname, i + 1);
                 return 1;
             }
@@ -154,6 +165,8 @@ int sci_import_from_hdf5(char *fname, unsigned long fname_len)
                     break;
                 }
             }
+
+            freeArrayOfString(pstVarNameList, iNbItem);
         }
     }
     //close the file
@@ -374,6 +387,9 @@ static bool import_double(int _iDatasetId, int _iItemPos, int *_piAddress, char
         iDims = 2;
         piDims = (int*)MALLOC(sizeof(int) * iDims);
         memset(piDims, 0, sizeof(int) * iDims);
+        pdblReal = (double*)MALLOC(sizeof(double) * 1);
+        pdblReal[0] = 0;
+        iComplex = 0;
     }
 
     if (_piAddress == NULL)
@@ -399,25 +415,16 @@ static bool import_double(int _iDatasetId, int _iItemPos, int *_piAddress, char
         }
     }
 
-    if (sciErr.iErr)
-    {
-        printError(&sciErr, 0);
-        return false;
-    }
-
     FREE(piDims);
-    if (pdblReal)
-    {
-        FREE(pdblReal);
-    }
-
-    if (pdblImg)
+    FREE(pdblReal);
+    if (iComplex)
     {
         FREE(pdblImg);
     }
 
-    if (iRet)
+    if (sciErr.iErr)
     {
+        printError(&sciErr, 0);
         return false;
     }
 
@@ -499,6 +506,7 @@ static bool import_integer(int _iDatasetId, int _iItemPos, int *_piAddress, char
     iRet = getDatasetPrecision(_iDatasetId, &iPrec);
     if (iRet)
     {
+        FREE(piDims);
         return false;
     }
 
@@ -512,6 +520,7 @@ static bool import_integer(int _iDatasetId, int _iItemPos, int *_piAddress, char
             iRet = readInteger8Matrix(_iDatasetId, pcData);
             if (iRet)
             {
+                FREE(piDims);
                 return false;
             }
 
@@ -533,6 +542,7 @@ static bool import_integer(int _iDatasetId, int _iItemPos, int *_piAddress, char
             iRet = readUnsignedInteger8Matrix(_iDatasetId, pucData);
             if (iRet)
             {
+                FREE(piDims);
                 return false;
             }
 
@@ -554,6 +564,7 @@ static bool import_integer(int _iDatasetId, int _iItemPos, int *_piAddress, char
             iRet = readInteger16Matrix(_iDatasetId, psData);
             if (iRet)
             {
+                FREE(piDims);
                 return false;
             }
 
@@ -575,6 +586,7 @@ static bool import_integer(int _iDatasetId, int _iItemPos, int *_piAddress, char
             iRet = readUnsignedInteger16Matrix(_iDatasetId, pusData);
             if (iRet)
             {
+                FREE(piDims);
                 return false;
             }
 
@@ -596,6 +608,7 @@ static bool import_integer(int _iDatasetId, int _iItemPos, int *_piAddress, char
             iRet = readInteger32Matrix(_iDatasetId, piData);
             if (iRet)
             {
+                FREE(piDims);
                 return false;
             }
 
@@ -617,6 +630,7 @@ static bool import_integer(int _iDatasetId, int _iItemPos, int *_piAddress, char
             iRet = readUnsignedInteger32Matrix(_iDatasetId, puiData);
             if (iRet)
             {
+                FREE(piDims);
                 return false;
             }
 
@@ -639,6 +653,7 @@ static bool import_integer(int _iDatasetId, int _iItemPos, int *_piAddress, char
             iRet = readInteger64Matrix(_iDatasetId, pllData);
             if (iRet)
             {
+                FREE(piDims);
                 return false;
             }
 
@@ -664,6 +679,7 @@ static bool import_integer(int _iDatasetId, int _iItemPos, int *_piAddress, char
             iRet = readUnsignedInteger64Matrix(_iDatasetId, pullData);
             if (iRet)
             {
+                FREE(piDims);
                 return false;
             }
 
@@ -684,6 +700,8 @@ static bool import_integer(int _iDatasetId, int _iItemPos, int *_piAddress, char
             return false;
     }
 
+    FREE(piDims);
+
     if (sciErr.iErr)
     {
         printError(&sciErr, 0);
@@ -712,16 +730,19 @@ static bool import_boolean(int _iDatasetId, int _iItemPos, int *_piAddress, char
     piDims = (int*)MALLOC(sizeof(int) * iDims);
     iSize = getDatasetInfo(_iDatasetId, &iComplex, &iDims, piDims);
 
-    if (iSize != 0)
+    if (iSize == 0)
     {
-        piData = (int *)MALLOC(iSize * sizeof(int));
-        iRet = readBooleanMatrix(_iDatasetId, piData);
-        if (iRet)
-        {
-            FREE(piData);
-            FREE(piDims);
-            return false;
-        }
+        FREE(piDims);
+        return false;
+    }
+
+    piData = (int *)MALLOC(iSize * sizeof(int));
+    iRet = readBooleanMatrix(_iDatasetId, piData);
+    if (iRet)
+    {
+        FREE(piData);
+        FREE(piDims);
+        return false;
     }
 
     if (_piAddress == NULL)
@@ -733,25 +754,15 @@ static bool import_boolean(int _iDatasetId, int _iItemPos, int *_piAddress, char
         sciErr = createMatrixOfBooleanInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, piDims[0], piDims[1], piData);
     }
 
-    if (sciErr.iErr)
-    {
-        printError(&sciErr, 0);
-        FREE(piDims);
-        if (piData)
-        {
-            FREE(piData);
-        }
-        return false;
-    }
-
     FREE(piDims);
     if (piData)
     {
         FREE(piData);
     }
 
-    if (iRet)
+    if (sciErr.iErr)
     {
+        printError(&sciErr, 0);
         return false;
     }
 
@@ -796,6 +807,23 @@ static bool import_poly(int _iDatasetId, int _iItemPos, int *_piAddress, char *_
 
     if (iRet)
     {
+        FREE(piDims);
+        FREE(piNbCoef);
+        for (int i = 0; i < iSize; i++)
+        {
+            FREE(pdblReal[i]);
+        }
+        FREE(pdblReal);
+
+        if (iComplex)
+        {
+            for (int i = 0; i < iSize; i++)
+            {
+                FREE(pdblImg[i]);
+            }
+            FREE(pdblImg);
+        }
+
         return false;
     }
 
@@ -824,18 +852,14 @@ static bool import_poly(int _iDatasetId, int _iItemPos, int *_piAddress, char *_
         }
     }
 
-    if (sciErr.iErr)
-    {
-        printError(&sciErr, 0);
-        return false;
-    }
-
+    FREE(piDims);
+    FREE(piNbCoef);
     for (int i = 0; i < iSize; i++)
     {
         FREE(pdblReal[i]);
     }
-    FREE(pdblReal);
 
+    FREE(pdblReal);
 
     if (iComplex)
     {
@@ -843,10 +867,16 @@ static bool import_poly(int _iDatasetId, int _iItemPos, int *_piAddress, char *_
         {
             FREE(pdblImg[i]);
         }
+
         FREE(pdblImg);
     }
 
-    FREE(piNbCoef);
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return false;
+    }
+
     return true;
 }
 
@@ -889,6 +919,14 @@ static bool import_sparse(int _iDatasetId, int _iItemPos, int *_piAddress, char
 
     if (iRet)
     {
+        FREE(piNbItemRow);
+        FREE(piColPos);
+        FREE(pdblReal);
+        if (iComplex)
+        {
+            FREE(pdblImg);
+        }
+
         return false;
     }
 
@@ -903,27 +941,18 @@ static bool import_sparse(int _iDatasetId, int _iItemPos, int *_piAddress, char
             sciErr = createNamedSparseMatrix(pvApiCtx, _pstVarname, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal);
         }
     }
-    else                        //if not null this variable is in a list
+    else //if not null this variable is in a list
     {
         if (iComplex)
         {
-            sciErr =
-                createComplexSparseMatrixInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, iNbItem, piNbItemRow, piColPos,
-                        pdblReal, pdblImg);
+            sciErr = createComplexSparseMatrixInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal, pdblImg);
         }
         else
         {
-            sciErr =
-                createSparseMatrixInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal);
+            sciErr = createSparseMatrixInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, iNbItem, piNbItemRow, piColPos, pdblReal);
         }
     }
 
-    if (sciErr.iErr)
-    {
-        printError(&sciErr, 0);
-        return false;
-    }
-
     FREE(piNbItemRow);
     FREE(piColPos);
     FREE(pdblReal);
@@ -932,8 +961,9 @@ static bool import_sparse(int _iDatasetId, int _iItemPos, int *_piAddress, char
         FREE(pdblImg);
     }
 
-    if (iRet)
+    if (sciErr.iErr)
     {
+        printError(&sciErr, 0);
         return false;
     }
 
@@ -962,6 +992,7 @@ static bool import_boolean_sparse(int _iDatasetId, int _iItemPos, int *_piAddres
     iRet = readBooleanSparseMatrix(_iDatasetId, iRows, iCols, iNbItem, piNbItemRow, piColPos);
     if (iRet)
     {
+        FREE(piNbItemRow);
         return false;
     }
 
@@ -974,20 +1005,12 @@ static bool import_boolean_sparse(int _iDatasetId, int _iItemPos, int *_piAddres
         sciErr = createBooleanSparseMatrixInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, iNbItem, piNbItemRow, piColPos);
     }
 
-    if (sciErr.iErr)
-    {
-        printError(&sciErr, 0);
-        return false;
-    }
-
     FREE(piNbItemRow);
-    if (piColPos)
-    {
-        FREE(piColPos);
-    }
+    FREE(piColPos);
 
-    if (iRet)
+    if (sciErr.iErr)
     {
+        printError(&sciErr, 0);
         return false;
     }
 
index 160be81..9a4ef5f 100644 (file)
@@ -45,6 +45,7 @@ int sci_is_hdf5_file(char *fname, unsigned long fname_len)
 
     if (getAllocatedSingleString(pvApiCtx, piAddr, &pstFile))
     {
+        freeAllocatedSingleString(pstFile);
         Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), fname, 1);
         return 1;
     }
@@ -60,7 +61,7 @@ int sci_is_hdf5_file(char *fname, unsigned long fname_len)
     }
 
     FREE(pstFileName);
-    FREE(pstFile);
+    freeAllocatedSingleString(pstFile);
     AssignOutputVariable(pvApiCtx, 1) = nbIn + 1;
     ReturnArguments(pvApiCtx);
     return 0;
index 1a3dec2..8cb9bed 100644 (file)
@@ -25,6 +25,7 @@ extern "C"
 #include "h5_readDataFromFile.h"
 #include "h5_attributeConstants.h"
 #include "expandPathVariable.h"
+#include "freeArrayOfString.h"
 }
 
 #include "listvar_in_hdf5_v1.hxx"
@@ -82,6 +83,11 @@ int sci_listvar_in_hdf5(char *fname, unsigned long fname_len)
 
     if (getAllocatedSingleString(pvApiCtx, piAddr, &pstFile))
     {
+        if (pstFile)
+        {
+            FREE(pstFile);
+        }
+
         Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), fname, 1);
         return 1;
     }
@@ -143,8 +149,7 @@ int sci_listvar_in_hdf5(char *fname, unsigned long fname_len)
                 break;
             }
 
-            strcpy(pInfo[i].varName, pstVarNameList[i]);
-            FREE(pstVarNameList[i]);
+            strncpy(pInfo[i].varName, pstVarNameList[i], sizeof(pInfo[i].varName));
             pInfo[i].iSize = 0;
             b = read_data(iDataSetId, 0, NULL, &pInfo[i]) == false;
             if (b)
@@ -158,7 +163,7 @@ int sci_listvar_in_hdf5(char *fname, unsigned long fname_len)
             }
         }
 
-        FREE(pstVarNameList);
+        freeArrayOfString(pstVarNameList, iNbItem);
     }
     else
     {
@@ -186,6 +191,7 @@ int sci_listvar_in_hdf5(char *fname, unsigned long fname_len)
     FREE(pstVarName);
     if (sciErr.iErr)
     {
+        FREE(pInfo);
         printError(&sciErr, 0);
         return 1;
     }
@@ -200,6 +206,7 @@ int sci_listvar_in_hdf5(char *fname, unsigned long fname_len)
         if (sciErr.iErr)
         {
             printError(&sciErr, 0);
+            FREE(pInfo);
             return 1;
         }
 
@@ -231,7 +238,7 @@ int sci_listvar_in_hdf5(char *fname, unsigned long fname_len)
         if (Lhs > 3)
         {
             //4th Lhs
-            double* pdblSize;
+            double* pdblSize = NULL;
             sciErr = allocMatrixOfDouble(pvApiCtx, nbIn + 4, iNbItem, 1, &pdblSize);
             for (int i = 0 ; i < iNbItem ; i++)
             {
index a936f14..87acd46 100644 (file)
@@ -132,21 +132,9 @@ int openHDF5File(char *name, int _iAppendMode)
 
     scichdir(currentpath);
 
-    if (currentpath)
-    {
-        FREE(currentpath);
-        currentpath = NULL;
-    }
-    if (filename)
-    {
-        FREE(filename);
-        filename = NULL;
-    }
-    if (pathdest)
-    {
-        FREE(pathdest);
-        pathdest = NULL;
-    }
+    FREE(currentpath);
+    FREE(filename);
+    FREE(pathdest);
 
     return file;
 }
index eb9165e..a0f21a5 100644 (file)
@@ -420,8 +420,14 @@ void closeDataSet(int _id)
 {
     if (_id > 0)
     {
-        H5Dclose(_id);
+        herr_t status = H5Dclose(_id);
+        if (status < 0)
+        {
+            return;
+        }
     }
+
+    return;
 }
 
 int getDataSetId(int _iFile)
index 6053381..7851eb5 100644 (file)
@@ -161,6 +161,7 @@ static char* readAttribute_v1(int _iDatasetId, const char *_pstName)
         status = H5Tset_size(memtype, iDim);
         if (status < 0)
         {
+            FREE(pstValue);
             return NULL;
         }
 
@@ -367,8 +368,14 @@ void closeDataSet_v1(int _id)
 {
     if (_id > 0)
     {
-        H5Dclose(_id);
+        herr_t status = H5Dclose(_id);
+        if (status < 0)
+        {
+            return;
+        }
     }
+
+    return;
 }
 
 int getDataSetId_v1(int _iFile)
index 62a4b89..cefc9ad 100644 (file)
@@ -1738,7 +1738,7 @@ int closeList(int _iFile, void *_pvList, char *_pstListName, int _iNbItem, int _
     {
         //Create dataspace.  Setting maximum size to NULL sets the maximum size to be the current size.
         space = H5Screate_simple(1, dims, NULL);
-        if (status < 0)
+        if (space < 0)
         {
             return -1;
         }
@@ -1837,7 +1837,14 @@ static int deleteHDF5group(int _iFile, char* _pstName)
 
             if (status < 0)
             {
-                return 1;
+                int j = 0;
+                for (j = i + 1; j < groupInfo.nlinks ; j++)
+                {
+                    FREE(pstChildName[j]);
+                }
+
+                FREE(pstChildName);
+                return -1;
             }
         }
 
index 93af618..630e388 100644 (file)
@@ -26,6 +26,7 @@ extern "C"
 #include "h5_attributeConstants.h"
 #include "intmacr2tree.h"
 #include "expandPathVariable.h"
+#include "freeArrayOfString.h"
 }
 
 //#define PRINT_DEBUG
@@ -60,8 +61,8 @@ int sci_import_from_hdf5_v1(char *fname, unsigned long fname_len)
 
     int iSelectedVar = Rhs - 1;
 
-    checkInputArgumentAtLeast(pvApiCtx, 1);
-    CheckLhs(1, 1);
+    CheckInputArgumentAtLeast(pvApiCtx, 1);
+    CheckOutputArgument(pvApiCtx, 1, 1);
 
     iCloseList = 0;
 
@@ -74,6 +75,11 @@ int sci_import_from_hdf5_v1(char *fname, unsigned long fname_len)
 
     if (getAllocatedSingleString(pvApiCtx, piAddr, &pstFilename))
     {
+        if (pstFilename)
+        {
+            FREE(pstFilename);
+        }
+
         Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), fname, 2);
         return 1;
     }
@@ -107,6 +113,11 @@ int sci_import_from_hdf5_v1(char *fname, unsigned long fname_len)
 
             if (getAllocatedSingleString(pvApiCtx, piAddr, &pstVarName))
             {
+                if (pstVarName)
+                {
+                    FREE(pstVarName);
+                }
+
                 Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), fname, i + 1);
                 return 1;
             }
@@ -140,6 +151,8 @@ int sci_import_from_hdf5_v1(char *fname, unsigned long fname_len)
                     break;
                 }
             }
+
+            freeArrayOfString(pstVarNameList, iNbItem);
         }
     }
     //close the file
@@ -341,6 +354,12 @@ static bool import_double_v1(int _iDatasetId, int _iItemPos, int *_piAddress, ch
 
         if (iRet)
         {
+            FREE(pdblReal);
+            if (iComplex)
+            {
+                FREE(pdblImg);
+            }
+
             return false;
         }
     }
@@ -352,6 +371,10 @@ static bool import_double_v1(int _iDatasetId, int _iItemPos, int *_piAddress, ch
         {
             return false;
         }
+
+        pdblReal = (double*)MALLOC(sizeof(double) * 1);
+        pdblReal[0] = 0;
+        iComplex = 0;
     }
 
     if (_piAddress == NULL)
@@ -377,6 +400,12 @@ static bool import_double_v1(int _iDatasetId, int _iItemPos, int *_piAddress, ch
         }
     }
 
+    FREE(pdblReal);
+    if (iComplex)
+    {
+        FREE(pdblImg);
+    }
+
     if (sciErr.iErr)
     {
         printError(&sciErr, 0);
@@ -390,21 +419,6 @@ static bool import_double_v1(int _iDatasetId, int _iItemPos, int *_piAddress, ch
     print_tree(pstMsg);
 #endif
 
-    if (pdblReal)
-    {
-        FREE(pdblReal);
-    }
-
-    if (pdblImg)
-    {
-        FREE(pdblImg);
-    }
-
-    if (iRet)
-    {
-        return false;
-    }
-
 #ifdef TIME_DEBUG
     QueryPerformanceCounter(&iEnd);
     double dblTime = ((iEnd.QuadPart - iStart.QuadPart) * 1000.0) / iFreq.QuadPart;
@@ -437,6 +451,7 @@ static bool import_string_v1(int _iDatasetId, int _iItemPos, int *_piAddress, ch
     }
 
     pstData = (char **)MALLOC(iRows * iCols * sizeof(char *));
+    memset(pstData, 0x00, iRows * iCols * sizeof(char *));
 
 #ifdef TIME_DEBUG
     QueryPerformanceCounter(&iStart1);
@@ -445,6 +460,7 @@ static bool import_string_v1(int _iDatasetId, int _iItemPos, int *_piAddress, ch
     iRet = readStringMatrix_v1(_iDatasetId, iRows, iCols, pstData);
     if (iRet)
     {
+        freeArrayOfString(pstData, iRows * iCols);
         return false;
     }
 
@@ -464,6 +480,7 @@ static bool import_string_v1(int _iDatasetId, int _iItemPos, int *_piAddress, ch
         sciErr = createMatrixOfStringInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, pstData);
     }
 
+    freeArrayOfString(pstData, iRows * iCols);
     if (sciErr.iErr)
     {
         printError(&sciErr, 0);
@@ -480,16 +497,6 @@ static bool import_string_v1(int _iDatasetId, int _iItemPos, int *_piAddress, ch
     sprintf(pstMsg, "string_%d (%d x %d)", _iItemPos, iRows, iCols);
     print_tree(pstMsg);
 #endif
-    for (i = 0; i < iRows * iCols; i++)
-    {
-        FREE(pstData[i]);
-    }
-    FREE(pstData);
-
-    if (iRet)
-    {
-        return false;
-    }
 
 #ifdef TIME_DEBUG
     QueryPerformanceCounter(&iEnd3);
@@ -739,14 +746,16 @@ static bool import_boolean_v1(int _iDatasetId, int _iItemPos, int *_piAddress, c
         return false;
     }
 
-    if (iRows * iCols != 0)
+    if (iRows * iCols == 0)
     {
-        piData = (int *)MALLOC(iRows * iCols * sizeof(int));
-        iRet = readBooleanMatrix_v1(_iDatasetId, iRows, iCols, piData);
-        if (iRet)
-        {
-            return false;
-        }
+        return false;
+    }
+    piData = (int *)MALLOC(iRows * iCols * sizeof(int));
+    iRet = readBooleanMatrix_v1(_iDatasetId, iRows, iCols, piData);
+    if (iRet)
+    {
+        FREE(piData);
+        return false;
     }
 
     if (_piAddress == NULL)
@@ -758,6 +767,7 @@ static bool import_boolean_v1(int _iDatasetId, int _iItemPos, int *_piAddress, c
         sciErr = createMatrixOfBooleanInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, piData);
     }
 
+    FREE(piData);
     if (sciErr.iErr)
     {
         printError(&sciErr, 0);
@@ -770,24 +780,12 @@ static bool import_boolean_v1(int _iDatasetId, int _iItemPos, int *_piAddress, c
     sprintf(pstMsg, "boolean_%d (%d x %d)", _iItemPos, iRows, iCols);
     print_tree(pstMsg);
 #endif
-
-    if (piData)
-    {
-        FREE(piData);
-    }
-
-    if (iRet)
-    {
-        return false;
-    }
-
     return true;
 }
 
 static bool import_poly_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname)
 {
     int iRet = 0;
-    int i = 0;
     int iRows = 0;
     int iCols = 0;
     int iComplex = 0;
@@ -821,6 +819,24 @@ static bool import_poly_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char
 
     if (iRet)
     {
+        FREE(piNbCoef);
+        for (int i = 0; i < iRows * iCols; i++)
+        {
+            FREE(pdblReal[i]);
+        }
+
+        FREE(pdblReal);
+
+        if (iComplex)
+        {
+            for (int i = 0; i < iRows * iCols; i++)
+            {
+                FREE(pdblImg[i]);
+            }
+
+            FREE(pdblImg);
+        }
+
         return false;
     }
 
@@ -849,6 +865,24 @@ static bool import_poly_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char
         }
     }
 
+    FREE(piNbCoef);
+    for (int i = 0; i < iRows * iCols; i++)
+    {
+        FREE(pdblReal[i]);
+    }
+
+    FREE(pdblReal);
+
+    if (iComplex)
+    {
+        for (int i = 0; i < iRows * iCols; i++)
+        {
+            FREE(pdblImg[i]);
+        }
+
+        FREE(pdblImg);
+    }
+
     if (sciErr.iErr)
     {
         printError(&sciErr, 0);
@@ -862,18 +896,6 @@ static bool import_poly_v1(int _iDatasetId, int _iItemPos, int *_piAddress, char
     print_tree(pstMsg);
 #endif
 
-    for (i = 0; i < iRows * iCols; i++)
-    {
-        FREE(pdblReal[i]);
-    }
-    FREE(pdblReal);
-    FREE(piNbCoef);
-
-    if (iRet)
-    {
-        return false;
-    }
-
     return true;
 }
 
@@ -916,6 +938,14 @@ static bool import_sparse_v1(int _iDatasetId, int _iItemPos, int *_piAddress, ch
 
     if (iRet)
     {
+        FREE(piNbItemRow);
+        FREE(piColPos);
+        FREE(pdblReal);
+        if (iComplex)
+        {
+            FREE(pdblImg);
+        }
+
         return false;
     }
 
@@ -945,19 +975,6 @@ static bool import_sparse_v1(int _iDatasetId, int _iItemPos, int *_piAddress, ch
         }
     }
 
-    if (sciErr.iErr)
-    {
-        printError(&sciErr, 0);
-        return false;
-    }
-
-#ifdef PRINT_DEBUG
-    char pstMsg[512];
-
-    sprintf(pstMsg, "sparse_%d (%d x %d)", _iItemPos, iRows, iCols);
-    print_tree(pstMsg);
-#endif
-
     FREE(piNbItemRow);
     FREE(piColPos);
     FREE(pdblReal);
@@ -966,11 +983,18 @@ static bool import_sparse_v1(int _iDatasetId, int _iItemPos, int *_piAddress, ch
         FREE(pdblImg);
     }
 
-    if (iRet)
+    if (sciErr.iErr)
     {
+        printError(&sciErr, 0);
         return false;
     }
 
+#ifdef PRINT_DEBUG
+    char pstMsg[512];
+
+    sprintf(pstMsg, "sparse_%d (%d x %d)", _iItemPos, iRows, iCols);
+    print_tree(pstMsg);
+#endif
     return true;
 }
 
@@ -995,6 +1019,8 @@ static bool import_boolean_sparse_v1(int _iDatasetId, int _iItemPos, int *_piAdd
     iRet = readBooleanSparseMatrix_v1(_iDatasetId, iRows, iCols, iNbItem, piNbItemRow, piColPos);
     if (iRet)
     {
+        FREE(piNbItemRow);
+        FREE(piColPos);
         return false;
     }
 
@@ -1007,6 +1033,9 @@ static bool import_boolean_sparse_v1(int _iDatasetId, int _iItemPos, int *_piAdd
         sciErr = createBooleanSparseMatrixInNamedList(pvApiCtx, _pstVarname, _piAddress, _iItemPos, iRows, iCols, iNbItem, piNbItemRow, piColPos);
     }
 
+    FREE(piNbItemRow);
+    FREE(piColPos);
+
     if (sciErr.iErr)
     {
         printError(&sciErr, 0);
@@ -1019,15 +1048,6 @@ static bool import_boolean_sparse_v1(int _iDatasetId, int _iItemPos, int *_piAdd
     sprintf(pstMsg, "boolean sparse_%d (%d x %d)", _iItemPos, iRows, iCols);
     print_tree(pstMsg);
 #endif
-
-    FREE(piNbItemRow);
-    FREE(piColPos);
-
-    if (iRet)
-    {
-        return false;
-    }
-
     return true;
 }
 
index 6658877..20e4e9e 100644 (file)
@@ -24,6 +24,7 @@ extern "C"
 #include "h5_fileManagement.h"
 #include "h5_readDataFromFile_v1.h"
 #include "expandPathVariable.h"
+#include "freeArrayOfString.h"
 }
 
 #include <vector>
@@ -75,6 +76,11 @@ int sci_listvar_in_hdf5_v1(char *fname, unsigned long fname_len)
 
     if (getAllocatedSingleString(pvApiCtx, piAddr, &pstFile))
     {
+        if (pstFile)
+        {
+            FREE(pstFile);
+        }
+
         Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), fname, 1);
         return 1;
     }
@@ -113,8 +119,7 @@ int sci_listvar_in_hdf5_v1(char *fname, unsigned long fname_len)
                 break;
             }
 
-            strcpy(pInfo[i].varName, pstVarNameList[i]);
-            FREE(pstVarNameList[i]);
+            strncpy(pInfo[i].varName, pstVarNameList[i], sizeof(pInfo[i].varName));
             b = read_data_v1(iDataSetId, 0, NULL, &pInfo[i]) == false;
             closeDataSet_v1(iDataSetId);
 
@@ -128,6 +133,8 @@ int sci_listvar_in_hdf5_v1(char *fname, unsigned long fname_len)
                 sciprint("%s\n", pInfo[i].pstInfo);
             }
         }
+
+        freeArrayOfString(pstVarNameList, iNbItem);
     }
     else
     {
@@ -155,6 +162,7 @@ int sci_listvar_in_hdf5_v1(char *fname, unsigned long fname_len)
     FREE(pstVarName);
     if (sciErr.iErr)
     {
+        FREE(pInfo);
         printError(&sciErr, 0);
         return 1;
     }
@@ -168,6 +176,7 @@ int sci_listvar_in_hdf5_v1(char *fname, unsigned long fname_len)
         sciErr = allocMatrixOfDouble(pvApiCtx, Rhs + 2, iNbItem, 1, &pdblType);
         if (sciErr.iErr)
         {
+            FREE(pInfo);
             printError(&sciErr, 0);
             return 1;
         }
@@ -319,9 +328,9 @@ static bool read_string_v1(int _iDatasetId, int _iItemPos, int *_piAddress, VarI
     _pInfo->piDims[1] = iCols;
 
     pstData = (char **)MALLOC(iRows * iCols * sizeof(char *));
+    memset(pstData, 0x00, iRows * iCols * sizeof(char *));
     iRet = readStringMatrix_v1(_iDatasetId, iRows, iCols, pstData);
 
-
     for (int i = 0 ; i < iRows * iCols ; i++)
     {
         _pInfo->iSize += (int)strlen(pstData[i]) * 4;