diff options
| author | practicalswift <[email protected]> | 2020-03-05 20:20:36 +0000 |
|---|---|---|
| committer | practicalswift <[email protected]> | 2020-03-12 14:15:10 +0000 |
| commit | 100213c5c29ebd7bd50aa885e54594ae10bf87a4 (patch) | |
| tree | 46f66244d67fa5d0f0f3435c6135844f233a288f | |
| parent | Merge #18112: Serialization improvements step 5 (blockencodings) (diff) | |
| download | discoin-100213c5c29ebd7bd50aa885e54594ae10bf87a4.tar.xz discoin-100213c5c29ebd7bd50aa885e54594ae10bf87a4.zip | |
util: Fail to parse space-only strings in ParseMoney(...) (instead of parsing as zero)
| -rw-r--r-- | src/test/util_tests.cpp | 20 | ||||
| -rw-r--r-- | src/util/moneystr.cpp | 16 |
2 files changed, 27 insertions, 9 deletions
diff --git a/src/test/util_tests.cpp b/src/test/util_tests.cpp index 536ff3ba2..a88b8cf85 100644 --- a/src/test/util_tests.cpp +++ b/src/test/util_tests.cpp @@ -1182,6 +1182,12 @@ BOOST_AUTO_TEST_CASE(util_ParseMoney) BOOST_CHECK_EQUAL(ret, COIN); BOOST_CHECK(ParseMoney("1", ret)); BOOST_CHECK_EQUAL(ret, COIN); + BOOST_CHECK(ParseMoney(" 1", ret)); + BOOST_CHECK_EQUAL(ret, COIN); + BOOST_CHECK(ParseMoney("1 ", ret)); + BOOST_CHECK_EQUAL(ret, COIN); + BOOST_CHECK(ParseMoney(" 1 ", ret)); + BOOST_CHECK_EQUAL(ret, COIN); BOOST_CHECK(ParseMoney("0.1", ret)); BOOST_CHECK_EQUAL(ret, COIN/10); BOOST_CHECK(ParseMoney("0.01", ret)); @@ -1198,12 +1204,26 @@ BOOST_AUTO_TEST_CASE(util_ParseMoney) BOOST_CHECK_EQUAL(ret, COIN/10000000); BOOST_CHECK(ParseMoney("0.00000001", ret)); BOOST_CHECK_EQUAL(ret, COIN/100000000); + BOOST_CHECK(ParseMoney(" 0.00000001 ", ret)); + BOOST_CHECK_EQUAL(ret, COIN/100000000); + BOOST_CHECK(ParseMoney("0.00000001 ", ret)); + BOOST_CHECK_EQUAL(ret, COIN/100000000); + BOOST_CHECK(ParseMoney(" 0.00000001", ret)); + BOOST_CHECK_EQUAL(ret, COIN/100000000); // Parsing amount that can not be represented in ret should fail BOOST_CHECK(!ParseMoney("0.000000001", ret)); // Parsing empty string should fail BOOST_CHECK(!ParseMoney("", ret)); + BOOST_CHECK(!ParseMoney(" ", ret)); + BOOST_CHECK(!ParseMoney(" ", ret)); + + // Parsing two numbers should fail + BOOST_CHECK(!ParseMoney("1 2", ret)); + BOOST_CHECK(!ParseMoney(" 1 2 ", ret)); + BOOST_CHECK(!ParseMoney(" 1.2 3 ", ret)); + BOOST_CHECK(!ParseMoney(" 1 2.3 ", ret)); // Attempted 63 bit overflow should fail BOOST_CHECK(!ParseMoney("92233720368.54775808", ret)); diff --git a/src/util/moneystr.cpp b/src/util/moneystr.cpp index 40d8918df..544cfb58f 100644 --- a/src/util/moneystr.cpp +++ b/src/util/moneystr.cpp @@ -31,12 +31,12 @@ std::string FormatMoney(const CAmount& n) } -bool ParseMoney(const std::string& str, CAmount& nRet) +bool ParseMoney(const std::string& money_string, CAmount& nRet) { - if (!ValidAsCString(str)) { + if (!ValidAsCString(money_string)) { return false; } - + const std::string str = TrimString(money_string); if (str.empty()) { return false; } @@ -44,8 +44,6 @@ bool ParseMoney(const std::string& str, CAmount& nRet) std::string strWhole; int64_t nUnits = 0; const char* p = str.c_str(); - while (IsSpace(*p)) - p++; for (; *p; p++) { if (*p == '.') @@ -60,14 +58,14 @@ bool ParseMoney(const std::string& str, CAmount& nRet) break; } if (IsSpace(*p)) - break; + return false; if (!IsDigit(*p)) return false; strWhole.insert(strWhole.end(), *p); } - for (; *p; p++) - if (!IsSpace(*p)) - return false; + if (*p) { + return false; + } if (strWhole.size() > 10) // guard against 63 bit overflow return false; if (nUnits < 0 || nUnits > COIN) |