merge bitcoin#20464: Treat CDataStream bytes as uint8_t

This commit is contained in:
Kittywhiskers Van Gogh 2023-09-11 00:53:19 +05:30 committed by PastaPastaPasta
parent 65ff12c303
commit dba0dc9501
14 changed files with 64 additions and 122 deletions

View File

@ -79,7 +79,7 @@ static void PrevectorDeserialize(benchmark::Bench& bench)
for (auto x = 0; x < 1000; ++x) { for (auto x = 0; x < 1000; ++x) {
s0 >> t1; s0 >> t1;
} }
s0.Init(SER_NETWORK, 0); s0.Rewind();
}); });
} }

View File

@ -8,9 +8,10 @@
#include <clientversion.h> #include <clientversion.h>
#include <fs.h> #include <fs.h>
#include <serialize.h> #include <serialize.h>
#include <span.h>
#include <streams.h> #include <streams.h>
#include <util/system.h>
#include <util/strencodings.h> #include <util/strencodings.h>
#include <util/system.h>
#include <typeindex> #include <typeindex>
@ -82,12 +83,12 @@ public:
template <typename V> template <typename V>
void Write(const CDataStream& _ssKey, const V& value) void Write(const CDataStream& _ssKey, const V& value)
{ {
leveldb::Slice slKey(_ssKey.data(), _ssKey.size()); leveldb::Slice slKey((const char*)_ssKey.data(), _ssKey.size());
ssValue.reserve(DBWRAPPER_PREALLOC_VALUE_SIZE); ssValue.reserve(DBWRAPPER_PREALLOC_VALUE_SIZE);
ssValue << value; ssValue << value;
ssValue.Xor(dbwrapper_private::GetObfuscateKey(parent)); ssValue.Xor(dbwrapper_private::GetObfuscateKey(parent));
leveldb::Slice slValue(ssValue.data(), ssValue.size()); leveldb::Slice slValue((const char*)ssValue.data(), ssValue.size());
batch.Put(slKey, slValue); batch.Put(slKey, slValue);
// - varint: key length (1 byte up to 127B, 2 bytes up to 16383B, ...) // - varint: key length (1 byte up to 127B, 2 bytes up to 16383B, ...)
@ -109,7 +110,7 @@ public:
} }
void Erase(const CDataStream& _ssKey) { void Erase(const CDataStream& _ssKey) {
leveldb::Slice slKey(_ssKey.data(), _ssKey.size()); leveldb::Slice slKey((const char*)_ssKey.data(), _ssKey.size());
batch.Delete(slKey); batch.Delete(slKey);
// - byte: header // - byte: header
@ -150,7 +151,7 @@ public:
} }
void Seek(const CDataStream& ssKey) { void Seek(const CDataStream& ssKey) {
leveldb::Slice slKey(ssKey.data(), ssKey.size()); leveldb::Slice slKey((const char*)ssKey.data(), ssKey.size());
piter->Seek(slKey); piter->Seek(slKey);
} }
@ -168,7 +169,7 @@ public:
CDataStream GetKey() { CDataStream GetKey() {
leveldb::Slice slKey = piter->key(); leveldb::Slice slKey = piter->key();
return CDataStream(slKey.data(), slKey.data() + slKey.size(), SER_DISK, CLIENT_VERSION); return CDataStream(MakeUCharSpan(slKey), SER_DISK, CLIENT_VERSION);
} }
unsigned int GetKeySize() { unsigned int GetKeySize() {
@ -178,7 +179,7 @@ public:
template<typename V> bool GetValue(V& value) { template<typename V> bool GetValue(V& value) {
leveldb::Slice slValue = piter->value(); leveldb::Slice slValue = piter->value();
try { try {
CDataStream ssValue(slValue.data(), slValue.data() + slValue.size(), SER_DISK, CLIENT_VERSION); CDataStream ssValue(MakeUCharSpan(slValue), SER_DISK, CLIENT_VERSION);
ssValue.Xor(dbwrapper_private::GetObfuscateKey(parent)); ssValue.Xor(dbwrapper_private::GetObfuscateKey(parent));
ssValue >> value; ssValue >> value;
} catch (const std::exception&) { } catch (const std::exception&) {
@ -258,7 +259,7 @@ public:
bool ReadDataStream(const CDataStream& ssKey, CDataStream& ssValue) const bool ReadDataStream(const CDataStream& ssKey, CDataStream& ssValue) const
{ {
leveldb::Slice slKey(ssKey.data(), ssKey.size()); leveldb::Slice slKey((const char*)ssKey.data(), ssKey.size());
std::string strValue; std::string strValue;
leveldb::Status status = pdb->Get(readoptions, slKey, &strValue); leveldb::Status status = pdb->Get(readoptions, slKey, &strValue);
@ -268,7 +269,7 @@ public:
LogPrintf("LevelDB read failure: %s\n", status.ToString()); LogPrintf("LevelDB read failure: %s\n", status.ToString());
dbwrapper_private::HandleError(status); dbwrapper_private::HandleError(status);
} }
CDataStream ssValueTmp(strValue.data(), strValue.data() + strValue.size(), SER_DISK, CLIENT_VERSION); CDataStream ssValueTmp(MakeUCharSpan(strValue), SER_DISK, CLIENT_VERSION);
ssValueTmp.Xor(obfuscate_key); ssValueTmp.Xor(obfuscate_key);
ssValue = std::move(ssValueTmp); ssValue = std::move(ssValueTmp);
return true; return true;
@ -318,7 +319,7 @@ public:
bool Exists(const CDataStream& key) const bool Exists(const CDataStream& key) const
{ {
leveldb::Slice slKey(key.data(), key.size()); leveldb::Slice slKey((const char*)key.data(), key.size());
std::string strValue; std::string strValue;
leveldb::Status status = pdb->Get(readoptions, slKey, &strValue); leveldb::Status status = pdb->Get(readoptions, slKey, &strValue);
@ -362,8 +363,8 @@ public:
ssKey2.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); ssKey2.reserve(DBWRAPPER_PREALLOC_KEY_SIZE);
ssKey1 << key_begin; ssKey1 << key_begin;
ssKey2 << key_end; ssKey2 << key_end;
leveldb::Slice slKey1(ssKey1.data(), ssKey1.size()); leveldb::Slice slKey1((const char*)ssKey1.data(), ssKey1.size());
leveldb::Slice slKey2(ssKey2.data(), ssKey2.size()); leveldb::Slice slKey2((const char*)ssKey2.data(), ssKey2.size());
uint64_t size = 0; uint64_t size = 0;
leveldb::Range range(slKey1, slKey2); leveldb::Range range(slKey1, slKey2);
pdb->GetApproximateSizes(&range, 1, &size); pdb->GetApproximateSizes(&range, 1, &size);
@ -381,8 +382,8 @@ public:
ssKey2.reserve(DBWRAPPER_PREALLOC_KEY_SIZE); ssKey2.reserve(DBWRAPPER_PREALLOC_KEY_SIZE);
ssKey1 << key_begin; ssKey1 << key_begin;
ssKey2 << key_end; ssKey2 << key_end;
leveldb::Slice slKey1(ssKey1.data(), ssKey1.size()); leveldb::Slice slKey1((const char*)ssKey1.data(), ssKey1.size());
leveldb::Slice slKey2(ssKey2.data(), ssKey2.size()); leveldb::Slice slKey2((const char*)ssKey2.data(), ssKey2.size());
pdb->CompactRange(&slKey1, &slKey2); pdb->CompactRange(&slKey1, &slKey2);
} }

View File

@ -51,7 +51,7 @@ void CDKGPendingMessages::PushPendingMessage(NodeId from, CDataStream& vRecv)
auto pm = std::make_shared<CDataStream>(std::move(vRecv)); auto pm = std::make_shared<CDataStream>(std::move(vRecv));
CHashWriter hw(SER_GETHASH, 0); CHashWriter hw(SER_GETHASH, 0);
hw.write(pm->data(), pm->size()); hw.write(reinterpret_cast<const char*>(pm->data()), pm->size());
uint256 hash = hw.GetHash(); uint256 hash = hw.GetHash();
if (from != -1) { if (from != -1) {

View File

@ -461,7 +461,7 @@ bool DecodeBase64PSBT(PartiallySignedTransaction& psbt, const std::string& base6
bool DecodeRawPSBT(PartiallySignedTransaction& psbt, const std::string& tx_data, std::string& error) bool DecodeRawPSBT(PartiallySignedTransaction& psbt, const std::string& tx_data, std::string& error)
{ {
CDataStream ss_data(tx_data.data(), tx_data.data() + tx_data.size(), SER_NETWORK, PROTOCOL_VERSION); CDataStream ss_data(MakeUCharSpan(tx_data), SER_NETWORK, PROTOCOL_VERSION);
try { try {
ss_data >> psbt; ss_data >> psbt;
if (!ss_data.empty()) { if (!ss_data.empty()) {

View File

@ -181,7 +181,7 @@ void RecentRequestsTableModel::addNewRequest(const SendCoinsRecipient &recipient
// called from ctor when loading from wallet // called from ctor when loading from wallet
void RecentRequestsTableModel::addNewRequest(const std::string &recipient) void RecentRequestsTableModel::addNewRequest(const std::string &recipient)
{ {
std::vector<char> data(recipient.begin(), recipient.end()); std::vector<uint8_t> data(recipient.begin(), recipient.end());
CDataStream ss(data, SER_DISK, CLIENT_VERSION); CDataStream ss(data, SER_DISK, CLIENT_VERSION);
RecentRequestEntry entry; RecentRequestEntry entry;

View File

@ -288,7 +288,7 @@ WalletModel::SendCoinsReturn WalletModel::sendCoins(WalletModelTransaction &tran
CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION); CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION);
ssTx << *newTx; ssTx << *newTx;
transaction_array.append(ssTx.data(), ssTx.size()); transaction_array.append((const char*)ssTx.data(), ssTx.size());
} }
// Add addresses / update labels that we've sent to the address book, // Add addresses / update labels that we've sent to the address book,

View File

@ -1306,7 +1306,7 @@ UniValue combinepsbt(const JSONRPCRequest& request)
CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION); CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION);
ssTx << merged_psbt; ssTx << merged_psbt;
return EncodeBase64(ssTx.str()); return EncodeBase64(ssTx);
} }
UniValue finalizepsbt(const JSONRPCRequest& request) UniValue finalizepsbt(const JSONRPCRequest& request)
@ -1434,7 +1434,7 @@ UniValue createpsbt(const JSONRPCRequest& request)
CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION); CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION);
ssTx << psbtx; ssTx << psbtx;
return EncodeBase64(ssTx.str()); return EncodeBase64(ssTx);
} }
UniValue converttopsbt(const JSONRPCRequest& request) UniValue converttopsbt(const JSONRPCRequest& request)
@ -1489,7 +1489,7 @@ UniValue converttopsbt(const JSONRPCRequest& request)
CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION); CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION);
ssTx << psbtx; ssTx << psbtx;
return EncodeBase64(ssTx.str()); return EncodeBase64(ssTx);
} }
UniValue utxoupdatepsbt(const JSONRPCRequest& request) UniValue utxoupdatepsbt(const JSONRPCRequest& request)
@ -1573,7 +1573,7 @@ UniValue utxoupdatepsbt(const JSONRPCRequest& request)
CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION); CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION);
ssTx << psbtx; ssTx << psbtx;
return EncodeBase64(ssTx.str()); return EncodeBase64(ssTx);
} }
UniValue joinpsbts(const JSONRPCRequest& request) UniValue joinpsbts(const JSONRPCRequest& request)
@ -1644,7 +1644,7 @@ UniValue joinpsbts(const JSONRPCRequest& request)
CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION); CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION);
ssTx << merged_psbt; ssTx << merged_psbt;
return EncodeBase64(ssTx.str()); return EncodeBase64(ssTx);
} }
UniValue analyzepsbt(const JSONRPCRequest& request) UniValue analyzepsbt(const JSONRPCRequest& request)

