Changeset View
Changeset View
Standalone View
Standalone View
src/test/fuzz/netaddress.cpp
// Copyright (c) 2020 The Bitcoin Core developers | // Copyright (c) 2020 The Bitcoin Core developers | ||||
// Distributed under the MIT software license, see the accompanying | // Distributed under the MIT software license, see the accompanying | ||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | // file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
#include <netaddress.h> | #include <netaddress.h> | ||||
#include <test/fuzz/FuzzedDataProvider.h> | #include <test/fuzz/FuzzedDataProvider.h> | ||||
#include <test/fuzz/fuzz.h> | #include <test/fuzz/fuzz.h> | ||||
#include <test/fuzz/util.h> | |||||
#include <cassert> | #include <cassert> | ||||
#include <cstdint> | #include <cstdint> | ||||
#include <netinet/in.h> | #include <netinet/in.h> | ||||
#include <vector> | #include <vector> | ||||
namespace { | |||||
CNetAddr ConsumeNetAddr(FuzzedDataProvider &fuzzed_data_provider) noexcept { | |||||
const Network network = fuzzed_data_provider.PickValueInArray( | |||||
{Network::NET_IPV4, Network::NET_IPV6, Network::NET_INTERNAL, | |||||
Network::NET_ONION}); | |||||
if (network == Network::NET_IPV4) { | |||||
const in_addr v4_addr = { | |||||
.s_addr = fuzzed_data_provider.ConsumeIntegral<uint32_t>()}; | |||||
return CNetAddr{v4_addr}; | |||||
} else if (network == Network::NET_IPV6) { | |||||
if (fuzzed_data_provider.remaining_bytes() < 16) { | |||||
return CNetAddr{}; | |||||
} | |||||
in6_addr v6_addr = {}; | |||||
memcpy(v6_addr.s6_addr, | |||||
fuzzed_data_provider.ConsumeBytes<uint8_t>(16).data(), 16); | |||||
return CNetAddr{v6_addr, | |||||
fuzzed_data_provider.ConsumeIntegral<uint32_t>()}; | |||||
} else if (network == Network::NET_INTERNAL) { | |||||
CNetAddr net_addr; | |||||
net_addr.SetInternal(fuzzed_data_provider.ConsumeBytesAsString(32)); | |||||
return net_addr; | |||||
} else if (network == Network::NET_ONION) { | |||||
CNetAddr net_addr; | |||||
net_addr.SetSpecial(fuzzed_data_provider.ConsumeBytesAsString(32)); | |||||
return net_addr; | |||||
} else { | |||||
assert(false); | |||||
} | |||||
} | |||||
}; // namespace | |||||
void test_one_input(const std::vector<uint8_t> &buffer) { | void test_one_input(const std::vector<uint8_t> &buffer) { | ||||
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size()); | FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size()); | ||||
const CNetAddr net_addr = ConsumeNetAddr(fuzzed_data_provider); | const CNetAddr net_addr = ConsumeNetAddr(fuzzed_data_provider); | ||||
for (int i = 0; i < 15; ++i) { | for (int i = 0; i < 15; ++i) { | ||||
(void)net_addr.GetByte(i); | (void)net_addr.GetByte(i); | ||||
} | } | ||||
(void)net_addr.GetHash(); | (void)net_addr.GetHash(); | ||||
▲ Show 20 Lines • Show All 94 Lines • Show Last 20 Lines |