Merge #9804: Fixes subscript 0 (&var[0]) where should use (var.data()) instead.

30ac7688e Fix subscript[0] potential bugs in key.cpp (Jeremy Rubin)
4b1c0f2e2 Remove unnecessary branches in utilstrencodings string constructors. (Jeremy Rubin)
e19db7b5a Fix subscript[0] in utilstrencodings.cpp (Jeremy Rubin)
bc2e7fd98 Fix subscript[0] in streams.h (Jeremy Rubin)
4cac0d1e0 Fix subscript[0] in validation.cpp (Jeremy Rubin)
ac658e55f Fix subscript[0] in torcontrol (Jeremy Rubin)
b6856ebed Fix subscript[0] in netaddress.cpp (Jeremy Rubin)
361d95265 Fix subscript[0] in base58.cpp (Jeremy Rubin)
6896dbf16 Cleanup (safe, it was checked) subscript[0] in MurmurHash3 (and cleanup MurmurHash3 to be more clear). (Jeremy Rubin)
96f2119e6 Fix subscript[0] in compressor.cpp (Jeremy Rubin)
500710bd2 Fix 2 subscript[0] bugs in pubkey.cpp, and eliminate one extra size check (Jeremy Rubin)
e0451e3e2 Fix subscript[0] bug in net.cpp if GetGroup returns a 0-sized vector (Jeremy Rubin)

Tree-SHA512: 5b9103652cf8c615bd8f4f32b3573d291d6b67c39e0308ce00100bc6625f346e8e016b4c999f4f34f5c37ae059490a83c3b513deb21f838af785227d06e02362
This commit is contained in:
Pieter Wuille 2017-07-12 16:23:59 -07:00
commit 479afa0f84
No known key found for this signature in database
GPG key ID: A636E97631F767E0
13 changed files with 51 additions and 57 deletions

View file

@ -110,7 +110,7 @@ std::string EncodeBase58(const unsigned char* pbegin, const unsigned char* pend)
std::string EncodeBase58(const std::vector<unsigned char>& vch) std::string EncodeBase58(const std::vector<unsigned char>& vch)
{ {
return EncodeBase58(&vch[0], &vch[0] + vch.size()); return EncodeBase58(vch.data(), vch.data() + vch.size());
} }
bool DecodeBase58(const std::string& str, std::vector<unsigned char>& vchRet) bool DecodeBase58(const std::string& str, std::vector<unsigned char>& vchRet)
@ -160,7 +160,7 @@ void CBase58Data::SetData(const std::vector<unsigned char>& vchVersionIn, const
vchVersion = vchVersionIn; vchVersion = vchVersionIn;
vchData.resize(nSize); vchData.resize(nSize);
if (!vchData.empty()) if (!vchData.empty())
memcpy(&vchData[0], pdata, nSize); memcpy(vchData.data(), pdata, nSize);
} }
void CBase58Data::SetData(const std::vector<unsigned char>& vchVersionIn, const unsigned char* pbegin, const unsigned char* pend) void CBase58Data::SetData(const std::vector<unsigned char>& vchVersionIn, const unsigned char* pbegin, const unsigned char* pend)
@ -180,8 +180,8 @@ bool CBase58Data::SetString(const char* psz, unsigned int nVersionBytes)
vchVersion.assign(vchTemp.begin(), vchTemp.begin() + nVersionBytes); vchVersion.assign(vchTemp.begin(), vchTemp.begin() + nVersionBytes);
vchData.resize(vchTemp.size() - nVersionBytes); vchData.resize(vchTemp.size() - nVersionBytes);
if (!vchData.empty()) if (!vchData.empty())
memcpy(&vchData[0], &vchTemp[nVersionBytes], vchData.size()); memcpy(vchData.data(), vchTemp.data() + nVersionBytes, vchData.size());
memory_cleanse(&vchTemp[0], vchTemp.size()); memory_cleanse(vchTemp.data(), vchTemp.size());
return true; return true;
} }
@ -262,7 +262,7 @@ CTxDestination CBitcoinAddress::Get() const
if (!IsValid()) if (!IsValid())
return CNoDestination(); return CNoDestination();
uint160 id; uint160 id;
memcpy(&id, &vchData[0], 20); memcpy(&id, vchData.data(), 20);
if (vchVersion == Params().Base58Prefix(CChainParams::PUBKEY_ADDRESS)) if (vchVersion == Params().Base58Prefix(CChainParams::PUBKEY_ADDRESS))
return CKeyID(id); return CKeyID(id);
else if (vchVersion == Params().Base58Prefix(CChainParams::SCRIPT_ADDRESS)) else if (vchVersion == Params().Base58Prefix(CChainParams::SCRIPT_ADDRESS))
@ -276,7 +276,7 @@ bool CBitcoinAddress::GetKeyID(CKeyID& keyID) const
if (!IsValid() || vchVersion != Params().Base58Prefix(CChainParams::PUBKEY_ADDRESS)) if (!IsValid() || vchVersion != Params().Base58Prefix(CChainParams::PUBKEY_ADDRESS))
return false; return false;
uint160 id; uint160 id;
memcpy(&id, &vchData[0], 20); memcpy(&id, vchData.data(), 20);
keyID = CKeyID(id); keyID = CKeyID(id);
return true; return true;
} }

