aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfanquake <fanquake@gmail.com>2021-07-09 13:12:51 +0800
committerfanquake <fanquake@gmail.com>2021-08-04 19:48:24 +0800
commitf7752adba5dd35fccd3f2144cfcf03538ebf275b (patch)
treedeb01f8d53f0b85bf5cf35b6b045bd869c8eac02
parent5ef2738089efd396186775ad23aaec71ea44ebb1 (diff)
downloadbitcoin-f7752adba5dd35fccd3f2144cfcf03538ebf275b.tar.xz
util: check MoneyRange() inside ParseMoney()
-rw-r--r--src/test/util_tests.cpp2
-rw-r--r--src/util/moneystr.cpp4
2 files changed, 5 insertions, 1 deletions
diff --git a/src/test/util_tests.cpp b/src/test/util_tests.cpp
index b953df580f..4f9d10cf1d 100644
--- a/src/test/util_tests.cpp
+++ b/src/test/util_tests.cpp
@@ -1226,7 +1226,6 @@ BOOST_AUTO_TEST_CASE(util_ParseMoney)
BOOST_CHECK_EQUAL(ParseMoney("12345.6789").value(), (COIN/10000)*123456789);
- BOOST_CHECK_EQUAL(ParseMoney("100000000.00").value(), COIN*100000000);
BOOST_CHECK_EQUAL(ParseMoney("10000000.00").value(), COIN*10000000);
BOOST_CHECK_EQUAL(ParseMoney("1000000.00").value(), COIN*1000000);
BOOST_CHECK_EQUAL(ParseMoney("100000.00").value(), COIN*100000);
@@ -1252,6 +1251,7 @@ BOOST_AUTO_TEST_CASE(util_ParseMoney)
BOOST_CHECK_EQUAL(ParseMoney(" 0.00000001").value(), COIN/100000000);
// Parsing amount that can not be represented should fail
+ BOOST_CHECK(!ParseMoney("100000000.00"));
BOOST_CHECK(!ParseMoney("0.000000001"));
// Parsing empty string should fail
diff --git a/src/util/moneystr.cpp b/src/util/moneystr.cpp
index d72164f3bf..d3f4029607 100644
--- a/src/util/moneystr.cpp
+++ b/src/util/moneystr.cpp
@@ -81,5 +81,9 @@ std::optional<CAmount> ParseMoney(const std::string& money_string)
CAmount value = nWhole * COIN + nUnits;
+ if (!MoneyRange(value)) {
+ return std::nullopt;
+ }
+
return value;
}