Fixed CVE division-by-zero issues
Description:
Fixed HDFFV-10577 and similar issues found in H5Dchunk.c. All
the occurrences are in:
H5D__create_chunk_map_single
H5D__create_chunk_file_map_hyper
H5D__chunk_allocate
H5D__chunk_update_old_edge_chunks
H5D__chunk_prune_by_extent
H5D__chunk_copy_cb
H5D__chunk_collective_fill
Platforms tested:
Linux/64 (jelly)
Linux/64 (platypus)
Darwin (osx1010test)
This commit is contained in:
@@ -1493,6 +1493,9 @@ H5D__create_chunk_map_single(H5D_chunk_map_t *fm, const H5D_io_info_t
|
||||
|
||||
/* Set chunk location & hyperslab size */
|
||||
for(u = 0; u < fm->f_ndims; u++) {
|
||||
/* Validate this chunk dimension */
|
||||
if(fm->layout->u.chunk.dim[u] == 0)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "chunk size must be > 0, dim = %u ", u)
|
||||
HDassert(sel_start[u] == sel_end[u]);
|
||||
chunk_info->scaled[u] = sel_start[u] / fm->layout->u.chunk.dim[u];
|
||||
coords[u] = chunk_info->scaled[u] * fm->layout->u.chunk.dim[u];
|
||||
@@ -1580,6 +1583,9 @@ H5D__create_chunk_file_map_hyper(H5D_chunk_map_t *fm, const H5D_io_info_t
|
||||
|
||||
/* Set initial chunk location & hyperslab size */
|
||||
for(u = 0; u < fm->f_ndims; u++) {
|
||||
/* Validate this chunk dimension */
|
||||
if(fm->layout->u.chunk.dim[u] == 0)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "chunk size must be > 0, dim = %u ", u)
|
||||
scaled[u] = start_scaled[u] = sel_start[u] / fm->layout->u.chunk.dim[u];
|
||||
coords[u] = start_coords[u] = scaled[u] * fm->layout->u.chunk.dim[u];
|
||||
end[u] = (coords[u] + fm->chunk_dim[u]) - 1;
|
||||
@@ -4043,6 +4049,9 @@ H5D__chunk_allocate(const H5D_io_info_t *io_info, hbool_t full_overwrite, hsize_
|
||||
* assume here that all elements of space_dim are > 0. This is checked at
|
||||
* the top of this function. */
|
||||
for(op_dim=0; op_dim<space_ndims; op_dim++) {
|
||||
/* Validate this chunk dimension */
|
||||
if(chunk_dim[op_dim] == 0)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "chunk size must be > 0, dim = %u ", op_dim)
|
||||
min_unalloc[op_dim] = (old_dim[op_dim] + chunk_dim[op_dim] - 1) / chunk_dim[op_dim];
|
||||
max_unalloc[op_dim] = (space_dim[op_dim] - 1) / chunk_dim[op_dim];
|
||||
|
||||
@@ -4484,13 +4493,17 @@ H5D__chunk_update_old_edge_chunks(H5D_t *dset, hsize_t old_dim[])
|
||||
/* Start off with this dimension marked as not needing to be modified */
|
||||
new_full_dim[op_dim] = FALSE;
|
||||
|
||||
/* Validate this chunk dimension */
|
||||
if(chunk_dim[op_dim] == 0)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "chunk size must be > 0, dim = %u ", op_dim)
|
||||
|
||||
/* Calculate offset of first previously incomplete chunk in this
|
||||
* dimension */
|
||||
old_edge_chunk_sc[op_dim] = (old_dim[op_dim] / chunk_dim[op_dim]);
|
||||
old_edge_chunk_sc[op_dim] = (old_dim[op_dim] / chunk_dim[op_dim]);
|
||||
|
||||
/* Calculate the largest offset of chunks that might need to be
|
||||
* modified in this dimension */
|
||||
max_edge_chunk_sc[op_dim] = MIN((old_dim[op_dim] - 1) / chunk_dim[op_dim],
|
||||
max_edge_chunk_sc[op_dim] = MIN((old_dim[op_dim] - 1) / chunk_dim[op_dim],
|
||||
MAX((space_dim[op_dim] / chunk_dim[op_dim]), 1) - 1);
|
||||
|
||||
/* Check for old_dim aligned with chunk boundary in this dimension, if
|
||||
@@ -4626,6 +4639,9 @@ H5D__chunk_collective_fill(const H5D_t *dset, H5D_chunk_coll_info_t *chunk_info,
|
||||
HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "Can't retrieve MPI size")
|
||||
|
||||
/* Distribute evenly the number of blocks between processes. */
|
||||
if(mpi_size == 0)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "Resulted in division by zero")
|
||||
/* BMR: I don't know whether mpi_size = 0 is a valid value, please advise */
|
||||
num_blocks = chunk_info->num_io / mpi_size; /* value should be the same on all procs */
|
||||
|
||||
/* after evenly distributing the blocks between processes, are
|
||||
@@ -5066,6 +5082,10 @@ H5D__chunk_prune_by_extent(H5D_t *dset, const hsize_t *old_dim)
|
||||
HDmemset(min_mod_chunk_sc, 0, sizeof(min_mod_chunk_sc));
|
||||
HDmemset(max_mod_chunk_sc, 0, sizeof(max_mod_chunk_sc));
|
||||
for(op_dim = 0; op_dim < (unsigned)space_ndims; op_dim++) {
|
||||
/* Validate this chunk dimension */
|
||||
if(chunk_dim[op_dim] == 0)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "chunk size must be > 0, dim = %u ", op_dim)
|
||||
|
||||
/* Calculate the largest offset of chunks that might need to be
|
||||
* modified in this dimension */
|
||||
max_mod_chunk_sc[op_dim] = (old_dim[op_dim] - 1) / chunk_dim[op_dim];
|
||||
@@ -5721,9 +5741,12 @@ H5D__chunk_copy_cb(const H5D_chunk_rec_t *chunk_rec, void *_udata)
|
||||
/* (background buffer has already been zeroed out, if not expanding) */
|
||||
if(udata->cpy_info->expand_ref) {
|
||||
size_t ref_count;
|
||||
size_t dt_size;
|
||||
|
||||
/* Determine # of reference elements to copy */
|
||||
ref_count = nbytes / H5T_get_size(udata->dt_src);
|
||||
if((dt_size = H5T_get_size(udata->dt_src)) == 0)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "size must not be 0")
|
||||
ref_count = nbytes / dt_size;
|
||||
|
||||
/* Copy the reference elements */
|
||||
if(H5O_copy_expand_ref(udata->file_src, buf, udata->idx_info_dst->f, bkg, ref_count, H5T_get_ref_type(udata->dt_src), udata->cpy_info) < 0)
|
||||
|
||||
Reference in New Issue
Block a user