|
10 | 10 | #include <attributes.h>
|
11 | 11 | #include <coins.h>
|
12 | 12 | #include <consensus/consensus.h>
|
| 13 | +#include <netaddress.h> |
13 | 14 | #include <primitives/transaction.h>
|
14 | 15 | #include <script/script.h>
|
15 | 16 | #include <script/standard.h>
|
@@ -228,4 +229,31 @@ NODISCARD inline std::vector<uint8_t> ConsumeFixedLengthByteVector(FuzzedDataPro
|
228 | 229 | return result;
|
229 | 230 | }
|
230 | 231 |
|
| 232 | +CNetAddr ConsumeNetAddr(FuzzedDataProvider& fuzzed_data_provider) noexcept |
| 233 | +{ |
| 234 | + const Network network = fuzzed_data_provider.PickValueInArray({Network::NET_IPV4, Network::NET_IPV6, Network::NET_INTERNAL, Network::NET_ONION}); |
| 235 | + CNetAddr net_addr; |
| 236 | + if (network == Network::NET_IPV4) { |
| 237 | + const in_addr v4_addr = { |
| 238 | + .s_addr = fuzzed_data_provider.ConsumeIntegral<uint32_t>()}; |
| 239 | + net_addr = CNetAddr{v4_addr}; |
| 240 | + } else if (network == Network::NET_IPV6) { |
| 241 | + if (fuzzed_data_provider.remaining_bytes() >= 16) { |
| 242 | + in6_addr v6_addr = {}; |
| 243 | + memcpy(v6_addr.s6_addr, fuzzed_data_provider.ConsumeBytes<uint8_t>(16).data(), 16); |
| 244 | + net_addr = CNetAddr{v6_addr, fuzzed_data_provider.ConsumeIntegral<uint32_t>()}; |
| 245 | + } |
| 246 | + } else if (network == Network::NET_INTERNAL) { |
| 247 | + net_addr.SetInternal(fuzzed_data_provider.ConsumeBytesAsString(32)); |
| 248 | + } else if (network == Network::NET_ONION) { |
| 249 | + net_addr.SetSpecial(fuzzed_data_provider.ConsumeBytesAsString(32)); |
| 250 | + } |
| 251 | + return net_addr; |
| 252 | +} |
| 253 | + |
| 254 | +CSubNet ConsumeSubNet(FuzzedDataProvider& fuzzed_data_provider) noexcept |
| 255 | +{ |
| 256 | + return {ConsumeNetAddr(fuzzed_data_provider), fuzzed_data_provider.ConsumeIntegral<int32_t>()}; |
| 257 | +} |
| 258 | + |
231 | 259 | #endif // BITCOIN_TEST_FUZZ_UTIL_H
|
0 commit comments