View File

@ -6,17 +6,19 @@
#ifndef BITCOIN_STREAMS_H #ifndef BITCOIN_STREAMS_H
#define BITCOIN_STREAMS_H #define BITCOIN_STREAMS_H
#include <support/allocators/zeroafterfree.h>
#include <serialize.h> #include <serialize.h>
#include <span.h>
#include <support/allocators/zeroafterfree.h>
#include <algorithm> #include <algorithm>
#include <assert.h> #include <assert.h>
#include <ios> #include <ios>
#include <limits> #include <limits>
#include <optional>
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <string>
#include <string.h> #include <string.h>
#include <string>
#include <utility> #include <utility>
#include <vector> #include <vector>
@ -206,14 +208,14 @@ public:
class CDataStream class CDataStream
{ {
protected: protected:
typedef CSerializeData vector_type; using vector_type = SerializeData;
vector_type vch; vector_type vch;
unsigned int nReadPos; unsigned int nReadPos{0};
int nType; int nType;
int nVersion; int nVersion;
public:
public:
typedef vector_type::allocator_type allocator_type; typedef vector_type::allocator_type allocator_type;
typedef vector_type::size_type size_type; typedef vector_type::size_type size_type;
typedef vector_type::difference_type difference_type; typedef vector_type::difference_type difference_type;
@ -225,62 +227,22 @@ public:
typedef vector_type::reverse_iterator reverse_iterator; typedef vector_type::reverse_iterator reverse_iterator;
explicit CDataStream(int nTypeIn, int nVersionIn) explicit CDataStream(int nTypeIn, int nVersionIn)
{ : nType{nTypeIn},
Init(nTypeIn, nVersionIn); nVersion{nVersionIn} {}
}
CDataStream(const_iterator pbegin, const_iterator pend, int nTypeIn, int nVersionIn) : vch(pbegin, pend) explicit CDataStream(Span<const uint8_t> sp, int nTypeIn, int nVersionIn)
{ : vch(sp.data(), sp.data() + sp.size()),
Init(nTypeIn, nVersionIn); nType{nTypeIn},
} nVersion{nVersionIn} {}
CDataStream(const char* pbegin, const char* pend, int nTypeIn, int nVersionIn) : vch(pbegin, pend)
{
Init(nTypeIn, nVersionIn);
}
CDataStream(const vector_type& vchIn, int nTypeIn, int nVersionIn) : vch(vchIn.begin(), vchIn.end())
{
Init(nTypeIn, nVersionIn);
}
CDataStream(const std::vector<char>& vchIn, int nTypeIn, int nVersionIn) : vch(vchIn.begin(), vchIn.end())
{
Init(nTypeIn, nVersionIn);
}
CDataStream(const std::vector<unsigned char>& vchIn, int nTypeIn, int nVersionIn) : vch(vchIn.begin(), vchIn.end())
{
Init(nTypeIn, nVersionIn);
}
template <typename... Args> template <typename... Args>
CDataStream(int nTypeIn, int nVersionIn, Args&&... args) CDataStream(int nTypeIn, int nVersionIn, Args&&... args)
: nType{nTypeIn},
nVersion{nVersionIn}
{ {
Init(nTypeIn, nVersionIn);
::SerializeMany(*this, std::forward<Args>(args)...); ::SerializeMany(*this, std::forward<Args>(args)...);
} }
void Init(int nTypeIn, int nVersionIn)
{
nReadPos = 0;
nType = nTypeIn;
nVersion = nVersionIn;
}
CDataStream& operator+=(const CDataStream& b)
{
vch.insert(vch.end(), b.begin(), b.end());
return *this;
}
friend CDataStream operator+(const CDataStream& a, const CDataStream& b)
{
CDataStream ret = a;
ret += b;
return (ret);
}
std::string str() const std::string str() const
{ {
return (std::string(begin(), end())); return (std::string(begin(), end()));
@ -301,12 +263,12 @@ public:
const_reference operator[](size_type pos) const { return vch[pos + nReadPos]; } const_reference operator[](size_type pos) const { return vch[pos + nReadPos]; }
reference operator[](size_type pos) { return vch[pos + nReadPos]; } reference operator[](size_type pos) { return vch[pos + nReadPos]; }
void clear() { vch.clear(); nReadPos = 0; } void clear() { vch.clear(); nReadPos = 0; }
iterator insert(iterator it, const char x=char()) { return vch.insert(it, x); } iterator insert(iterator it, const uint8_t x) { return vch.insert(it, x); }
void insert(iterator it, size_type n, const char x) { vch.insert(it, n, x); } void insert(iterator it, size_type n, const uint8_t x) { vch.insert(it, n, x); }
value_type* data() { return vch.data() + nReadPos; } value_type* data() { return vch.data() + nReadPos; }
const value_type* data() const { return vch.data() + nReadPos; } const value_type* data() const { return vch.data() + nReadPos; }
void insert(iterator it, std::vector<char>::const_iterator first, std::vector<char>::const_iterator last) void insert(iterator it, std::vector<uint8_t>::const_iterator first, std::vector<uint8_t>::const_iterator last)
{ {
if (last == first) return; if (last == first) return;
assert(last - first > 0); assert(last - first > 0);
@ -377,12 +339,17 @@ public:
nReadPos = 0; nReadPos = 0;
} }
bool Rewind(size_type n) bool Rewind(std::optional<size_type> n = std::nullopt)
{ {
// Total rewind if no size is passed
if (!n) {
nReadPos = 0;
return true;
}
// Rewind by n characters if the buffer hasn't been compacted yet // Rewind by n characters if the buffer hasn't been compacted yet
if (n > nReadPos) if (*n > nReadPos)
return false; return false;
nReadPos -= n; nReadPos -= *n;
return true; return true;
} }
@ -466,11 +433,6 @@ public:
return (*this); return (*this);
} }
void GetAndClear(CSerializeData &d) {
d.insert(d.end(), begin(), end());
clear();
}
/** /**
* XOR the contents of this stream with a certain key. * XOR the contents of this stream with a certain key.
* *

View File

@ -40,7 +40,7 @@ struct zero_after_free_allocator : public std::allocator<T> {
} }
}; };
// Byte-vector that clears its contents before deletion. /** Byte-vector that clears its contents before deletion. */
typedef std::vector<char, zero_after_free_allocator<char> > CSerializeData; using SerializeData = std::vector<uint8_t, zero_after_free_allocator<uint8_t>>;
#endif // BITCOIN_SUPPORT_ALLOCATORS_ZEROAFTERFREE_H #endif // BITCOIN_SUPPORT_ALLOCATORS_ZEROAFTERFREE_H

View File

@ -40,11 +40,7 @@ BOOST_AUTO_TEST_CASE(bloom_create_insert_serialize)
CDataStream stream(SER_NETWORK, PROTOCOL_VERSION); CDataStream stream(SER_NETWORK, PROTOCOL_VERSION);
stream << filter; stream << filter;
std::vector<unsigned char> vch = ParseHex("03614e9b050000000000000001"); std::vector<uint8_t> expected = ParseHex("03614e9b050000000000000001");
std::vector<char> expected(vch.size());
for (unsigned int i = 0; i < vch.size(); i++)
expected[i] = (char)vch[i];
BOOST_CHECK_EQUAL_COLLECTIONS(stream.begin(), stream.end(), expected.begin(), expected.end()); BOOST_CHECK_EQUAL_COLLECTIONS(stream.begin(), stream.end(), expected.begin(), expected.end());
@ -70,11 +66,7 @@ BOOST_AUTO_TEST_CASE(bloom_create_insert_serialize_with_tweak)
CDataStream stream(SER_NETWORK, PROTOCOL_VERSION); CDataStream stream(SER_NETWORK, PROTOCOL_VERSION);
stream << filter; stream << filter;
std::vector<unsigned char> vch = ParseHex("03ce4299050000000100008001"); std::vector<uint8_t> expected = ParseHex("03ce4299050000000100008001");
std::vector<char> expected(vch.size());
for (unsigned int i = 0; i < vch.size(); i++)
expected[i] = (char)vch[i];
BOOST_CHECK_EQUAL_COLLECTIONS(stream.begin(), stream.end(), expected.begin(), expected.end()); BOOST_CHECK_EQUAL_COLLECTIONS(stream.begin(), stream.end(), expected.begin(), expected.end());
} }
@ -94,11 +86,7 @@ BOOST_AUTO_TEST_CASE(bloom_create_insert_key)
CDataStream stream(SER_NETWORK, PROTOCOL_VERSION); CDataStream stream(SER_NETWORK, PROTOCOL_VERSION);
stream << filter; stream << filter;
std::vector<unsigned char> vch = ParseHex("038fc16b080000000000000001"); std::vector<unsigned char> expected = ParseHex("038fc16b080000000000000001");
std::vector<char> expected(vch.size());
for (unsigned int i = 0; i < vch.size(); i++)
expected[i] = (char)vch[i];
BOOST_CHECK_EQUAL_COLLECTIONS(stream.begin(), stream.end(), expected.begin(), expected.end()); BOOST_CHECK_EQUAL_COLLECTIONS(stream.begin(), stream.end(), expected.begin(), expected.end());
} }
@ -454,11 +442,7 @@ BOOST_AUTO_TEST_CASE(merkle_block_3_and_serialize)
CDataStream merkleStream(SER_NETWORK, PROTOCOL_VERSION); CDataStream merkleStream(SER_NETWORK, PROTOCOL_VERSION);
merkleStream << merkleBlock; merkleStream << merkleBlock;
std::vector<unsigned char> vch = ParseHex("0100000079cda856b143d9db2c1caff01d1aecc8630d30625d10e8b4b8b0000000000000b50cc069d6a3e33e3ff84a5c41d9d3febe7c770fdcc96b2c3ff60abe184f196367291b4d4c86041b8fa45d630100000001b50cc069d6a3e33e3ff84a5c41d9d3febe7c770fdcc96b2c3ff60abe184f19630101"); std::vector<uint8_t> expected = ParseHex("0100000079cda856b143d9db2c1caff01d1aecc8630d30625d10e8b4b8b0000000000000b50cc069d6a3e33e3ff84a5c41d9d3febe7c770fdcc96b2c3ff60abe184f196367291b4d4c86041b8fa45d630100000001b50cc069d6a3e33e3ff84a5c41d9d3febe7c770fdcc96b2c3ff60abe184f19630101");
std::vector<char> expected(vch.size());
for (unsigned int i = 0; i < vch.size(); i++)
expected[i] = (char)vch[i];
BOOST_CHECK_EQUAL_COLLECTIONS(expected.begin(), expected.end(), merkleStream.begin(), merkleStream.end()); BOOST_CHECK_EQUAL_COLLECTIONS(expected.begin(), expected.end(), merkleStream.begin(), merkleStream.end());
} }

