Skip to content

Commit 0b69bb9

Browse files
author
MarcoFalke
committed
Merge #20355: fuzz: Check for addrv1 compatibility before using addrv1 serializer/deserializer on CSubNet
79b8f8d fuzz: Assert roundtrip equality for both addrv1 and addrv2 versions of CService (practicalswift) 0e3a78a 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 bitcoin/bitcoin#20289 (comment). Assert roundtrip equality for both `addrv1` and `addrv2` versions of `CService`. ACKs for top commit: MarcoFalke: review ACK 79b8f8d Tree-SHA512: 3f758aa89ab0c253b593fbe8fe9adc5c6db9afec8856facfe635053a32b4feb438c951323ae0c9e27f1d7e89d12a9b62d81f094dc96159233c12f64d4b95c290
2 parents 1dfe19e + 79b8f8d commit 0b69bb9

File tree

1 file changed

+28
-10
lines changed

1 file changed

+28
-10
lines changed

src/test/fuzz/deserialize.cpp

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <net.h>
1616
#include <netbase.h>
1717
#include <node/utxo_snapshot.h>
18+
#include <optional.h>
1819
#include <primitives/block.h>
1920
#include <protocol.h>
2021
#include <psbt.h>
@@ -61,15 +62,19 @@ T Deserialize(CDataStream ds)
6162
}
6263

6364
template <typename T>
64-
void DeserializeFromFuzzingInput(const std::vector<uint8_t>& buffer, T& obj)
65+
void DeserializeFromFuzzingInput(const std::vector<uint8_t>& buffer, T& obj, const Optional<int> protocol_version = nullopt)
6566
{
6667
CDataStream ds(buffer, SER_NETWORK, INIT_PROTO_VERSION);
67-
try {
68-
int version;
69-
ds >> version;
70-
ds.SetVersion(version);
71-
} catch (const std::ios_base::failure&) {
72-
throw invalid_fuzzing_input_exception();
68+
if (protocol_version) {
69+
ds.SetVersion(*protocol_version);
70+
} else {
71+
try {
72+
int version;
73+
ds >> version;
74+
ds.SetVersion(version);
75+
} catch (const std::ios_base::failure&) {
76+
throw invalid_fuzzing_input_exception();
77+
}
7378
}
7479
try {
7580
ds >> obj;
@@ -125,9 +130,15 @@ void test_one_input(const std::vector<uint8_t>& buffer)
125130
CScript script;
126131
DeserializeFromFuzzingInput(buffer, script);
127132
#elif SUB_NET_DESERIALIZE
128-
CSubNet sub_net;
129-
DeserializeFromFuzzingInput(buffer, sub_net);
130-
AssertEqualAfterSerializeDeserialize(sub_net);
133+
CSubNet sub_net_1;
134+
DeserializeFromFuzzingInput(buffer, sub_net_1, INIT_PROTO_VERSION);
135+
AssertEqualAfterSerializeDeserialize(sub_net_1, INIT_PROTO_VERSION);
136+
CSubNet sub_net_2;
137+
DeserializeFromFuzzingInput(buffer, sub_net_2, INIT_PROTO_VERSION | ADDRV2_FORMAT);
138+
AssertEqualAfterSerializeDeserialize(sub_net_2, INIT_PROTO_VERSION | ADDRV2_FORMAT);
139+
CSubNet sub_net_3;
140+
DeserializeFromFuzzingInput(buffer, sub_net_3);
141+
AssertEqualAfterSerializeDeserialize(sub_net_3, INIT_PROTO_VERSION | ADDRV2_FORMAT);
131142
#elif TX_IN_DESERIALIZE
132143
CTxIn tx_in;
133144
DeserializeFromFuzzingInput(buffer, tx_in);
@@ -195,6 +206,13 @@ void test_one_input(const std::vector<uint8_t>& buffer)
195206
AssertEqualAfterSerializeDeserialize(s);
196207
}
197208
AssertEqualAfterSerializeDeserialize(s, INIT_PROTO_VERSION | ADDRV2_FORMAT);
209+
CService s1;
210+
DeserializeFromFuzzingInput(buffer, s1, INIT_PROTO_VERSION);
211+
AssertEqualAfterSerializeDeserialize(s1, INIT_PROTO_VERSION);
212+
assert(s1.IsAddrV1Compatible());
213+
CService s2;
214+
DeserializeFromFuzzingInput(buffer, s2, INIT_PROTO_VERSION | ADDRV2_FORMAT);
215+
AssertEqualAfterSerializeDeserialize(s2, INIT_PROTO_VERSION | ADDRV2_FORMAT);
198216
#elif MESSAGEHEADER_DESERIALIZE
199217
CMessageHeader mh;
200218
DeserializeFromFuzzingInput(buffer, mh);

0 commit comments

Comments
 (0)