|
15 | 15 | #include <net.h>
|
16 | 16 | #include <netbase.h>
|
17 | 17 | #include <node/utxo_snapshot.h>
|
| 18 | +#include <optional.h> |
18 | 19 | #include <primitives/block.h>
|
19 | 20 | #include <protocol.h>
|
20 | 21 | #include <psbt.h>
|
@@ -61,15 +62,19 @@ T Deserialize(CDataStream ds)
|
61 | 62 | }
|
62 | 63 |
|
63 | 64 | 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) |
65 | 66 | {
|
66 | 67 | 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 | + } |
73 | 78 | }
|
74 | 79 | try {
|
75 | 80 | ds >> obj;
|
@@ -125,9 +130,15 @@ void test_one_input(const std::vector<uint8_t>& buffer)
|
125 | 130 | CScript script;
|
126 | 131 | DeserializeFromFuzzingInput(buffer, script);
|
127 | 132 | #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); |
131 | 142 | #elif TX_IN_DESERIALIZE
|
132 | 143 | CTxIn tx_in;
|
133 | 144 | DeserializeFromFuzzingInput(buffer, tx_in);
|
@@ -195,6 +206,13 @@ void test_one_input(const std::vector<uint8_t>& buffer)
|
195 | 206 | AssertEqualAfterSerializeDeserialize(s);
|
196 | 207 | }
|
197 | 208 | 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); |
198 | 216 | #elif MESSAGEHEADER_DESERIALIZE
|
199 | 217 | CMessageHeader mh;
|
200 | 218 | DeserializeFromFuzzingInput(buffer, mh);
|
|
0 commit comments