View File

@ -64,7 +64,7 @@ void CallOneOf(FuzzedDataProvider& fuzzed_data_provider, Callables... callables)
[[ nodiscard ]] inline CDataStream ConsumeDataStream(FuzzedDataProvider& fuzzed_data_provider, const size_t max_length = 4096) noexcept [[ nodiscard ]] inline CDataStream ConsumeDataStream(FuzzedDataProvider& fuzzed_data_provider, const size_t max_length = 4096) noexcept
{ {
return {ConsumeRandomLengthByteVector(fuzzed_data_provider, max_length), SER_NETWORK, INIT_PROTO_VERSION}; return CDataStream{ConsumeRandomLengthByteVector(fuzzed_data_provider, max_length), SER_NETWORK, INIT_PROTO_VERSION};
} }
[[ nodiscard ]] inline std::vector<std::string> ConsumeRandomLengthStringVector(FuzzedDataProvider& fuzzed_data_provider, const size_t max_vector_size = 16, const size_t max_string_length = 16) noexcept [[ nodiscard ]] inline std::vector<std::string> ConsumeRandomLengthStringVector(FuzzedDataProvider& fuzzed_data_provider, const size_t max_vector_size = 16, const size_t max_string_length = 16) noexcept

View File

@ -320,7 +320,7 @@ BOOST_AUTO_TEST_CASE(insert_delete)
ss.insert(ss.end(), c); ss.insert(ss.end(), c);
BOOST_CHECK_EQUAL(ss.size(), 6U); BOOST_CHECK_EQUAL(ss.size(), 6U);
BOOST_CHECK_EQUAL(ss[4], (char)0xff); BOOST_CHECK_EQUAL(ss[4], 0xff);
BOOST_CHECK_EQUAL(ss[5], c); BOOST_CHECK_EQUAL(ss[5], c);
ss.insert(ss.begin()+2, c); ss.insert(ss.begin()+2, c);
@ -334,19 +334,14 @@ BOOST_AUTO_TEST_CASE(insert_delete)
ss.erase(ss.begin()+ss.size()-1); ss.erase(ss.begin()+ss.size()-1);
BOOST_CHECK_EQUAL(ss.size(), 5U); BOOST_CHECK_EQUAL(ss.size(), 5U);
BOOST_CHECK_EQUAL(ss[4], (char)0xff); BOOST_CHECK_EQUAL(ss[4], 0xff);
ss.erase(ss.begin()+1); ss.erase(ss.begin()+1);
BOOST_CHECK_EQUAL(ss.size(), 4U); BOOST_CHECK_EQUAL(ss.size(), 4U);
BOOST_CHECK_EQUAL(ss[0], 0); BOOST_CHECK_EQUAL(ss[0], 0);
BOOST_CHECK_EQUAL(ss[1], 1); BOOST_CHECK_EQUAL(ss[1], 1);
BOOST_CHECK_EQUAL(ss[2], 2); BOOST_CHECK_EQUAL(ss[2], 2);
BOOST_CHECK_EQUAL(ss[3], (char)0xff); BOOST_CHECK_EQUAL(ss[3], 0xff);
// Make sure GetAndClear does the right thing:
CSerializeData d;
ss.GetAndClear(d);
BOOST_CHECK_EQUAL(ss.size(), 0U);
} }
// Change struct size and check if it can be deserialized // Change struct size and check if it can be deserialized

