From a37a049cebb66b398aa600a09475a3245c6b127a Mon Sep 17 00:00:00 2001 From: jhendersonHDF Date: Wed, 3 Apr 2024 17:40:15 -0500 Subject: [PATCH] Simply check for datatypes with unusual number of unused bits (#4309) Avoids potential undefined behavior in H5T_is_numeric_with_unusual_unused_bits --- src/H5T.c | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/src/H5T.c b/src/H5T.c index e3cf451d30..41998869b3 100644 --- a/src/H5T.c +++ b/src/H5T.c @@ -6785,24 +6785,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() */