summaryrefslogtreecommitdiffstats
path: root/src/H5Dchunk.c
diff options
context:
space:
mode:
authorDana Robinson <43805+derobins@users.noreply.github.com>2023-08-29 12:45:44 (GMT)
committerGitHub <noreply@github.com>2023-08-29 12:45:44 (GMT)
commit6129233f4e5c892623e0533b13de3b987af436ea (patch)
tree1e07eece3afbe221419fd97f3d75c7c70973b1a2 /src/H5Dchunk.c
parentbfe867c4cb7b636da21ff4245a2c1da6d96f1955 (diff)
downloadhdf5-6129233f4e5c892623e0533b13de3b987af436ea.zip
hdf5-6129233f4e5c892623e0533b13de3b987af436ea.tar.gz
hdf5-6129233f4e5c892623e0533b13de3b987af436ea.tar.bz2
10 CVE fixes (#3440)
* Fix for CVE-2018-15671 * Fix CVE-2016-4332 * Fix CVE-2018-11202 * Fix CVE-2018-11205 * Fix CVE-2018-13866 * Fix CVE-2018-13867 and CVE-2018-13871
Diffstat (limited to 'src/H5Dchunk.c')
-rw-r--r--src/H5Dchunk.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/H5Dchunk.c b/src/H5Dchunk.c
index a3fcc49..bea84a9 100644
--- a/src/H5Dchunk.c
+++ b/src/H5Dchunk.c
@@ -700,9 +700,12 @@ H5D__chunk_set_info_real(H5O_layout_chunk_t *layout, unsigned ndims, const hsize
/* Sanity checks */
HDassert(layout);
- HDassert(ndims > 0);
HDassert(curr_dims);
+ /* Can happen when corrupt files are parsed */
+ if (ndims == 0)
+ HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "number of dimensions cannot be zero")
+
/* Compute the # of chunks in dataset dimensions */
for (u = 0, layout->nchunks = 1, layout->max_nchunks = 1; u < ndims; u++) {
/* Round up to the next integer # of chunks, to accommodate partial chunks */
@@ -914,6 +917,7 @@ H5D__chunk_init(H5F_t *f, const H5D_t *const dset, hid_t dapl_id)
H5D_rdcc_t *rdcc = &(dset->shared->cache.chunk); /* Convenience pointer to dataset's chunk cache */
H5P_genplist_t *dapl; /* Data access property list object pointer */
H5O_storage_chunk_t *sc = &(dset->shared->layout.storage.u.chunk);
+ hbool_t idx_init = FALSE;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_STATIC
@@ -989,12 +993,21 @@ H5D__chunk_init(H5F_t *f, const H5D_t *const dset, hid_t dapl_id)
/* Allocate any indexing structures */
if (sc->ops->init && (sc->ops->init)(&idx_info, dset->shared->space, dset->oloc.addr) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't initialize indexing information")
+ idx_init = TRUE;
/* Set the number of chunks in dataset, etc. */
if (H5D__chunk_set_info(dset) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to set # of chunks for dataset")
done:
+ if (FAIL == ret_value) {
+ if (rdcc->slot)
+ rdcc->slot = H5FL_SEQ_FREE(H5D_rdcc_ent_ptr_t, rdcc->slot);
+
+ if (idx_init && sc->ops->dest && (sc->ops->dest)(&idx_info) < 0)
+ HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "unable to release chunk index info");
+ }
+
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5D__chunk_init() */