From 48132079f0cf0aa28630a02fe1cc6bb00cea0191 Mon Sep 17 00:00:00 2001 From: prasad-sawantdesai Date: Thu, 12 Mar 2026 12:16:45 +0100 Subject: [PATCH 1/2] fix(hdf5): read HDF5_BACKEND_VERSION using actual stored type(#42) --- src/hdf5/hdf5_utils.cpp | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/hdf5/hdf5_utils.cpp b/src/hdf5/hdf5_utils.cpp index c76352a9..9145d17f 100644 --- a/src/hdf5/hdf5_utils.cpp +++ b/src/hdf5/hdf5_utils.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include using namespace boost::filesystem; @@ -75,24 +76,30 @@ int throw ALBackendException(error_message, LOG); } - hid_t dtype_id = H5Tcopy (H5T_C_S1); - H5Tset_size(dtype_id, strlen(backend_version_attribute_name)); - - herr_t tset = H5Tset_cset(dtype_id, H5T_CSET_UTF8); - if (tset < 0) { - char error_message[100]; - sprintf(error_message, "Unable to set characters to UTF8 for: %s\n", backend_version_attribute_name); - throw ALBackendException(error_message); + hid_t attr_file_type = H5Aget_type(att_id); + if (attr_file_type < 0) { + H5Aclose(att_id); + char error_message[200]; + sprintf(error_message, "Unable to get type of attribute: %s\n", backend_version_attribute_name); + throw ALBackendException(error_message, LOG); } + size_t attr_size = H5Tget_size(attr_file_type); + H5Tclose(attr_file_type); + + hid_t dtype_id = H5Tcopy(H5T_C_S1); + H5Tset_size(dtype_id, attr_size + 1); + H5Tset_strpad(dtype_id, H5T_STR_NULLTERM); - char version[10]; - herr_t status = H5Aread(att_id, dtype_id, version); + std::vector version(attr_size + 1, '\0'); + herr_t status = H5Aread(att_id, dtype_id, version.data()); if (status < 0) { + H5Tclose(dtype_id); + H5Aclose(att_id); char error_message[200]; sprintf(error_message, "Unable to read attribute: %s\n", backend_version_attribute_name); throw ALBackendException(error_message, LOG); } - backend_version = std::string(version); + backend_version = std::string(version.data()); H5Tclose(dtype_id); H5Aclose(att_id); } else { @@ -344,8 +351,8 @@ void HDF5Utils::writeHeader(DataEntryContext * ctx, hid_t file_id, std::string & //write version to file hid_t dataspace_id = H5Screate(H5S_SCALAR); - hid_t dtype_id = H5Tcopy (H5T_C_S1); - H5Tset_size(dtype_id, strlen(backend_version_attribute_name)); + hid_t dtype_id = H5Tcopy(H5T_C_S1); + H5Tset_size(dtype_id, backend_version.length() + 1); herr_t tset = H5Tset_cset(dtype_id, H5T_CSET_UTF8); if (tset < 0) { char error_message[200]; From 83a3079c6f558c2239324682bf5890f6de06f556 Mon Sep 17 00:00:00 2001 From: prasad-sawantdesai Date: Thu, 12 Mar 2026 15:32:23 +0100 Subject: [PATCH 2/2] fix the issue while put --- src/hdf5/hdf5_utils.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hdf5/hdf5_utils.cpp b/src/hdf5/hdf5_utils.cpp index 9145d17f..91d7fb24 100644 --- a/src/hdf5/hdf5_utils.cpp +++ b/src/hdf5/hdf5_utils.cpp @@ -84,11 +84,13 @@ int throw ALBackendException(error_message, LOG); } size_t attr_size = H5Tget_size(attr_file_type); + H5T_cset_t attr_cset = H5Tget_cset(attr_file_type); H5Tclose(attr_file_type); hid_t dtype_id = H5Tcopy(H5T_C_S1); H5Tset_size(dtype_id, attr_size + 1); H5Tset_strpad(dtype_id, H5T_STR_NULLTERM); + H5Tset_cset(dtype_id, attr_cset); std::vector version(attr_size + 1, '\0'); herr_t status = H5Aread(att_id, dtype_id, version.data());