View File

@ -160,7 +160,7 @@ BOOST_AUTO_TEST_CASE(bitstream_reader_writer)
BOOST_AUTO_TEST_CASE(streams_serializedata_xor) BOOST_AUTO_TEST_CASE(streams_serializedata_xor)
{ {
std::vector<char> in; std::vector<uint8_t> in;
std::vector<char> expected_xor; std::vector<char> expected_xor;
std::vector<unsigned char> key; std::vector<unsigned char> key;
CDataStream ds(in, 0, 0); CDataStream ds(in, 0, 0);

View File

@ -488,9 +488,9 @@ bool BerkeleyDatabase::Rewrite(const char* pszSkip)
break; break;
} }
if (pszSkip && if (pszSkip &&
strncmp(ssKey.data(), pszSkip, std::min(ssKey.size(), strlen(pszSkip))) == 0) strncmp((const char*)ssKey.data(), pszSkip, std::min(ssKey.size(), strlen(pszSkip))) == 0)
continue; continue;
if (strncmp(ssKey.data(), "\x07version", 8) == 0) { if (strncmp((const char*)ssKey.data(), "\x07version", 8) == 0) {
// Update version: // Update version:
ssValue.clear(); ssValue.clear();
ssValue << CLIENT_VERSION; ssValue << CLIENT_VERSION;