From 7e3b840ac00b9a774c2d481fc0e667e1254b898e Mon Sep 17 00:00:00 2001 From: Scott Wittenburg Date: Thu, 17 Aug 2023 17:46:29 -0600 Subject: [PATCH] WIP: safely check size_t -> integer conversion --- source/adios2/engine/hdf5/HDF5ReaderP.cpp | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/source/adios2/engine/hdf5/HDF5ReaderP.cpp b/source/adios2/engine/hdf5/HDF5ReaderP.cpp index cd39481fdf..bacc9dcabb 100644 --- a/source/adios2/engine/hdf5/HDF5ReaderP.cpp +++ b/source/adios2/engine/hdf5/HDF5ReaderP.cpp @@ -13,6 +13,8 @@ #include "adios2/helper/adiosFunctions.h" //CSVToVector #include "adios2/helper/adiosFunctions.h" //IsHDF5 +#include +#include #include namespace adios2 @@ -183,7 +185,14 @@ size_t HDF5ReaderP::ReadDataset(hid_t dataSetId, hid_t h5Type, Variable &vari if (ret < 0) return 0; - hid_t memDataSpace = H5Screate_simple(ndims, count.data(), NULL); + if (ndims > std::numeric_limits::max()) + { + helper::Throw("Engine", "HDF5ReaderP", "ReadDataset", + "Number of dimensions is too large to be " + "represented by an int"); + } + + hid_t memDataSpace = H5Screate_simple(static_cast(ndims), count.data(), NULL); interop::HDF5TypeGuard g_mds(memDataSpace, interop::E_H5_SPACE); int elementsRead = 1; @@ -261,9 +270,17 @@ void HDF5ReaderP::UseHDFRead(Variable &variable, T *data, hid_t h5Type) while (ts < variable.m_StepsCount) { + size_t adiosStep = variableStart + ts; + if (adiosStep > std::numeric_limits::max()) + { + helper::Throw("Engine", "HDF5ReaderP", "UseHDFRead", + "Timestep value is too large to be " + "represented by an int"); + } + try { - m_H5File.SetAdiosStep(variableStart + ts); + m_H5File.SetAdiosStep(static_cast(adiosStep)); } catch (std::exception &e) {