From b0988a7bd4c813eb9192cccdce9e18dd347a1771 Mon Sep 17 00:00:00 2001 From: vlefevre Date: Wed, 25 Mar 2020 17:07:02 +0000 Subject: [src/set_{si,ui}_2exp.c] Bug fix in MPFR_LONG_WITHIN_LIMB defined case: added early underflow/overflow checking to avoid integer overflow or errors due to special exponent values. git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@13809 280ebfd0-de03-0410-8827-d642c229c3f4 --- src/set_si_2exp.c | 9 +++++++++ src/set_ui_2exp.c | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/src/set_si_2exp.c b/src/set_si_2exp.c index f67f84b3e..5e703a47a 100644 --- a/src/set_si_2exp.c +++ b/src/set_si_2exp.c @@ -41,6 +41,15 @@ mpfr_set_si_2exp (mpfr_ptr x, long i, mpfr_exp_t e, mpfr_rnd_t rnd_mode) mp_limb_t ai, *xp; int inex = 0; + /* Early underflow/overflow checking is necessary to avoid + integer overflow or errors due to special exponent values. */ + if (MPFR_UNLIKELY (e < __gmpfr_emin - (mpfr_exp_t) + (sizeof (unsigned long) * CHAR_BIT + 1))) + return mpfr_underflow (x, rnd_mode == MPFR_RNDN ? + MPFR_RNDZ : rnd_mode, i < 0 ? -1 : 1); + if (MPFR_UNLIKELY (e >= __gmpfr_emax)) + return mpfr_overflow (x, rnd_mode, i < 0 ? -1 : 1); + ai = SAFE_ABS (unsigned long, i); MPFR_ASSERTN (SAFE_ABS (unsigned long, i) == ai); diff --git a/src/set_ui_2exp.c b/src/set_ui_2exp.c index a0c61068a..fa72613ab 100644 --- a/src/set_ui_2exp.c +++ b/src/set_ui_2exp.c @@ -42,6 +42,15 @@ mpfr_set_ui_2exp (mpfr_ptr x, unsigned long i, mpfr_exp_t e, mpfr_rnd_t rnd_mode mp_limb_t *xp; int inex = 0; + /* Early underflow/overflow checking is necessary to avoid + integer overflow or errors due to special exponent values. */ + if (MPFR_UNLIKELY (e < __gmpfr_emin - (mpfr_exp_t) + (sizeof (unsigned long) * CHAR_BIT + 1))) + return mpfr_underflow (x, rnd_mode == MPFR_RNDN ? + MPFR_RNDZ : rnd_mode, i < 0 ? -1 : 1); + if (MPFR_UNLIKELY (e >= __gmpfr_emax)) + return mpfr_overflow (x, rnd_mode, i < 0 ? -1 : 1); + MPFR_ASSERTD (i == (mp_limb_t) i); /* Position of the highest limb */ -- cgit v1.2.1