Bitcoin Core 31.0.0
P2P Digital Currency
Loading...
Searching...
No Matches
banman.cpp
Go to the documentation of this file.
1// Copyright (c) 2020-present The Bitcoin Core developers
2// Distributed under the MIT software license, see the accompanying
3// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5#include <banman.h>
6#include <common/args.h>
7#include <netaddress.h>
9#include <test/fuzz/fuzz.h>
10#include <test/fuzz/util.h>
11#include <test/fuzz/util/net.h>
13#include <util/fs.h>
14#include <util/readwritefile.h>
15
16#include <cassert>
17#include <cstdint>
18#include <limits>
19#include <string>
20#include <vector>
21
22namespace {
24{
25 // Avoid signed integer overflow by capping to int32_t max:
26 // banman.cpp:137:73: runtime error: signed integer overflow: 1591700817 + 9223372036854775807 cannot be represented in type 'long'
27 return fuzzed_data_provider.ConsumeIntegralInRange<int64_t>(std::numeric_limits<int64_t>::min(), std::numeric_limits<int32_t>::max());
28}
29} // namespace
30
32{
33 static const auto testing_setup = MakeNoLogFileContext<>();
34}
35
36static bool operator==(const CBanEntry& lhs, const CBanEntry& rhs)
37{
38 return lhs.nVersion == rhs.nVersion &&
39 lhs.nCreateTime == rhs.nCreateTime &&
40 lhs.nBanUntil == rhs.nBanUntil;
41}
42
44{
46 FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
48 fs::path banlist_file = gArgs.GetDataDirNet() / "fuzzed_banlist";
49
55 } else {
58 banlist_file = fs::path{"path"} / "to" / "inaccessible" / "fuzzed_banlist";
59 }
60 }
61
62 {
63 BanMan ban_man{banlist_file, /*client_interface=*/nullptr, /*default_ban_time=*/ConsumeBanTimeOffset(fuzzed_data_provider)};
64 // The complexity is O(N^2), where N is the input size, because each call
65 // might call DumpBanlist (or other methods that are at least linear
66 // complexity of the input size).
67 bool contains_invalid{false};
69 {
72 [&] {
74 if (!net_addr.IsCJDNS() || !net_addr.IsValid()) {
75 const std::optional<CNetAddr>& addr{LookupHost(net_addr.ToStringAddr(), /*fAllowLookup=*/false)};
76 if (addr.has_value() && addr->IsValid()) {
77 net_addr = *addr;
78 } else {
79 contains_invalid = true;
80 }
81 }
85 },
86 [&] {
88 subnet = LookupSubNet(subnet.ToString());
89 if (!subnet.IsValid()) {
90 contains_invalid = true;
91 }
95 },
96 [&] {
97 ban_man.ClearBanned();
98 },
99 [&] {
101 },
102 [&] {
104 },
105 [&] {
107 },
108 [&] {
110 },
111 [&] {
113 ban_man.GetBanned(banmap);
114 },
115 [&] {
116 ban_man.DumpBanlist();
117 },
118 [&] {
120 },
121 [&] {
123 });
124 }
129 ban_man.GetBanned(banmap);
130 BanMan ban_man_read{banlist_file, /*client_interface=*/nullptr, /*default_ban_time=*/0};
133 if (!contains_invalid) {
135 }
136 }
137 }
138 fs::remove(fs::PathToString(banlist_file + ".json"));
139}
ArgsManager gArgs
Definition args.cpp:40
fs::path GetDataDirNet() const
Get data directory path with appended network identifier.
Definition args.h:239
void DumpBanlist() EXCLUSIVE_LOCKS_REQUIRED(!m_banned_mutex)
Definition banman.cpp:48
void GetBanned(banmap_t &banmap) EXCLUSIVE_LOCKS_REQUIRED(!m_banned_mutex)
Definition banman.cpp:174
Definition net_types.h:15
Network address.
Definition netaddress.h:113
std::string ConsumeRandomLengthString(size_t max_length)
T ConsumeIntegralInRange(T min, T max)
static std::string PathToString(const path &path)
Convert path object to a byte string.
Definition fs.h:157
#define FUZZ_TARGET(...)
Definition fuzz.h:35
#define LIMITED_WHILE(condition, limit)
Can be used to limit a theoretically unbounded loop.
Definition fuzz.h:22
std::map< CSubNet, CBanEntry > banmap_t
Definition net_types.h:41
CSubNet LookupSubNet(const std::string &subnet_str)
Parse and resolve a specified subnet string into the appropriate internal representation.
Definition netbase.cpp:812
std::vector< CNetAddr > LookupHost(const std::string &name, unsigned int nMaxSolutions, bool fAllowLookup, DNSLookupFn dns_lookup_function)
Resolve a host string to its corresponding network addresses.
Definition netbase.cpp:173
bool WriteBinaryFile(const fs::path &filename, const std::string &data)
Write contents of std::string to a file.
void initialize_banman()
Definition banman.cpp:31
static bool operator==(const CBanEntry &lhs, const CBanEntry &rhs)
Definition banman.cpp:36
CNetAddr ConsumeNetAddr(FuzzedDataProvider &fuzzed_data_provider, FastRandomContext *rand) noexcept
Create a CNetAddr.
Definition net.cpp:29
CSubNet ConsumeSubNet(FuzzedDataProvider &fuzzed_data_provider) noexcept
Definition net.h:245
NodeSeconds ConsumeTime(FuzzedDataProvider &fuzzed_data_provider, const std::optional< int64_t > &min, const std::optional< int64_t > &max) noexcept
Definition util.cpp:34
size_t CallOneOf(FuzzedDataProvider &fuzzed_data_provider, Callables... callables)
Definition util.h:35
void SeedRandomStateForTest(SeedRand seedtype)
Seed the global RNG state for testing and log the seed value.
Definition random.cpp:19
@ ZEROS
Seed with a compile time constant of zeros.
void SetMockTime(int64_t nMockTimeIn)
DEPRECATED Use SetMockTime with chrono type.
Definition time.cpp:44
constexpr auto Ticks(Dur2 d)
Helper to count the seconds of a duration/time_point.
Definition time.h:73
assert(!tx.IsCoinBase())
FuzzedDataProvider & fuzzed_data_provider
Definition fees.cpp:38