HDF5: fix invalid read/write while loading mlists or strings 26/11926/3
Clément DAVID [Thu, 4 Jul 2013 08:54:28 +0000 (10:54 +0200)]
Change-Id: Ie7e6df9c6aa8d456e99990c15bb432f81775fef6

scilab/modules/hdf5/sci_gateway/cpp/sci_import_from_hdf5.cpp
scilab/modules/hdf5/sci_gateway/cpp/sci_listvar_in_hdf5.cpp
scilab/tools/profiling/valgrind.supp

index 809282f..ff1a18c 100644 (file)
@@ -463,10 +463,20 @@ static bool import_string(int _iDatasetId, int _iItemPos, int *_piAddress, char
     if (sciErr.iErr)
     {
         printError(&sciErr, 0);
+        FREE(piDims);
+        for (int i = 0 ; i < iSize ; i++)
+        {
+            free(pstData[i]);
+        }
+        FREE(pstData);
         return false;
     }
 
     FREE(piDims);
+    for (int i = 0 ; i < iSize ; i++)
+    {
+        free(pstData[i]);
+    }
     FREE(pstData);
 
     return true;
index b6bed32..13614bd 100644 (file)
@@ -145,6 +145,7 @@ int sci_listvar_in_hdf5(char *fname, unsigned long fname_len)
 
             strcpy(pInfo[i].varName, pstVarNameList[i]);
             FREE(pstVarNameList[i]);
+            pInfo[i].iSize = 0;
             b = read_data(iDataSetId, 0, NULL, &pInfo[i]) == false;
             if (b)
             {
@@ -347,6 +348,10 @@ static bool read_string(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo
         _pInfo->iSize += (int)strlen(pstData[i]) * 4;
     }
 
+    for (int i = 0 ; i < iSize ; i++)
+    {
+        free(pstData[i]);
+    }
     FREE(pstData);
     //always full double size
     _pInfo->iSize += (8 - (_pInfo->iSize % 8));
@@ -579,9 +584,14 @@ static void generateInfo(VarInfo* _pInfo, const char* _pstType)
     {
         sprintf(pstSize, "%d by %d", _pInfo->piDims[0], _pInfo->piDims[1]);
     }
-    else
+    else if (_pInfo->iDims == 1)
     {
         sprintf(pstSize, "%d", _pInfo->piDims[0]);
     }
+    else
+    {
+        pstSize[0] = '\0';
+    }
+
     sprintf(_pInfo->pstInfo, "%-*s%-*s%-*s%-*d", 25, _pInfo->varName, 15, _pstType, 16, pstSize, 10, _pInfo->iSize);
 }
index f6907b3..514df79 100644 (file)
@@ -15,7 +15,6 @@
    Memcheck:Leak
    fun:_Znwm
    ...
-   fun:call_init.part.0
    fun:_dl_init
 }
 {