diff options
author | practicalswift <practicalswift@users.noreply.github.com> | 2018-10-26 18:54:30 +0200 |
---|---|---|
committer | practicalswift <practicalswift@users.noreply.github.com> | 2018-10-26 19:42:58 +0200 |
commit | 15db77f4dd7f1a7963398f1576580b577a1697bc (patch) | |
tree | 0414a87045cbdf0618c23534da58f010d62a8808 /src | |
parent | f4e4ea1ceecfb978584bd4f43cb6826e44ba86a3 (diff) |
Don't rely on locale dependent functions in base_blob<BITS>::SetHex(...) (uint256), DecodeBase58(...), ParseMoney(...) and ParseHex(...)
Diffstat (limited to 'src')
-rw-r--r-- | src/base58.cpp | 7 | ||||
-rw-r--r-- | src/uint256.cpp | 2 | ||||
-rw-r--r-- | src/utilmoneystr.cpp | 6 | ||||
-rw-r--r-- | src/utilstrencodings.cpp | 4 | ||||
-rw-r--r-- | src/utilstrencodings.h | 15 |
5 files changed, 25 insertions, 9 deletions
diff --git a/src/base58.cpp b/src/base58.cpp index 7020c24055..eac763394b 100644 --- a/src/base58.cpp +++ b/src/base58.cpp @@ -6,6 +6,7 @@ #include <hash.h> #include <uint256.h> +#include <utilstrencodings.h> #include <assert.h> #include <string.h> @@ -34,7 +35,7 @@ static const int8_t mapBase58[256] = { bool DecodeBase58(const char* psz, std::vector<unsigned char>& vch) { // Skip leading spaces. - while (*psz && isspace(*psz)) + while (*psz && IsSpace(*psz)) psz++; // Skip and count leading '1's. int zeroes = 0; @@ -48,7 +49,7 @@ bool DecodeBase58(const char* psz, std::vector<unsigned char>& vch) std::vector<unsigned char> b256(size); // Process the characters. static_assert(sizeof(mapBase58)/sizeof(mapBase58[0]) == 256, "mapBase58.size() should be 256"); // guarantee not out of range - while (*psz && !isspace(*psz)) { + while (*psz && !IsSpace(*psz)) { // Decode base58 character int carry = mapBase58[(uint8_t)*psz]; if (carry == -1) // Invalid b58 character @@ -64,7 +65,7 @@ bool DecodeBase58(const char* psz, std::vector<unsigned char>& vch) psz++; } // Skip trailing spaces. - while (isspace(*psz)) + while (IsSpace(*psz)) psz++; if (*psz != 0) return false; diff --git a/src/uint256.cpp b/src/uint256.cpp index e513dc1de7..e940f90cf0 100644 --- a/src/uint256.cpp +++ b/src/uint256.cpp @@ -29,7 +29,7 @@ void base_blob<BITS>::SetHex(const char* psz) memset(data, 0, sizeof(data)); // skip leading spaces - while (isspace(*psz)) + while (IsSpace(*psz)) psz++; // skip 0x diff --git a/src/utilmoneystr.cpp b/src/utilmoneystr.cpp index 326ef9b27a..7bae161a1d 100644 --- a/src/utilmoneystr.cpp +++ b/src/utilmoneystr.cpp @@ -41,7 +41,7 @@ bool ParseMoney(const char* pszIn, CAmount& nRet) std::string strWhole; int64_t nUnits = 0; const char* p = pszIn; - while (isspace(*p)) + while (IsSpace(*p)) p++; for (; *p; p++) { @@ -56,14 +56,14 @@ bool ParseMoney(const char* pszIn, CAmount& nRet) } break; } - if (isspace(*p)) + if (IsSpace(*p)) break; if (!isdigit(*p)) return false; strWhole.insert(strWhole.end(), *p); } for (; *p; p++) - if (!isspace(*p)) + if (!IsSpace(*p)) return false; if (strWhole.size() > 10) // guard against 63 bit overflow return false; diff --git a/src/utilstrencodings.cpp b/src/utilstrencodings.cpp index 4940267bae..a1700d2514 100644 --- a/src/utilstrencodings.cpp +++ b/src/utilstrencodings.cpp @@ -85,7 +85,7 @@ std::vector<unsigned char> ParseHex(const char* psz) std::vector<unsigned char> vch; while (true) { - while (isspace(*psz)) + while (IsSpace(*psz)) psz++; signed char c = HexDigit(*psz++); if (c == (signed char)-1) @@ -266,7 +266,7 @@ static bool ParsePrechecks(const std::string& str) { if (str.empty()) // No empty string allowed return false; - if (str.size() >= 1 && (isspace(str[0]) || isspace(str[str.size()-1]))) // No padding allowed + if (str.size() >= 1 && (IsSpace(str[0]) || IsSpace(str[str.size()-1]))) // No padding allowed return false; if (str.size() != strlen(str.c_str())) // No embedded NUL characters allowed return false; diff --git a/src/utilstrencodings.h b/src/utilstrencodings.h index 846a3917a2..1610c8c268 100644 --- a/src/utilstrencodings.h +++ b/src/utilstrencodings.h @@ -72,6 +72,21 @@ constexpr bool IsDigit(char c) } /** + * Tests if the given character is a whitespace character. The whitespace characters + * are: space, form-feed ('\f'), newline ('\n'), carriage return ('\r'), horizontal + * tab ('\t'), and vertical tab ('\v'). + * + * This function is locale independent. Under the C locale this function gives the + * same result as std::isspace. + * + * @param[in] c character to test + * @return true if the argument is a whitespace character; otherwise false + */ +constexpr inline bool IsSpace(char c) noexcept { + return c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v'; +} + +/** * Convert string to signed 32-bit integer with strict parse error feedback. * @returns true if the entire string could be parsed as valid integer, * false if not the entire string could be parsed or when overflow or underflow occurred. |