diff options
Diffstat (limited to 'src/util')
-rw-r--r-- | src/util/amount.c | 23 |
1 files 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; } |