Skip to content

Commit 0e3a78a

Browse files
fuzz: Check for addrv1 compatibility before using addrv1 serializer/deserializer on CSubNet
1 parent 7e37329 commit 0e3a78a

File tree

1 file changed

+21
-10
lines changed

1 file changed

+21
-10
lines changed

src/test/fuzz/deserialize.cpp

Lines changed: 21 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);

0 commit comments

Comments
 (0)