34 v4_addr.s_addr = fuzzed_data_provider.ConsumeIntegral<uint32_t>();
37 if (fuzzed_data_provider.remaining_bytes() >= 16) {
38 in6_addr v6_addr = {};
39 auto addr_bytes = fuzzed_data_provider.ConsumeBytes<uint8_t>(16);
43 memcpy(v6_addr.s6_addr, addr_bytes.data(), 16);
44 net_addr =
CNetAddr{v6_addr, fuzzed_data_provider.ConsumeIntegral<uint32_t>()};
47 net_addr.
SetInternal(fuzzed_data_provider.ConsumeBytesAsString(32));
49 auto pub_key{fuzzed_data_provider.ConsumeBytes<uint8_t>(
ADDR_TORV3_SIZE)};
65 constexpr std::array ADDR_ENCODINGS{
69 constexpr std::array ADDR_FORMATS{
73 if constexpr (std::is_same_v<P, CNetAddr::SerParams>) {
74 return P{
PickValue(fuzzed_data_provider, ADDR_ENCODINGS)};
76 if constexpr (std::is_same_v<P, CAddress::SerParams>) {
77 return P{{
PickValue(fuzzed_data_provider, ADDR_ENCODINGS)},
PickValue(fuzzed_data_provider, ADDR_FORMATS)};
85 m_fuzzed_data_provider{fuzzed_data_provider},
86 m_selectable{fuzzed_data_provider.ConsumeBool()}
101 assert(
false &&
"Move of Sock into FuzzedSock not allowed.");
107 constexpr std::array send_errnos{
142 constexpr std::array recv_errnos{
154 assert(buf !=
nullptr || len == 0);
162 std::vector<uint8_t> random_bytes;
167 if ((
flags & MSG_PEEK) == 0) {
170 pad_to_len_bytes =
false;
171 }
else if ((
flags & MSG_PEEK) != 0) {
174 if (!random_bytes.empty()) {
176 pad_to_len_bytes =
false;
182 if (random_bytes.empty()) {
189 std::memcpy(buf, random_bytes.data(), random_bytes.size());
190 if (pad_to_len_bytes) {
191 if (len > random_bytes.size()) {
192 std::memset((
char*)buf + random_bytes.size(), 0, len - random_bytes.size());
197 std::this_thread::sleep_for(std::chrono::milliseconds{2});
199 return random_bytes.size();
207 constexpr std::array connect_errnos{
231 constexpr std::array bind_errnos{
251 constexpr std::array listen_errnos{
265 constexpr std::array accept_errnos{
272 return std::unique_ptr<FuzzedSock>();
279 constexpr std::array getsockopt_errnos{
287 if (opt_val ==
nullptr) {
298 constexpr std::array setsockopt_errnos{
311 constexpr std::array getsockname_errnos{
325 constexpr std::array setnonblocking_errnos{
343 constexpr std::array wait_errnos{
352 if (occurred !=
nullptr) {
360 for (
auto& [sock, events] : events_per_sock) {
372 errmsg =
"disconnected at random by the fuzzer";
378 connman.Handshake(
node,
379 fuzzed_data_provider.ConsumeBool(),
382 fuzzed_data_provider.ConsumeIntegralInRange<int32_t>(
MIN_PEER_PROTO_VERSION, std::numeric_limits<int32_t>::max()),
383 fuzzed_data_provider.ConsumeBool());
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...
void FillNode(FuzzedDataProvider &fuzzed_data_provider, ConnmanTestMsg &connman, CNode &node) noexcept
FuzzedSock & operator=(Sock &&other) override
Move assignment operator, grab the socket from another object and close ours (if set).
A set of addresses that represent the hash of a string or FQDN.
WeakEnumType ConsumeWeakEnum(FuzzedDataProvider &fuzzed_data_provider, const WeakEnumType(&all_types)[size]) noexcept
static constexpr size_t ADDR_TORV3_SIZE
Size of TORv3 address (in bytes).
CNetAddr ConsumeNetAddr(FuzzedDataProvider &fuzzed_data_provider) noexcept
SOCKET m_socket
Contained socket.
int SetSockOpt(int level, int opt_name, const void *opt_val, socklen_t opt_len) const override
setsockopt(2) wrapper.
bool SetSpecial(const std::string &addr)
Parse a Tor or I2P address and set this object to it.
bool IsConnected(std::string &errmsg) const override
Check if still connected.
ssize_t Recv(void *buf, size_t len, int flags) const override
recv(2) wrapper.
std::optional< uint8_t > m_peek_data
Data to return when MSG_PEEK is used as a Recv() flag.
ssize_t Send(const void *data, size_t len, int flags) const override
send(2) wrapper.
CAddress ConsumeAddress(FuzzedDataProvider &fuzzed_data_provider) noexcept
std::chrono::time_point< NodeClock, std::chrono::seconds > NodeSeconds
constexpr ServiceFlags ALL_SERVICE_FLAGS[]
bool Wait(std::chrono::milliseconds timeout, Event requested, Event *occurred=nullptr) const override
Wait for readiness for input (recv) or output (send).
std::unordered_map< std::shared_ptr< const Sock >, Events, HashSharedPtrSock, EqualSharedPtrSock > EventsPerSock
On which socket to wait for what events in WaitMany().
CService ConsumeService(FuzzedDataProvider &fuzzed_data_provider) noexcept
P ConsumeDeserializationParams(FuzzedDataProvider &fuzzed_data_provider) noexcept
A CService with information about it as peer.
int GetSockOpt(int level, int opt_name, void *opt_val, socklen_t *opt_len) const override
getsockopt(2) wrapper.
std::unique_ptr< Sock > Accept(sockaddr *addr, socklen_t *addr_len) const override
accept(2) wrapper.
size_t ConsumeData(void *destination, size_t num_bytes)
int Connect(const sockaddr *, socklen_t) const override
connect(2) wrapper.
FuzzedSock(FuzzedDataProvider &fuzzed_data_provider)
static constexpr uint8_t CJDNS_PREFIX
All CJDNS addresses start with 0xFC.
std::vector< T > ConsumeBytes(size_t num_bytes)
FuzzedDataProvider & m_fuzzed_data_provider
static const int MIN_PEER_PROTO_VERSION
disconnect from peers older than this proto version
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 SetFuzzedErrNo(FuzzedDataProvider &fuzzed_data_provider, const std::array< T, size > &errnos)
Sets errno to a value selected from the given std::array errnos.
std::string OnionToString(Span< const uint8_t > addr)
RAII helper class that manages a socket and closes it automatically when it goes out of scope...
bool SetNonBlocking() const override
Set the non-blocking option on the socket.
auto & PickValue(FuzzedDataProvider &fuzzed_data_provider, Collection &col)
const bool m_selectable
Whether to pretend that the socket is select(2)-able.
int GetSockName(sockaddr *name, socklen_t *name_len) const override
getsockname(2) wrapper.
Information about a peer.
T ConsumeIntegralInRange(T min, T max)
bool SetInternal(const std::string &name)
Create an "internal" address that represents a name or FQDN.
bool IsSelectable() const override
Check if the underlying socket can be used for select(2) (or the Wait() method).
int Bind(const sockaddr *, socklen_t) const override
bind(2) wrapper.
int Listen(int backlog) const override
listen(2) wrapper.