@@ -53,9 +53,9 @@ struct invalid_fuzzing_input_exception : public std::exception {
53
53
};
54
54
55
55
template <typename T>
56
- CDataStream Serialize (const T& obj, const int version = INIT_PROTO_VERSION)
56
+ CDataStream Serialize (const T& obj, const int version = INIT_PROTO_VERSION, const int ser_type = SER_NETWORK )
57
57
{
58
- CDataStream ds (SER_NETWORK , version);
58
+ CDataStream ds (ser_type , version);
59
59
ds << obj;
60
60
return ds;
61
61
}
@@ -69,9 +69,9 @@ T Deserialize(CDataStream ds)
69
69
}
70
70
71
71
template <typename T>
72
- void DeserializeFromFuzzingInput (FuzzBufferType buffer, T& obj, const std::optional<int > protocol_version = std::nullopt)
72
+ void DeserializeFromFuzzingInput (FuzzBufferType buffer, T& obj, const std::optional<int > protocol_version = std::nullopt, const int ser_type = SER_NETWORK )
73
73
{
74
- CDataStream ds (buffer, SER_NETWORK , INIT_PROTO_VERSION);
74
+ CDataStream ds (buffer, ser_type , INIT_PROTO_VERSION);
75
75
if (protocol_version) {
76
76
ds.SetVersion (*protocol_version);
77
77
} else {
@@ -92,9 +92,9 @@ void DeserializeFromFuzzingInput(FuzzBufferType buffer, T& obj, const std::optio
92
92
}
93
93
94
94
template <typename T>
95
- void AssertEqualAfterSerializeDeserialize (const T& obj, const int version = INIT_PROTO_VERSION)
95
+ void AssertEqualAfterSerializeDeserialize (const T& obj, const int version = INIT_PROTO_VERSION, const int ser_type = SER_NETWORK )
96
96
{
97
- assert (Deserialize<T>(Serialize (obj, version)) == obj);
97
+ assert (Deserialize<T>(Serialize (obj, version, ser_type )) == obj);
98
98
}
99
99
100
100
} // namespace
@@ -251,9 +251,37 @@ FUZZ_TARGET_DESERIALIZE(messageheader_deserialize, {
251
251
DeserializeFromFuzzingInput (buffer, mh);
252
252
(void )mh.IsCommandValid ();
253
253
})
254
- FUZZ_TARGET_DESERIALIZE(address_deserialize , {
254
+ FUZZ_TARGET_DESERIALIZE(address_deserialize_v1_notime , {
255
255
CAddress a;
256
- DeserializeFromFuzzingInput (buffer, a);
256
+ DeserializeFromFuzzingInput (buffer, a, INIT_PROTO_VERSION);
257
+ // A CAddress without nTime (as is expected under INIT_PROTO_VERSION) will roundtrip
258
+ // in all 5 formats (with/without nTime, v1/v2, network/disk)
259
+ AssertEqualAfterSerializeDeserialize (a, INIT_PROTO_VERSION);
260
+ AssertEqualAfterSerializeDeserialize (a, PROTOCOL_VERSION);
261
+ AssertEqualAfterSerializeDeserialize (a, 0 , SER_DISK);
262
+ AssertEqualAfterSerializeDeserialize (a, PROTOCOL_VERSION | ADDRV2_FORMAT);
263
+ AssertEqualAfterSerializeDeserialize (a, ADDRV2_FORMAT, SER_DISK);
264
+ })
265
+ FUZZ_TARGET_DESERIALIZE(address_deserialize_v1_withtime, {
266
+ CAddress a;
267
+ DeserializeFromFuzzingInput (buffer, a, PROTOCOL_VERSION);
268
+ // A CAddress in V1 mode will roundtrip in all 4 formats that have nTime.
269
+ AssertEqualAfterSerializeDeserialize (a, PROTOCOL_VERSION);
270
+ AssertEqualAfterSerializeDeserialize (a, 0 , SER_DISK);
271
+ AssertEqualAfterSerializeDeserialize (a, PROTOCOL_VERSION | ADDRV2_FORMAT);
272
+ AssertEqualAfterSerializeDeserialize (a, ADDRV2_FORMAT, SER_DISK);
273
+ })
274
+ FUZZ_TARGET_DESERIALIZE(address_deserialize_v2, {
275
+ CAddress a;
276
+ DeserializeFromFuzzingInput (buffer, a, PROTOCOL_VERSION | ADDRV2_FORMAT);
277
+ // A CAddress in V2 mode will roundtrip in both V2 formats, and also in the V1 formats
278
+ // with time if it's V1 compatible.
279
+ if (a.IsAddrV1Compatible ()) {
280
+ AssertEqualAfterSerializeDeserialize (a, PROTOCOL_VERSION);
281
+ AssertEqualAfterSerializeDeserialize (a, 0 , SER_DISK);
282
+ }
283
+ AssertEqualAfterSerializeDeserialize (a, PROTOCOL_VERSION | ADDRV2_FORMAT);
284
+ AssertEqualAfterSerializeDeserialize (a, ADDRV2_FORMAT, SER_DISK);
257
285
})
258
286
FUZZ_TARGET_DESERIALIZE(inv_deserialize, {
259
287
CInv i;
0 commit comments