[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-exchange] branch master updated: clean up amount logic, fix 2^53
From: |
gnunet |
Subject: |
[taler-exchange] branch master updated: clean up amount logic, fix 2^53 check |
Date: |
Sun, 19 Jan 2020 19:39:16 +0100 |
This is an automated email from the git hooks/post-receive script.
grothoff pushed a commit to branch master
in repository exchange.
The following commit(s) were added to refs/heads/master by this push:
new 5da9cfc5 clean up amount logic, fix 2^53 check
5da9cfc5 is described below
commit 5da9cfc51c0ceae3e944a0c35f994cadd745911a
Author: Christian Grothoff <address@hidden>
AuthorDate: Sun Jan 19 19:39:14 2020 +0100
clean up amount logic, fix 2^53 check
---
src/auditor/generate-auditor-basedb.sh | 4 +-
src/util/amount.c | 96 +++++++++++++++++++---------------
2 files changed, 56 insertions(+), 44 deletions(-)
diff --git a/src/auditor/generate-auditor-basedb.sh
b/src/auditor/generate-auditor-basedb.sh
index 22982c2b..ed019cdf 100755
--- a/src/auditor/generate-auditor-basedb.sh
+++ b/src/auditor/generate-auditor-basedb.sh
@@ -66,8 +66,8 @@ BANK_URL=http://localhost:${BANK_PORT}/
AUDITOR_URL=http://localhost:8083/
# patch configuration
-taler-config -c $CONF -s EXCHANGE -o MASTER_PUBLIC_KEY -V $MASTER_PUB
-taler-config -c $CONF -s EXCHANGE-DEFAULT -o MASTER_KEY -V $MASTER_PUB
+taler-config -c $CONF -s exchange -o MASTER_PUBLIC_KEY -V $MASTER_PUB
+taler-config -c $CONF -s merchant-exchange-default -o MASTER_KEY -V $MASTER_PUB
taler-config -c $CONF -s exchangedb-postgres -o CONFIG -V
postgres:///$TARGET_DB
taler-config -c $CONF -s auditordb-postgres -o CONFIG -V postgres:///$TARGET_DB
taler-config -c $CONF -s merchantdb-postgres -o CONFIG -V
postgres:///$TARGET_DB
diff --git a/src/util/amount.c b/src/util/amount.c
index c282ff4b..0092c014 100644
--- a/src/util/amount.c
+++ b/src/util/amount.c
@@ -61,13 +61,11 @@ int
TALER_string_to_amount (const char *str,
struct TALER_Amount *denom)
{
- size_t i;
int n;
uint32_t b;
const char *colon;
const char *value;
- invalidate (denom);
/* skip leading whitespace */
while (isspace ( (unsigned char) str[0]))
str++;
@@ -75,8 +73,10 @@ TALER_string_to_amount (const char *str,
{
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
"Null before currency\n");
+ invalidate (denom);
return GNUNET_SYSERR;
}
+
/* parse currency */
colon = strchr (str, (int) ':');
if ( (NULL == colon) ||
@@ -85,91 +85,103 @@ TALER_string_to_amount (const char *str,
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
"Invalid currency specified before colon: `%s'\n",
str);
- goto fail;
+ invalidate (denom);
+ return GNUNET_SYSERR;
}
+
+ GNUNET_assert (TALER_CURRENCY_LEN > (colon - str));
memcpy (denom->currency,
str,
colon - str);
+ /* 0-terminate *and* normalize buffer by setting everything to '\0' */
+ memset (&denom->currency [colon - str],
+ 0,
+ TALER_CURRENCY_LEN - (colon - str));
+
/* skip colon */
value = colon + 1;
if ('\0' == value[0])
{
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "Null before value\n");
- goto fail;
+ "Actual value missing in amount `%s'\n",
+ str);
+ invalidate (denom);
+ return GNUNET_SYSERR;
}
+ denom->value = 0;
+ denom->fraction = 0;
+
/* parse value */
- i = 0;
- while ('.' != value[i])
+ while ('.' != *value)
{
- if ('\0' == value[i])
+ if ('\0' == *value)
{
+ /* we are done */
return GNUNET_OK;
}
- if ( (value[i] < '0') || (value[i] > '9') )
+ if ( (*value < '0') ||
+ (*value > '9') )
{
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "Invalid character `%c'\n",
- value[i]);
- goto fail;
+ "Invalid character `%c' in amount `%s'\n",
+ (int) *value,
+ str);
+ invalidate (denom);
+ return GNUNET_SYSERR;
}
- n = value[i] - '0';
- if (denom->value * 10 + n < denom->value)
+ n = *value - '0';
+ if ( (denom->value * 10 + n < denom->value) ||
+ (denom->value > MAX_AMOUNT_VALUE) )
{
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "Value too large\n");
- goto fail;
+ "Value specified in amount `%s' is too large\n",
+ str);
+ invalidate (denom);
+ return GNUNET_SYSERR;
}
denom->value = (denom->value * 10) + n;
- i++;
+ value++;
}
/* skip the dot */
- i++;
+ value++;
/* parse fraction */
- if ('\0' == value[i])
+ if ('\0' == *value)
{
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "Null after dot\n");
- goto fail;
+ "Amount `%s' ends abruptly after `.'\n",
+ str);
+ invalidate (denom);
+ return GNUNET_SYSERR;
}
b = TALER_AMOUNT_FRAC_BASE / 10;
- while ('\0' != value[i])
+ while ('\0' != *value)
{
if (0 == b)
{
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "Fractional value too small (only %u digits supported)\n",
- (unsigned int) TALER_AMOUNT_FRAC_LEN);
- goto fail;
+ "Fractional value too small (only %u digits supported) in
amount `%s'\n",
+ (unsigned int) TALER_AMOUNT_FRAC_LEN,
+ str);
+ invalidate (denom);
+ return GNUNET_SYSERR;
}
- if ( (value[i] < '0') || (value[i] > '9') )
+ if ( (*value < '0') ||
+ (*value > '9') )
{
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
"Error after dot\n");
- goto fail;
+ invalidate (denom);
+ return GNUNET_SYSERR;
}
- n = value[i] - '0';
+ n = *value - '0';
denom->fraction += n * b;
b /= 10;
- i++;
- }
- if (denom->value > MAX_AMOUNT_VALUE)
- {
- /* too large to be legal */
- invalidate (denom);
- return GNUNET_SYSERR;
+ value++;
}
return GNUNET_OK;
-
-fail:
- /* set currency to 'invalid' to prevent accidental use */
- memset (denom->currency,
- 0,
- TALER_CURRENCY_LEN);
- return GNUNET_SYSERR;
}
--
To stop receiving notification emails like this one, please contact
address@hidden.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [taler-exchange] branch master updated: clean up amount logic, fix 2^53 check,
gnunet <=