From e9de3374a974df5e7eeaff0c3241dd98724c642e Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Thu, 2 Apr 2020 14:01:41 +0200 Subject: fix #6148 --- src/util/amount.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/util/amount.c b/src/util/amount.c index 2fc786541..454f3080d 100644 --- a/src/util/amount.c +++ b/src/util/amount.c @@ -529,26 +529,23 @@ TALER_amount_add (struct TALER_Amount *sum, int TALER_amount_normalize (struct TALER_Amount *amount) { - int ret; + uint32_t overflow; if (GNUNET_YES != TALER_amount_is_valid (amount)) return GNUNET_SYSERR; - ret = GNUNET_NO; - while ( (amount->value != UINT64_MAX) && - (amount->fraction >= TALER_AMOUNT_FRAC_BASE) ) - { - amount->fraction -= TALER_AMOUNT_FRAC_BASE; - amount->value++; - ret = GNUNET_OK; - } - if (amount->fraction >= TALER_AMOUNT_FRAC_BASE) + if (amount->fraction < TALER_AMOUNT_FRAC_BASE) + return GNUNET_NO; + overflow = amount->fraction / TALER_AMOUT_FRAC_BASE; + amount->fraction %= TALER_AMOUNT_FRAC_BASE; + amount->value += overflow; + ret = GNUNET_OK; + if ( (amount->value < overflow) || + (amount->value > MAX_AMOUNT_VALUE) ) { - /* failed to normalize, adding up fractions caused - main value to overflow! */ invalidate (amount); return GNUNET_SYSERR; } - return ret; + return GNUNET_OK; } -- cgit v1.2.3