View file

@ -148,7 +148,7 @@ public:
K ret; K ret;
if (vchData.size() == Size) { if (vchData.size() == Size) {
// If base58 encoded data does not hold an ext key, return a !IsValid() key // If base58 encoded data does not hold an ext key, return a !IsValid() key
ret.Decode(&vchData[0]); ret.Decode(vchData.data());
} }
return ret; return ret;
} }

View file

@ -93,7 +93,7 @@ bool CScriptCompressor::Decompress(unsigned int nSize, const std::vector<unsigne
script[0] = OP_DUP; script[0] = OP_DUP;
script[1] = OP_HASH160; script[1] = OP_HASH160;
script[2] = 20; script[2] = 20;
memcpy(&script[3], &in[0], 20); memcpy(&script[3], in.data(), 20);
script[23] = OP_EQUALVERIFY; script[23] = OP_EQUALVERIFY;
script[24] = OP_CHECKSIG; script[24] = OP_CHECKSIG;
return true; return true;
@ -101,7 +101,7 @@ bool CScriptCompressor::Decompress(unsigned int nSize, const std::vector<unsigne
script.resize(23); script.resize(23);
script[0] = OP_HASH160; script[0] = OP_HASH160;
script[1] = 20; script[1] = 20;
memcpy(&script[2], &in[0], 20); memcpy(&script[2], in.data(), 20);
script[22] = OP_EQUAL; script[22] = OP_EQUAL;
return true; return true;
case 0x02: case 0x02:
@ -109,14 +109,14 @@ bool CScriptCompressor::Decompress(unsigned int nSize, const std::vector<unsigne
script.resize(35); script.resize(35);
script[0] = 33; script[0] = 33;
script[1] = nSize; script[1] = nSize;
memcpy(&script[2], &in[0], 32); memcpy(&script[2], in.data(), 32);
script[34] = OP_CHECKSIG; script[34] = OP_CHECKSIG;
return true; return true;
case 0x04: case 0x04:
case 0x05: case 0x05:
unsigned char vch[33] = {}; unsigned char vch[33] = {};
vch[0] = nSize - 2; vch[0] = nSize - 2;
memcpy(&vch[1], &in[0], 32); memcpy(&vch[1], in.data(), 32);
CPubKey pubkey(&vch[0], &vch[33]); CPubKey pubkey(&vch[0], &vch[33]);
if (!pubkey.Decompress()) if (!pubkey.Decompress())
return false; return false;

View file

@ -17,8 +17,6 @@ unsigned int MurmurHash3(unsigned int nHashSeed, const std::vector<unsigned char
{ {
// The following is MurmurHash3 (x86_32), see http://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.cpp // The following is MurmurHash3 (x86_32), see http://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.cpp
uint32_t h1 = nHashSeed; uint32_t h1 = nHashSeed;
if (vDataToHash.size() > 0)
{
const uint32_t c1 = 0xcc9e2d51; const uint32_t c1 = 0xcc9e2d51;
const uint32_t c2 = 0x1b873593; const uint32_t c2 = 0x1b873593;
@ -26,9 +24,9 @@ unsigned int MurmurHash3(unsigned int nHashSeed, const std::vector<unsigned char
//---------- //----------
// body // body
const uint8_t* blocks = &vDataToHash[0] + nblocks * 4; const uint8_t* blocks = vDataToHash.data();
for (int i = -nblocks; i; i++) { for (int i = 0; i < nblocks; ++i) {
uint32_t k1 = ReadLE32(blocks + i*4); uint32_t k1 = ReadLE32(blocks + i*4);
k1 *= c1; k1 *= c1;
@ -42,7 +40,7 @@ unsigned int MurmurHash3(unsigned int nHashSeed, const std::vector<unsigned char
//---------- //----------
// tail // tail
const uint8_t* tail = (const uint8_t*)(&vDataToHash[0] + nblocks * 4); const uint8_t* tail = vDataToHash.data() + nblocks * 4;
uint32_t k1 = 0; uint32_t k1 = 0;
@ -58,7 +56,6 @@ unsigned int MurmurHash3(unsigned int nHashSeed, const std::vector<unsigned char
k1 *= c2; k1 *= c2;
h1 ^= k1; h1 ^= k1;
} }
}
//---------- //----------
// finalization // finalization

View file

@ -138,7 +138,7 @@ CPrivKey CKey::GetPrivKey() const {
size_t privkeylen; size_t privkeylen;
privkey.resize(279); privkey.resize(279);
privkeylen = 279; privkeylen = 279;
ret = ec_privkey_export_der(secp256k1_context_sign, (unsigned char*)&privkey[0], &privkeylen, begin(), fCompressed ? SECP256K1_EC_COMPRESSED : SECP256K1_EC_UNCOMPRESSED); ret = ec_privkey_export_der(secp256k1_context_sign, (unsigned char*) privkey.data(), &privkeylen, begin(), fCompressed ? SECP256K1_EC_COMPRESSED : SECP256K1_EC_UNCOMPRESSED);
assert(ret); assert(ret);
privkey.resize(privkeylen); privkey.resize(privkeylen);
return privkey; return privkey;
@ -167,7 +167,7 @@ bool CKey::Sign(const uint256 &hash, std::vector<unsigned char>& vchSig, uint32_
secp256k1_ecdsa_signature sig; secp256k1_ecdsa_signature sig;
int ret = secp256k1_ecdsa_sign(secp256k1_context_sign, &sig, hash.begin(), begin(), secp256k1_nonce_function_rfc6979, test_case ? extra_entropy : NULL); int ret = secp256k1_ecdsa_sign(secp256k1_context_sign, &sig, hash.begin(), begin(), secp256k1_nonce_function_rfc6979, test_case ? extra_entropy : NULL);
assert(ret); assert(ret);
secp256k1_ecdsa_signature_serialize_der(secp256k1_context_sign, (unsigned char*)&vchSig[0], &nSigLen, &sig); secp256k1_ecdsa_signature_serialize_der(secp256k1_context_sign, (unsigned char*)vchSig.data(), &nSigLen, &sig);
vchSig.resize(nSigLen); vchSig.resize(nSigLen);
return true; return true;
} }
@ -202,7 +202,7 @@ bool CKey::SignCompact(const uint256 &hash, std::vector<unsigned char>& vchSig)
} }
bool CKey::Load(CPrivKey &privkey, CPubKey &vchPubKey, bool fSkipCheck=false) { bool CKey::Load(CPrivKey &privkey, CPubKey &vchPubKey, bool fSkipCheck=false) {
if (!ec_privkey_import_der(secp256k1_context_sign, (unsigned char*)begin(), &privkey[0], privkey.size())) if (!ec_privkey_import_der(secp256k1_context_sign, (unsigned char*)begin(), privkey.data(), privkey.size()))
return false; return false;
fCompressed = vchPubKey.IsCompressed(); fCompressed = vchPubKey.IsCompressed();
fValid = true; fValid = true;
@ -245,8 +245,8 @@ void CExtKey::SetMaster(const unsigned char *seed, unsigned int nSeedLen) {
static const unsigned char hashkey[] = {'B','i','t','c','o','i','n',' ','s','e','e','d'}; static const unsigned char hashkey[] = {'B','i','t','c','o','i','n',' ','s','e','e','d'};
std::vector<unsigned char, secure_allocator<unsigned char>> vout(64); std::vector<unsigned char, secure_allocator<unsigned char>> vout(64);
CHMAC_SHA512(hashkey, sizeof(hashkey)).Write(seed, nSeedLen).Finalize(vout.data()); CHMAC_SHA512(hashkey, sizeof(hashkey)).Write(seed, nSeedLen).Finalize(vout.data());
key.Set(&vout[0], &vout[32], true); key.Set(vout.data(), vout.data() + 32, true);
memcpy(chaincode.begin(), &vout[32], 32); memcpy(chaincode.begin(), vout.data() + 32, 32);
nDepth = 0; nDepth = 0;
nChild = 0; nChild = 0;
memset(vchFingerprint, 0, sizeof(vchFingerprint)); memset(vchFingerprint, 0, sizeof(vchFingerprint));

View file

@ -2876,5 +2876,5 @@ uint64_t CConnman::CalculateKeyedNetGroup(const CAddress& ad) const
{ {
std::vector<unsigned char> vchNetGroup(ad.GetGroup()); std::vector<unsigned char> vchNetGroup(ad.GetGroup());
return GetDeterministicRandomizer(RANDOMIZER_ID_NETGROUP).Write(&vchNetGroup[0], vchNetGroup.size()).Finalize(); return GetDeterministicRandomizer(RANDOMIZER_ID_NETGROUP).Write(vchNetGroup.data(), vchNetGroup.size()).Finalize();
} }

View file

@ -573,7 +573,7 @@ std::vector<unsigned char> CService::GetKey() const
{ {
std::vector<unsigned char> vKey; std::vector<unsigned char> vKey;
vKey.resize(18); vKey.resize(18);
memcpy(&vKey[0], ip, 16); memcpy(vKey.data(), ip, 16);
vKey[16] = port / 0x100; vKey[16] = port / 0x100;
vKey[17] = port & 0x0FF; vKey[17] = port & 0x0FF;
return vKey; return vKey;

View file

@ -172,10 +172,7 @@ bool CPubKey::Verify(const uint256 &hash, const std::vector<unsigned char>& vchS
if (!secp256k1_ec_pubkey_parse(secp256k1_context_verify, &pubkey, &(*this)[0], size())) { if (!secp256k1_ec_pubkey_parse(secp256k1_context_verify, &pubkey, &(*this)[0], size())) {
return false; return false;
} }
if (vchSig.size() == 0) { if (!ecdsa_signature_parse_der_lax(secp256k1_context_verify, &sig, vchSig.data(), vchSig.size())) {
return false;
}
if (!ecdsa_signature_parse_der_lax(secp256k1_context_verify, &sig, &vchSig[0], vchSig.size())) {
return false; return false;
} }
/* libsecp256k1's ECDSA verification requires lower-S signatures, which have /* libsecp256k1's ECDSA verification requires lower-S signatures, which have
@ -274,7 +271,7 @@ bool CExtPubKey::Derive(CExtPubKey &out, unsigned int _nChild) const {
/* static */ bool CPubKey::CheckLowS(const std::vector<unsigned char>& vchSig) { /* static */ bool CPubKey::CheckLowS(const std::vector<unsigned char>& vchSig) {
secp256k1_ecdsa_signature sig; secp256k1_ecdsa_signature sig;
if (!ecdsa_signature_parse_der_lax(secp256k1_context_verify, &sig, &vchSig[0], vchSig.size())) { if (!ecdsa_signature_parse_der_lax(secp256k1_context_verify, &sig, vchSig.data(), vchSig.size())) {
return false; return false;
} }
return (!secp256k1_ecdsa_signature_normalize(secp256k1_context_verify, NULL, &sig)); return (!secp256k1_ecdsa_signature_normalize(secp256k1_context_verify, NULL, &sig));

View file

@ -450,7 +450,7 @@ public:
} }
string.resize(size); string.resize(size);
if (size != 0) if (size != 0)
s.read((char*)&string[0], size); s.read((char*)string.data(), size);
} }
template<typename Stream> template<typename Stream>
@ -458,7 +458,7 @@ public:
{ {
WriteCompactSize(s, string.size()); WriteCompactSize(s, string.size());
if (!string.empty()) if (!string.empty())
s.write((char*)&string[0], string.size()); s.write((char*)string.data(), string.size());
} }
}; };
@ -556,7 +556,7 @@ void Serialize(Stream& os, const std::basic_string<C>& str)
{ {
WriteCompactSize(os, str.size()); WriteCompactSize(os, str.size());
if (!str.empty()) if (!str.empty())
os.write((char*)&str[0], str.size() * sizeof(str[0])); os.write((char*)str.data(), str.size() * sizeof(C));
} }
template<typename Stream, typename C> template<typename Stream, typename C>
@ -565,7 +565,7 @@ void Unserialize(Stream& is, std::basic_string<C>& str)
unsigned int nSize = ReadCompactSize(is); unsigned int nSize = ReadCompactSize(is);
str.resize(nSize); str.resize(nSize);
if (nSize != 0) if (nSize != 0)
is.read((char*)&str[0], nSize * sizeof(str[0])); is.read((char*)str.data(), nSize * sizeof(C));
} }
@ -578,7 +578,7 @@ void Serialize_impl(Stream& os, const prevector<N, T>& v, const unsigned char&)
{ {
WriteCompactSize(os, v.size()); WriteCompactSize(os, v.size());
if (!v.empty()) if (!v.empty())
os.write((char*)&v[0], v.size() * sizeof(T)); os.write((char*)v.data(), v.size() * sizeof(T));
} }
template<typename Stream, unsigned int N, typename T, typename V> template<typename Stream, unsigned int N, typename T, typename V>
@ -646,7 +646,7 @@ void Serialize_impl(Stream& os, const std::vector<T, A>& v, const unsigned char&
{ {
WriteCompactSize(os, v.size()); WriteCompactSize(os, v.size());
if (!v.empty()) if (!v.empty())
os.write((char*)&v[0], v.size() * sizeof(T)); os.write((char*)v.data(), v.size() * sizeof(T));
} }
template<typename Stream, typename T, typename A, typename V> template<typename Stream, typename T, typename A, typename V>

View file

@ -389,7 +389,7 @@ public:
{ {
// Special case: stream << stream concatenates like stream += stream // Special case: stream << stream concatenates like stream += stream
if (!vch.empty()) if (!vch.empty())
s.write((char*)&vch[0], vch.size() * sizeof(vch[0])); s.write((char*)vch.data(), vch.size() * sizeof(value_type));
} }
template<typename T> template<typename T>

View file

@ -662,7 +662,7 @@ void TorController::protocolinfo_cb(TorControlConnection& _conn, const TorContro
// _conn.Command("AUTHENTICATE " + HexStr(status_cookie.second), boost::bind(&TorController::auth_cb, this, _1, _2)); // _conn.Command("AUTHENTICATE " + HexStr(status_cookie.second), boost::bind(&TorController::auth_cb, this, _1, _2));
cookie = std::vector<uint8_t>(status_cookie.second.begin(), status_cookie.second.end()); cookie = std::vector<uint8_t>(status_cookie.second.begin(), status_cookie.second.end());
clientNonce = std::vector<uint8_t>(TOR_NONCE_SIZE, 0); clientNonce = std::vector<uint8_t>(TOR_NONCE_SIZE, 0);
GetRandBytes(&clientNonce[0], TOR_NONCE_SIZE); GetRandBytes(clientNonce.data(), TOR_NONCE_SIZE);
_conn.Command("AUTHCHALLENGE SAFECOOKIE " + HexStr(clientNonce), boost::bind(&TorController::authchallenge_cb, this, _1, _2)); _conn.Command("AUTHCHALLENGE SAFECOOKIE " + HexStr(clientNonce), boost::bind(&TorController::authchallenge_cb, this, _1, _2));
} else { } else {
if (status_cookie.first) { if (status_cookie.first) {

View file

@ -228,7 +228,7 @@ std::vector<unsigned char> DecodeBase64(const char* p, bool* pfInvalid)
std::string DecodeBase64(const std::string& str) std::string DecodeBase64(const std::string& str)
{ {
std::vector<unsigned char> vchRet = DecodeBase64(str.c_str()); std::vector<unsigned char> vchRet = DecodeBase64(str.c_str());
return (vchRet.size() == 0) ? std::string() : std::string((const char*)&vchRet[0], vchRet.size()); return std::string((const char*)vchRet.data(), vchRet.size());
} }
std::string EncodeBase32(const unsigned char* pch, size_t len) std::string EncodeBase32(const unsigned char* pch, size_t len)
@ -415,7 +415,7 @@ std::vector<unsigned char> DecodeBase32(const char* p, bool* pfInvalid)
std::string DecodeBase32(const std::string& str) std::string DecodeBase32(const std::string& str)
{ {
std::vector<unsigned char> vchRet = DecodeBase32(str.c_str()); std::vector<unsigned char> vchRet = DecodeBase32(str.c_str());
return (vchRet.size() == 0) ? std::string() : std::string((const char*)&vchRet[0], vchRet.size()); return std::string((const char*)vchRet.data(), vchRet.size());
} }
static bool ParsePrechecks(const std::string& str) static bool ParsePrechecks(const std::string& str)

View file

@ -2890,7 +2890,7 @@ std::vector<unsigned char> GenerateCoinbaseCommitment(CBlock& block, const CBloc
if (consensusParams.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nTimeout != 0) { if (consensusParams.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nTimeout != 0) {
if (commitpos == -1) { if (commitpos == -1) {
uint256 witnessroot = BlockWitnessMerkleRoot(block, NULL); uint256 witnessroot = BlockWitnessMerkleRoot(block, NULL);
CHash256().Write(witnessroot.begin(), 32).Write(&ret[0], 32).Finalize(witnessroot.begin()); CHash256().Write(witnessroot.begin(), 32).Write(ret.data(), 32).Finalize(witnessroot.begin());
CTxOut out; CTxOut out;
out.nValue = 0; out.nValue = 0;
out.scriptPubKey.resize(38); out.scriptPubKey.resize(38);