37 static constexpr std::array<NetAux, 6> nets{
46 const size_t nets_index{rand ==
nullptr
48 :
static_cast<size_t>(rand->randrange(nets.size()))};
50 const auto& aux = nets[nets_index];
55 if (rand ==
nullptr) {
58 const auto v = rand->randbytes(32);
66 s << static_cast<uint8_t>(aux.bip155);
68 std::vector<uint8_t> addr_bytes;
69 if (rand ==
nullptr) {
71 addr_bytes.resize(aux.len);
73 addr_bytes = rand->randbytes(aux.len);
96 constexpr std::array ADDR_ENCODINGS{
100 constexpr std::array ADDR_FORMATS{
104 if constexpr (std::is_same_v<P, CNetAddr::SerParams>) {
107 if constexpr (std::is_same_v<P, CAddress::SerParams>) {
140 assert(
false &&
"Move of Sock into FuzzedSock not allowed.");
146 constexpr std::array send_errnos{
181 constexpr std::array recv_errnos{
193 assert(buf !=
nullptr || len == 0);
197 std::this_thread::sleep_for(std::chrono::milliseconds{2});
208 size_t copied_so_far{0};
212 const size_t copy_len{std::min(len,
m_peek_data.size())};
214 copied_so_far += copy_len;
215 if ((
flags & MSG_PEEK) == 0) {
220 if (copied_so_far == len) {
221 return copied_so_far;
225 if (new_data.empty())
return copied_so_far;
227 std::memcpy(
reinterpret_cast<uint8_t*
>(buf) + copied_so_far, new_data.data(), new_data.size());
228 copied_so_far += new_data.size();
230 if ((
flags & MSG_PEEK) != 0) {
235 return copied_so_far;
239 std::memset(
reinterpret_cast<uint8_t*
>(buf) + copied_so_far, 0x0, len - copied_so_far);
249 constexpr std::array connect_errnos{
273 constexpr std::array bind_errnos{
293 constexpr std::array listen_errnos{
307 constexpr std::array accept_errnos{
314 return std::unique_ptr<FuzzedSock>();
316 if (addr !=
nullptr) {
318 memset(addr, 0x00, *addr_len);
321 const socklen_t write_len =
static_cast<socklen_t
>(
sizeof(sockaddr_in));
322 if (*addr_len >= write_len) {
323 *addr_len = write_len;
324 auto addr4 =
reinterpret_cast<sockaddr_in*
>(addr);
325 addr4->sin_family = AF_INET;
327 std::ranges::copy(sin_addr_bytes,
reinterpret_cast<std::byte*
>(&addr4->sin_addr));
332 const socklen_t write_len =
static_cast<socklen_t
>(
sizeof(sockaddr_in6));
333 if (*addr_len >= write_len) {
334 *addr_len = write_len;
335 auto addr6 =
reinterpret_cast<sockaddr_in6*
>(addr);
336 addr6->sin6_family = AF_INET6;
338 std::ranges::copy(sin_addr_bytes,
reinterpret_cast<std::byte*
>(&addr6->sin6_addr));
348 constexpr std::array getsockopt_errnos{
356 if (opt_val ==
nullptr) {
367 constexpr std::array setsockopt_errnos{
380 constexpr std::array getsockname_errnos{
390 if (bytes.size() < (
int)
sizeof(sockaddr))
return -1;
391 std::memcpy(
name, bytes.data(), bytes.size());
392 *name_len = bytes.size();
398 constexpr std::array setnonblocking_errnos{
416 constexpr std::array wait_errnos{
425 if (occurred !=
nullptr) {
437 for (
auto& [sock, events] : events_per_sock) {
453 errmsg =
"disconnected at random by the fuzzer";
464 connman.Handshake(
node, successfully_connected, remote_services, local_services, version, relay_txs);
A CService with information about it as peer.
static constexpr SerParams V2_NETWORK
bool SetInternal(const std::string &name)
Create an "internal" address that represents a name or FQDN.
BIP155Network
BIP155 network ids recognized by this software.
Information about a peer.
Double ended buffer combining vector and stream-like interfaces.
std::string ConsumeBytesAsString(size_t num_bytes)
std::vector< T > ConsumeBytes(size_t num_bytes)
T ConsumeIntegralInRange(T min, T max)
std::unique_ptr< Sock > Accept(sockaddr *addr, socklen_t *addr_len) const override
accept(2) wrapper.
int GetSockOpt(int level, int opt_name, void *opt_val, socklen_t *opt_len) const override
getsockopt(2) wrapper.
bool Wait(std::chrono::milliseconds timeout, Event requested, Event *occurred=nullptr) const override
Wait for readiness for input (recv) or output (send).
int Listen(int backlog) const override
listen(2) wrapper.
const bool m_selectable
Whether to pretend that the socket is select(2)-able.
bool WaitMany(std::chrono::milliseconds timeout, EventsPerSock &events_per_sock) const override
Same as Wait(), but wait on many sockets within the same timeout.
void ElapseTime(std::chrono::milliseconds duration) const
Set the value of the mocked steady clock such as that many ms have passed.
bool IsConnected(std::string &errmsg) const override
Check if still connected.
int Connect(const sockaddr *, socklen_t) const override
connect(2) wrapper.
ssize_t Send(const void *data, size_t len, int flags) const override
send(2) wrapper.
std::vector< uint8_t > m_peek_data
Data to return when MSG_PEEK is used as a Recv() flag.
FuzzedSock & operator=(Sock &&other) override
Move assignment operator, grab the socket from another object and close ours (if set).
FuzzedDataProvider & m_fuzzed_data_provider
bool IsSelectable() const override
Check if the underlying socket can be used for select(2) (or the Wait() method).
bool SetNonBlocking() const override
Set the non-blocking option on the socket.
int SetSockOpt(int level, int opt_name, const void *opt_val, socklen_t opt_len) const override
setsockopt(2) wrapper.
ssize_t Recv(void *buf, size_t len, int flags) const override
recv(2) wrapper.
int GetSockName(sockaddr *name, socklen_t *name_len) const override
getsockname(2) wrapper.
std::chrono::milliseconds m_time
Used to mock the steady clock in methods waiting for a given duration.
FuzzedSock(FuzzedDataProvider &fuzzed_data_provider)
int Bind(const sockaddr *, socklen_t) const override
bind(2) wrapper.
RAII helper class that manages a socket and closes it automatically when it goes out of scope.
SOCKET m_socket
Contained socket.
std::unordered_map< std::shared_ptr< const Sock >, Events, HashSharedPtrSock, EqualSharedPtrSock > EventsPerSock
On which socket to wait for what events in WaitMany().
static constexpr uint8_t CJDNS_PREFIX
All CJDNS addresses start with 0xFC.
static constexpr size_t ADDR_CJDNS_SIZE
Size of CJDNS address (in bytes).
static constexpr size_t ADDR_TORV3_SIZE
Size of TORv3 address (in bytes).
static constexpr size_t ADDR_I2P_SIZE
Size of I2P address (in bytes).
static constexpr size_t ADDR_IPV4_SIZE
Size of IPv4 address (in bytes).
@ NET_ONION
TOR (v2 or v3)
@ NET_INTERNAL
A set of addresses that represent the hash of a string or FQDN.
static constexpr size_t ADDR_IPV6_SIZE
Size of IPv6 address (in bytes).
static const int MIN_PEER_PROTO_VERSION
disconnect from peers older than this proto version
Version of SteadyClock that is mockable in the context of tests (set the current value with SetMockTi...
static void SetMockTime(mock_time_point::duration mock_time_in)
Set mock time for testing.
CAddress ConsumeAddress(FuzzedDataProvider &fuzzed_data_provider) noexcept
P ConsumeDeserializationParams(FuzzedDataProvider &fuzzed_data_provider) noexcept
CNetAddr ConsumeNetAddr(FuzzedDataProvider &fuzzed_data_provider, FastRandomContext *rand) noexcept
Create a CNetAddr.
void FillNode(FuzzedDataProvider &fuzzed_data_provider, ConnmanTestMsg &connman, CNode &node) noexcept
CService ConsumeService(FuzzedDataProvider &fuzzed_data_provider) noexcept
WeakEnumType ConsumeWeakEnum(FuzzedDataProvider &fuzzed_data_provider, const WeakEnumType(&all_types)[size]) noexcept
auto & PickValue(FuzzedDataProvider &fuzzed_data_provider, Collection &col)
std::vector< B > ConsumeFixedLengthByteVector(FuzzedDataProvider &fuzzed_data_provider, const size_t length) noexcept
Returns a byte vector of specified size regardless of the number of remaining bytes available from th...
std::vector< B > ConsumeRandomLengthByteVector(FuzzedDataProvider &fuzzed_data_provider, const std::optional< size_t > &max_length=std::nullopt) noexcept
void SetFuzzedErrNo(FuzzedDataProvider &fuzzed_data_provider, const std::array< T, size > &errnos)
Sets errno to a value selected from the given std::array errnos.
constexpr ServiceFlags ALL_SERVICE_FLAGS[]
std::chrono::time_point< NodeClock, std::chrono::seconds > NodeSeconds
FuzzedDataProvider & fuzzed_data_provider