free allocated string allocated by hdf5 during string import 44/12044/1
Antoine ELIAS [Tue, 16 Jul 2013 14:27:12 +0000 (16:27 +0200)]
Change-Id: I7f9377e31ba737bdbcbb05bd625d058fe5916747

scilab/modules/hdf5/includes/h5_readDataFromFile.h
scilab/modules/hdf5/sci_gateway/cpp/sci_import_from_hdf5.cpp
scilab/modules/hdf5/sci_gateway/cpp/sci_listvar_in_hdf5.cpp
scilab/modules/hdf5/src/c/h5_readDataFromFile.c

index dd6b943..0262205 100644 (file)
@@ -49,6 +49,7 @@ HDF5_SCILAB_IMPEXP int readDoubleMatrix(int _iDatasetId, double *_pdblData);
 HDF5_SCILAB_IMPEXP int readDoubleComplexMatrix(int _iDatasetId, double *_pdblReal, double *_pdblImg);
 
 HDF5_SCILAB_IMPEXP int readStringMatrix(int _iDatasetId, char **_pstData);
+HDF5_SCILAB_IMPEXP int freeStringMatrix(int _iDatasetId, char** _pstData);
 
 HDF5_SCILAB_IMPEXP int readBooleanMatrix(int _iDatasetId, int* _piData);
 
index a16b904..5549cb2 100644 (file)
@@ -465,19 +465,13 @@ static bool import_string(int _iDatasetId, int _iItemPos, int *_piAddress, char
     {
         printError(&sciErr, 0);
         FREE(piDims);
-        for (int i = 0 ; i < iSize ; i++)
-        {
-            free(pstData[i]);
-        }
+        freeStringMatrix(_iDatasetId, pstData);
         FREE(pstData);
         return false;
     }
 
     FREE(piDims);
-    for (int i = 0 ; i < iSize ; i++)
-    {
-        free(pstData[i]);
-    }
+    freeStringMatrix(_iDatasetId, pstData);
     FREE(pstData);
 
     return true;
index 13614bd..5bae901 100644 (file)
@@ -348,10 +348,8 @@ 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]);
-    }
+
+    freeStringMatrix(_iDatasetId, pstData);
     FREE(pstData);
     //always full double size
     _pInfo->iSize += (8 - (_pInfo->iSize % 8));
index 6314ebb..eb58e7a 100644 (file)
@@ -603,6 +603,41 @@ int readStringMatrix(int _iDatasetId, char **_pstData)
         return -1;
     }
 
+    return 0;
+}
+
+int freeStringMatrix(int _iDatasetId, char** _pstData)
+{
+    herr_t status;
+    hid_t typeId;
+    hid_t space;
+
+    typeId = H5Tcopy(H5T_C_S1);
+    status = H5Tset_size(typeId, H5T_VARIABLE);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    space = H5Dget_space (_iDatasetId);
+    status = H5Dvlen_reclaim (typeId, space, H5P_DEFAULT, _pstData);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    status = H5Sclose(space);
+    if (status < 0)
+    {
+        return -1;
+    }
+
+    status = H5Tclose(typeId);
+    if (status < 0)
+    {
+        return -1;
+    }
+
     status = H5Dclose(_iDatasetId);
     if (status < 0)
     {