mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-03-04 13:55:23 -05:00
Merge #20355: fuzz: Check for addrv1 compatibility before using addrv1 serializer/deserializer on CSubNet
79b8f8d574
fuzz: Assert roundtrip equality for both addrv1 and addrv2 versions of CService (practicalswift)0e3a78a8ab
fuzz: Check for addrv1 compatibility before using addrv1 serializer/deserializer on CSubNet (practicalswift) Pull request description: Check for `addrv1` compatibility before using `addrv1` serializer/deserializer on `CSubNet`. As requested by MarcoFalke in https://github.com/bitcoin/bitcoin/pull/20289#issuecomment-724012969. Assert roundtrip equality for both `addrv1` and `addrv2` versions of `CService`. ACKs for top commit: MarcoFalke: review ACK79b8f8d574
Tree-SHA512: 3f758aa89ab0c253b593fbe8fe9adc5c6db9afec8856facfe635053a32b4feb438c951323ae0c9e27f1d7e89d12a9b62d81f094dc96159233c12f64d4b95c290
This commit is contained in:
commit
0b69bb90ee
1 changed files with 28 additions and 10 deletions
|
@ -15,6 +15,7 @@
|
||||||
#include <net.h>
|
#include <net.h>
|
||||||
#include <netbase.h>
|
#include <netbase.h>
|
||||||
#include <node/utxo_snapshot.h>
|
#include <node/utxo_snapshot.h>
|
||||||
|
#include <optional.h>
|
||||||
#include <primitives/block.h>
|
#include <primitives/block.h>
|
||||||
#include <protocol.h>
|
#include <protocol.h>
|
||||||
#include <psbt.h>
|
#include <psbt.h>
|
||||||
|
@ -61,15 +62,19 @@ T Deserialize(CDataStream ds)
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void DeserializeFromFuzzingInput(const std::vector<uint8_t>& buffer, T& obj)
|
void DeserializeFromFuzzingInput(const std::vector<uint8_t>& buffer, T& obj, const Optional<int> protocol_version = nullopt)
|
||||||
{
|
{
|
||||||
CDataStream ds(buffer, SER_NETWORK, INIT_PROTO_VERSION);
|
CDataStream ds(buffer, SER_NETWORK, INIT_PROTO_VERSION);
|
||||||
try {
|
if (protocol_version) {
|
||||||
int version;
|
ds.SetVersion(*protocol_version);
|
||||||
ds >> version;
|
} else {
|
||||||
ds.SetVersion(version);
|
try {
|
||||||
} catch (const std::ios_base::failure&) {
|
int version;
|
||||||
throw invalid_fuzzing_input_exception();
|
ds >> version;
|
||||||
|
ds.SetVersion(version);
|
||||||
|
} catch (const std::ios_base::failure&) {
|
||||||
|
throw invalid_fuzzing_input_exception();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
ds >> obj;
|
ds >> obj;
|
||||||
|
@ -125,9 +130,15 @@ void test_one_input(const std::vector<uint8_t>& buffer)
|
||||||
CScript script;
|
CScript script;
|
||||||
DeserializeFromFuzzingInput(buffer, script);
|
DeserializeFromFuzzingInput(buffer, script);
|
||||||
#elif SUB_NET_DESERIALIZE
|
#elif SUB_NET_DESERIALIZE
|
||||||
CSubNet sub_net;
|
CSubNet sub_net_1;
|
||||||
DeserializeFromFuzzingInput(buffer, sub_net);
|
DeserializeFromFuzzingInput(buffer, sub_net_1, INIT_PROTO_VERSION);
|
||||||
AssertEqualAfterSerializeDeserialize(sub_net);
|
AssertEqualAfterSerializeDeserialize(sub_net_1, INIT_PROTO_VERSION);
|
||||||
|
CSubNet sub_net_2;
|
||||||
|
DeserializeFromFuzzingInput(buffer, sub_net_2, INIT_PROTO_VERSION | ADDRV2_FORMAT);
|
||||||
|
AssertEqualAfterSerializeDeserialize(sub_net_2, INIT_PROTO_VERSION | ADDRV2_FORMAT);
|
||||||
|
CSubNet sub_net_3;
|
||||||
|
DeserializeFromFuzzingInput(buffer, sub_net_3);
|
||||||
|
AssertEqualAfterSerializeDeserialize(sub_net_3, INIT_PROTO_VERSION | ADDRV2_FORMAT);
|
||||||
#elif TX_IN_DESERIALIZE
|
#elif TX_IN_DESERIALIZE
|
||||||
CTxIn tx_in;
|
CTxIn tx_in;
|
||||||
DeserializeFromFuzzingInput(buffer, tx_in);
|
DeserializeFromFuzzingInput(buffer, tx_in);
|
||||||
|
@ -195,6 +206,13 @@ void test_one_input(const std::vector<uint8_t>& buffer)
|
||||||
AssertEqualAfterSerializeDeserialize(s);
|
AssertEqualAfterSerializeDeserialize(s);
|
||||||
}
|
}
|
||||||
AssertEqualAfterSerializeDeserialize(s, INIT_PROTO_VERSION | ADDRV2_FORMAT);
|
AssertEqualAfterSerializeDeserialize(s, INIT_PROTO_VERSION | ADDRV2_FORMAT);
|
||||||
|
CService s1;
|
||||||
|
DeserializeFromFuzzingInput(buffer, s1, INIT_PROTO_VERSION);
|
||||||
|
AssertEqualAfterSerializeDeserialize(s1, INIT_PROTO_VERSION);
|
||||||
|
assert(s1.IsAddrV1Compatible());
|
||||||
|
CService s2;
|
||||||
|
DeserializeFromFuzzingInput(buffer, s2, INIT_PROTO_VERSION | ADDRV2_FORMAT);
|
||||||
|
AssertEqualAfterSerializeDeserialize(s2, INIT_PROTO_VERSION | ADDRV2_FORMAT);
|
||||||
#elif MESSAGEHEADER_DESERIALIZE
|
#elif MESSAGEHEADER_DESERIALIZE
|
||||||
CMessageHeader mh;
|
CMessageHeader mh;
|
||||||
DeserializeFromFuzzingInput(buffer, mh);
|
DeserializeFromFuzzingInput(buffer, mh);
|
||||||
|
|
Loading…
Add table
Reference in a new issue