summaryrefslogtreecommitdiffstats
path: root/src/H5Oattr.c
diff options
context:
space:
mode:
authorEgbert Eich <eich@suse.com>2023-03-02 17:17:49 (GMT)
committerGitHub <noreply@github.com>2023-03-02 17:17:49 (GMT)
commitb16ec83d4bd79f9ffaad85de16056419f3532887 (patch)
treea8d04d51a806c1f0a0c52485ff8dc60c487ddc14 /src/H5Oattr.c
parent877e4a67c5440f801e9faccf4ca1a451c89eae59 (diff)
downloadhdf5-b16ec83d4bd79f9ffaad85de16056419f3532887.zip
hdf5-b16ec83d4bd79f9ffaad85de16056419f3532887.tar.gz
hdf5-b16ec83d4bd79f9ffaad85de16056419f3532887.tar.bz2
Check for overflow when calculating on-disk attribute data size (#2459)
* Remove duplicate code Signed-off-by: Egbert Eich <eich@suse.com> * Add test case for CVE-2021-37501 Bogus sizes in this test case causes the on-disk data size calculation in H5O__attr_decode() to overflow so that the calculated size becomes 0. This causes the read to overflow and h5dump to segfault. This test case was crafted, the test file was not directly generated by HDF5. Test case from: https://github.com/ST4RF4LL/Something_Found/blob/main/HDF5_v1.13.0_h5dump_heap_overflow.md
Diffstat (limited to 'src/H5Oattr.c')
-rw-r--r--src/H5Oattr.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/src/H5Oattr.c b/src/H5Oattr.c
index 6386865..e431cd2 100644
--- a/src/H5Oattr.c
+++ b/src/H5Oattr.c
@@ -221,10 +221,6 @@ H5O__attr_decode(H5F_t *f, H5O_t *open_oh, unsigned H5_ATTR_UNUSED mesg_flags, u
else
p += attr->shared->ds_size;
- /* Get the datatype's size */
- if (0 == (dt_size = H5T_get_size(attr->shared->dt)))
- HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, NULL, "unable to get datatype size")
-
/* Get the datatype & dataspace sizes */
if (0 == (dt_size = H5T_get_size(attr->shared->dt)))
HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, NULL, "unable to get datatype size")
@@ -234,6 +230,9 @@ H5O__attr_decode(H5F_t *f, H5O_t *open_oh, unsigned H5_ATTR_UNUSED mesg_flags, u
/* Compute the size of the data */
H5_CHECKED_ASSIGN(attr->shared->data_size, size_t, ds_size * (hsize_t)dt_size, hsize_t);
+ /* Check if multiplication has overflown */
+ if ((attr->shared->data_size / dt_size) != ds_size)
+ HGOTO_ERROR(H5E_RESOURCE, H5E_OVERFLOW, NULL, "data size exceeds addressable range")
/* Go get the data */
if (attr->shared->data_size) {