Skip to content

Commit

Permalink
Simply check for datatypes with unusual number of unused bits (HDFGro…
Browse files Browse the repository at this point in the history
…up#4309)

Avoids potential undefined behavior in H5T_is_numeric_with_unusual_unused_bits
  • Loading branch information
jhendersonHDF authored and lrknox committed Apr 4, 2024
1 parent 2f65e6d commit be203a2
Showing 1 changed file with 3 additions and 14 deletions.
17 changes: 3 additions & 14 deletions src/H5T.c
Original file line number Diff line number Diff line change
Expand Up @@ -6784,24 +6784,13 @@ H5T_is_numeric_with_unusual_unused_bits(const H5T_t *dt)
/* Is the correct type? */
if (H5T_INTEGER == dt->shared->type || H5T_FLOAT == dt->shared->type ||
H5T_BITFIELD == dt->shared->type) {
#if LDBL_MANT_DIG == 106
/* This currently won't work for the IBM long double type */
if (H5T_FLOAT == dt->shared->type && dt->shared->size == 16 &&
(dt->shared->u.atomic.prec == 64 || dt->shared->u.atomic.prec == 128))
HGOTO_DONE(false);
#endif

/* Has unused bits? */
if (dt->shared->u.atomic.prec < (dt->shared->size * 8)) {
unsigned surround_bits =
1U << (1 + H5VM_log2_gen((dt->shared->u.atomic.prec + dt->shared->u.atomic.offset) - 1));

if (dt->shared->size > 1 && dt->shared->u.atomic.prec < (dt->shared->size * 8))
/* Unused bits are unusually large? */
if (dt->shared->size > 1 && ((dt->shared->size * 8) > surround_bits))
HGOTO_DONE(true);
}
ret_value =
(dt->shared->size * 8) > (2 * (dt->shared->u.atomic.prec + dt->shared->u.atomic.offset));
}

done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5T_is_numeric_with_unusual_unused_bits() */

0 comments on commit be203a2

Please sign in to comment.