HDF5: fix 11 defects 39/18539/3
Paul Bignier [Tue, 6 Sep 2016 12:21:07 +0000 (14:21 +0200)]
 * CID 1303109, 1303139, 1303147 and 1321146 to 1321153

Change-Id: I547cceb2a735e417734d5e0556ab449f685d34b4

scilab/modules/hdf5/sci_gateway/cpp/sci_hdf5_listvar_v2.cpp
scilab/modules/hdf5/sci_gateway/cpp/sci_hdf5_listvar_v3.cpp
scilab/modules/hdf5/sci_gateway/cpp/sci_hdf5_load_v2.cpp
scilab/modules/hdf5/sci_gateway/cpp/sci_hdf5_load_v3.cpp
scilab/modules/hdf5/src/c/h5_readDataFromFile.c
scilab/modules/hdf5/src/cpp/handle_properties.cpp

index 8c6c2ed..2337416 100644 (file)
@@ -348,6 +348,10 @@ static bool read_string(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo
     char** pstData = NULL;
 
     iSize = getDatasetInfo(_iDatasetId, &iComplex, &_pInfo->iDims, _pInfo->piDims);
+    if (iSize < 0)
+    {
+        return false;
+    }
 
     pstData = (char **)MALLOC(iSize * sizeof(char *));
     iRet = readStringMatrix(_iDatasetId, pstData);
@@ -461,6 +465,10 @@ static bool read_poly(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo*
     int iSize = 0;
 
     iSize = getDatasetInfo(_iDatasetId, &iComplex, &_pInfo->iDims, _pInfo->piDims);
+    if (iSize < 0)
+    {
+        return false;
+    }
     _pInfo->iSize = 8 * 4 + (iSize + 1) * 4;
 
     if (iComplex)
index 65f07e2..2ad0dbf 100644 (file)
@@ -438,6 +438,11 @@ static bool read_double(int dataset, VarInfo6& info)
 
     info.pdims.resize(info.dims);
     int size = getDatasetInfo(dataset, &complex, &info.dims, info.pdims.data());
+    if (size < 0)
+    {
+        closeDataSet(dataset);
+        return false;
+    }
     info.size = size * (complex + 1) * sizeof(double);
 
     generateInfo(info);
@@ -457,6 +462,11 @@ static bool read_string(int dataset, VarInfo6& info)
 
     info.pdims.resize(info.dims);
     int size = getDatasetInfo(dataset, &complex, &info.dims, info.pdims.data());
+    if (size < 0)
+    {
+        closeDataSet(dataset);
+        return false;
+    }
 
     std::vector<char*> str(size);
     ret = readStringMatrix(dataset, str.data());
@@ -484,6 +494,11 @@ static bool read_boolean(int dataset, VarInfo6& info)
 
     info.pdims.resize(info.dims);
     int size = getDatasetInfo(dataset, &complex, &info.dims, info.pdims.data());
+    if (size < 0)
+    {
+        closeDataSet(dataset);
+        return false;
+    }
     info.size = size * sizeof(int);
 
     generateInfo(info);
@@ -503,6 +518,11 @@ static bool read_integer(int dataset, VarInfo6& info)
 
     info.pdims.resize(info.dims);
     int size = getDatasetInfo(dataset, &complex, &info.dims, info.pdims.data());
+    if (size < 0)
+    {
+        closeDataSet(dataset);
+        return false;
+    }
 
     int prec = 0;
     getDatasetPrecision(dataset, &prec);
@@ -584,6 +604,10 @@ static bool read_poly(int dataset, VarInfo6& info)
 
         std::vector<int> d(dims);
         int datasize = getDatasetInfo(poly, &complex, &dims, d.data());
+        if (datasize < 0)
+        {
+            return false;
+        }
         info.size += datasize * sizeof(double) * (complex + 1);
     }
 
@@ -695,6 +719,11 @@ static bool read_struct(int dataset, VarInfo6& info)
             getDatasetInfo(dataref, &complex, &refdim, NULL);
             std::vector<int> refdims(refdim);
             int refcount = getDatasetInfo(dataref, &complex, &refdim, refdims.data());
+            if (refcount < 0)
+            {
+                closeList6(dataset);
+                return false;
+            }
             std::vector<hobj_ref_t> vrefs(refcount);
             ret = H5Dread(dataref, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, vrefs.data());
             if (ret < 0)
@@ -834,6 +863,10 @@ static int getDimsNode(int dataset, int* complex, std::vector<int>& dims)
     //get dims dimension
     std::vector<int> d(dim);
     int size = getDatasetInfo(id, complex, &dim, d.data());
+    if (size < 0)
+    {
+        return 0;
+    }
 
     //get dims value
     dims.resize(size);
index 8016883..4cecf2c 100644 (file)
@@ -377,6 +377,11 @@ static bool import_double(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAd
 
         piDims = (int*)MALLOC(sizeof(int) * iDims);
         iSize = getDatasetInfo(_iDatasetId, &iComplex, &iDims, piDims);
+        if (iSize < 0)
+        {
+            FREE(piDims);
+            return false;
+        }
 
         if (iSize > 0)
         {
@@ -493,6 +498,11 @@ static bool import_string(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAd
 
     piDims = (int*)MALLOC(sizeof(int) * iDims);
     iSize = getDatasetInfo(_iDatasetId, &iComplex, &iDims, piDims);
+    if (iSize < 0)
+    {
+        FREE(piDims);
+        return false;
+    }
 
     pstData = (char **)MALLOC(iSize * sizeof(char *));
 
@@ -546,6 +556,11 @@ static bool import_integer(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piA
 
     piDims = (int*)MALLOC(sizeof(int) * iDims);
     iSize = getDatasetInfo(_iDatasetId, &iComplex, &iDims, piDims);
+    if (iSize < 0)
+    {
+        FREE(piDims);
+        return false;
+    }
 
     iRet = getDatasetPrecision(_iDatasetId, &iPrec);
     if (iRet)
@@ -792,6 +807,11 @@ static bool import_boolean(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piA
 
     piDims = (int*)MALLOC(sizeof(int) * iDims);
     iSize = getDatasetInfo(_iDatasetId, &iComplex, &iDims, piDims);
+    if (iSize < 0)
+    {
+        FREE(piDims);
+        return false;
+    }
 
     if (iSize == 0)
     {
@@ -853,6 +873,11 @@ static bool import_poly(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddr
 
     piDims = (int*)MALLOC(sizeof(int) * iDims);
     iSize = getDatasetInfo(_iDatasetId, &iComplex, &iDims, piDims);
+    if (iSize < 0)
+    {
+        FREE(piDims);
+        return false;
+    }
 
     if (iComplex)
     {
index 8890968..8da49ce 100644 (file)
@@ -304,7 +304,7 @@ static types::InternalType* import_double(int dataset)
     int size = getDatasetInfo(dataset, &complex, &dims, d.data());
 
 
-    if (dims == 0 || size == 0)
+    if (dims == 0 || size <= 0)
     {
         closeDataSet(dataset);
         return types::Double::Empty();
@@ -342,7 +342,7 @@ static types::InternalType* import_string(int dataset)
     int size = getDatasetInfo(dataset, &complex, &dims, d.data());
 
 
-    if (dims == 0 || size == 0)
+    if (dims == 0 || size <= 0)
     {
         closeDataSet(dataset);
         return types::Double::Empty();
@@ -379,7 +379,7 @@ static types::InternalType* import_boolean(int dataset)
     int size = getDatasetInfo(dataset, &complex, &dims, d.data());
 
 
-    if (dims == 0 || size == 0)
+    if (dims == 0 || size <= 0)
     {
         closeDataSet(dataset);
         return types::Double::Empty();
@@ -408,7 +408,7 @@ static types::InternalType* import_int(int dataset)
     int size = getDatasetInfo(dataset, &complex, &dims, d.data());
 
 
-    if (dims == 0 || size == 0)
+    if (dims == 0 || size <= 0)
     {
         closeDataSet(dataset);
         return types::Double::Empty();
@@ -551,6 +551,10 @@ static int getDimsNode(int dataset, int* complex, std::vector<int>& dims)
     //get dims dimension
     std::vector<int> d(dim);
     int size = getDatasetInfo(id, complex, &dim, d.data());
+    if (size < 0)
+    {
+        return 0;
+    }
 
     //get dims value
     dims.resize(size);
@@ -597,6 +601,13 @@ static types::InternalType* import_struct(int dataset)
     getDatasetInfo(dfield, &complex, &dim, NULL);
     std::vector<int> d(dim);
     size = getDatasetInfo(dfield, &complex, &dim, d.data());
+    if (size < 0)
+    {
+        closeList6(dataset);
+        delete str;
+        return nullptr;
+        return str;
+    }
 
     //get dims value
     std::vector<char*> fields(size);
@@ -715,7 +726,7 @@ static types::InternalType* import_poly(int dataset)
         types::SinglePoly* ss = NULL;
 
         //get coef
-        if (dims == 0 || datasize == 0)
+        if (dims == 0 || datasize <= 0)
         {
             ss = new types::SinglePoly();
         }
@@ -767,6 +778,11 @@ static types::InternalType* import_sparse(int dataset)
     int sizein = getDatasetInfo(datain, &complex, &dimin, NULL);
     std::vector<int> dimsin(dimin);
     sizein = getDatasetInfo(datain, &complex, &dimin, dimsin.data());
+    if (sizein < 0)
+    {
+        closeList6(dataset);
+        return nullptr;
+    }
 
     std::vector<int> in(sizein);
     int ret = readInteger32Matrix(datain, in.data());
@@ -782,6 +798,11 @@ static types::InternalType* import_sparse(int dataset)
     int sizeout = getDatasetInfo(dataout, &complex, &dimout, NULL);
     std::vector<int> dimsout(dimout);
     sizeout = getDatasetInfo(dataout, &complex, &dimout, dimsout.data());
+    if (sizeout < 0)
+    {
+        closeList6(dataset);
+        return nullptr;
+    }
 
     std::vector<int> out(sizeout);
     ret = readInteger32Matrix(dataout, out.data());
@@ -797,6 +818,11 @@ static types::InternalType* import_sparse(int dataset)
     int sizedata = getDatasetInfo(ddata, &complex, &dimdata, NULL);
     std::vector<int> dimsdata(dimdata);
     sizedata = getDatasetInfo(ddata, &complex, &dimdata, dimsdata.data());
+    if (sizedata < 0)
+    {
+        closeList6(dataset);
+        return nullptr;
+    }
 
     std::vector<double> real(sizedata);
 
@@ -852,6 +878,11 @@ static types::InternalType* import_boolean_sparse(int dataset)
     int sizein = getDatasetInfo(datain, &complex, &dimin, NULL);
     std::vector<int> dimsin(dimin);
     sizein = getDatasetInfo(datain, &complex, &dimin, dimsin.data());
+    if (sizein < 0)
+    {
+        closeList6(dataset);
+        return nullptr;
+    }
 
     std::vector<int> in(sizein);
     int ret = readInteger32Matrix(datain, in.data());
@@ -867,6 +898,11 @@ static types::InternalType* import_boolean_sparse(int dataset)
     int sizeout = getDatasetInfo(dataout, &complex, &dimout, NULL);
     std::vector<int> dimsout(dimout);
     sizeout = getDatasetInfo(dataout, &complex, &dimout, dimsout.data());
+    if (sizeout < 0)
+    {
+        closeList6(dataset);
+        return nullptr;
+    }
 
     std::vector<int> out(sizeout);
     ret = readInteger32Matrix(dataout, out.data());
@@ -994,6 +1030,13 @@ static types::InternalType* import_macro(int dataset)
     //inputs
     int inputNode = getDataSetIdFromName(dataset, "inputs");
     size = getDatasetInfo(inputNode, &complex, &dims, d.data());
+    if (size < 0)
+    {
+        delete inputList;
+        delete outputList;
+        closeList6(dataset);
+        return nullptr;
+    }
     std::vector<char*> inputNames(size);
 
     if (size != 0)
@@ -1018,6 +1061,13 @@ static types::InternalType* import_macro(int dataset)
     //outputs
     int outputNode = getDataSetIdFromName(dataset, "outputs");
     size = getDatasetInfo(outputNode, &complex, &dims, d.data());
+    if (size < 0)
+    {
+        delete inputList;
+        delete outputList;
+        closeList6(dataset);
+        return nullptr;
+    }
     std::vector<char*> outputNames(size);
 
     if (size != 0)
@@ -1042,6 +1092,13 @@ static types::InternalType* import_macro(int dataset)
     //body
     int bodyNode = getDataSetIdFromName(dataset, "body");
     size = getDatasetInfo(bodyNode, &complex, &dims, d.data());
+    if (size < 0)
+    {
+        delete inputList;
+        delete outputList;
+        closeList6(dataset);
+        return nullptr;
+    }
     std::vector<unsigned char> bodybin(size);
     readUnsignedInteger8Matrix(bodyNode, bodybin.data());
 
index 73ff240..c60f6a5 100644 (file)
@@ -540,6 +540,11 @@ int readDoubleComplexMatrix(int _iDatasetId, double *_pdblReal, double *_pdblImg
     getDatasetInfo(_iDatasetId, &iComplex, &iDims, NULL);
     piDims = (int*)MALLOC(sizeof(int) * iDims);
     iSize = getDatasetInfo(_iDatasetId, &iComplex, &iDims, piDims);
+    if (iSize < 0)
+    {
+        FREE(piDims);
+        return -1;
+    }
 
     FREE(piDims);
     //alloc temp array
index bbd25bd..bb752ec 100644 (file)
@@ -72,7 +72,7 @@ static int getHandleIntVector(int dataset, const char* prop, int* row, int* col,
     std::vector<int> d(dims);
     int size = getDatasetInfo(node, &complex, &dims, d.data());
 
-    if (dims == 0 || size == 0)
+    if (dims == 0 || size <= 0)
     {
         closeDataSet(node);
         return -1;
@@ -120,7 +120,7 @@ static int getHandleBoolVector(int dataset, const char* prop, int* row, int* col
     std::vector<int> d(dims);
     int size = getDatasetInfo(node, &complex, &dims, d.data());
 
-    if (dims == 0 || size == 0)
+    if (dims == 0 || size <= 0)
     {
         closeDataSet(node);
         return -1;
@@ -169,7 +169,7 @@ static int getHandleDoubleVector(int dataset, const char* prop, int* row, int* c
     std::vector<int> d(dims);
     int size = getDatasetInfo(node, &complex, &dims, d.data());
 
-    if (dims == 0 || size == 0)
+    if (dims == 0 || size <= 0)
     {
         closeDataSet(node);
         return -1;
@@ -205,7 +205,7 @@ static int getHandleString(int dataset, const char* prop, char** val)
     std::vector<int> d(dims);
     int size = getDatasetInfo(node, &complex, &dims, d.data());
 
-    if (dims == 0 || size == 0)
+    if (dims == 0 || size <= 0)
     {
         closeDataSet(node);
         return -1;
@@ -237,7 +237,7 @@ static int getHandleStringVector(int dataset, const char* prop, int* row, int* c
     std::vector<int> d(dims);
     int size = getDatasetInfo(node, &complex, &dims, d.data());
 
-    if (dims == 0 || size == 0)
+    if (dims == 0 || size <= 0)
     {
         closeDataSet(node);
         return -1;