aboutsummaryrefslogtreecommitdiff
path: root/src/util
diff options
context:
space:
mode:
Diffstat (limited to 'src/util')
-rw-r--r--src/util/amount.c23
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;
}