mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-10 20:03:34 -03:00
Don't rely on locale dependent functions in base_blob<BITS>::SetHex(...) (uint256), DecodeBase58(...), ParseMoney(...) and ParseHex(...)
This commit is contained in:
parent
f4e4ea1cee
commit
15db77f4dd
6 changed files with 25 additions and 13 deletions
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -71,6 +71,21 @@ constexpr bool IsDigit(char c)
|
|||
return c >= '0' && c <= '9';
|
||||
}
|
||||
|
||||
/**
|
||||
* 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,
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
|
||||
export LC_ALL=C
|
||||
KNOWN_VIOLATIONS=(
|
||||
"src/base58.cpp:.*isspace"
|
||||
"src/bitcoin-tx.cpp.*stoul"
|
||||
"src/bitcoin-tx.cpp.*trim_right"
|
||||
"src/bitcoin-tx.cpp:.*atoi"
|
||||
|
@ -18,15 +17,12 @@ KNOWN_VIOLATIONS=(
|
|||
"src/test/getarg_tests.cpp.*split"
|
||||
"src/torcontrol.cpp:.*atoi"
|
||||
"src/torcontrol.cpp:.*strtol"
|
||||
"src/uint256.cpp:.*isspace"
|
||||
"src/uint256.cpp:.*tolower"
|
||||
"src/util.cpp:.*atoi"
|
||||
"src/util.cpp:.*fprintf"
|
||||
"src/util.cpp:.*tolower"
|
||||
"src/utilmoneystr.cpp:.*isdigit"
|
||||
"src/utilmoneystr.cpp:.*isspace"
|
||||
"src/utilstrencodings.cpp:.*atoi"
|
||||
"src/utilstrencodings.cpp:.*isspace"
|
||||
"src/utilstrencodings.cpp:.*strtol"
|
||||
"src/utilstrencodings.cpp:.*strtoll"
|
||||
"src/utilstrencodings.cpp:.*strtoul"
|
||||
|
|
Loading…
Reference in a new issue