Skip to content

Commit

Permalink
Simply check for datatypes with unusual number of unused bits
Browse files Browse the repository at this point in the history
Avoids potential undefined behavior in H5T_is_numeric_with_unusual_unused_bits
  • Loading branch information
jhendersonHDF committed Apr 2, 2024
1 parent f2cf0be commit 767e816
Showing 1 changed file with 2 additions and 14 deletions.
16 changes: 2 additions & 14 deletions src/H5T.c
Original file line number Diff line number Diff line change
Expand Up @@ -6785,24 +6785,12 @@ 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 767e816

Please sign in to comment.