@@ -57,6 +57,7 @@ struct CConnmanTest : public CConnman {
5757 return InitBinds (binds, white_binds, onion_binds);
5858 }
5959
60+ void SocketHandlerPublic () { SocketHandler (); }
6061};
6162
6263FUZZ_TARGET_INIT (connman, initialize_connman)
@@ -70,6 +71,23 @@ FUZZ_TARGET_INIT(connman, initialize_connman)
7071 return std::make_unique<FuzzedSock>(fuzzed_data_provider);
7172 };
7273
74+ // Mock SockWaitMany(), pretending random sockets are ready for the requested IO.
75+ auto SockWaitManyOrig = SockWaitMany;
76+ SockWaitMany = [&fuzzed_data_provider](Sockets& sockets, std::chrono::milliseconds) {
77+ auto RemoveRandomElements = [&fuzzed_data_provider](auto & set) {
78+ for (auto it = set.begin (); it != set.end ();) {
79+ if (fuzzed_data_provider.ConsumeBool ()) {
80+ it = set.erase (it);
81+ } else {
82+ ++it;
83+ }
84+ }
85+ };
86+ RemoveRandomElements (sockets.recv );
87+ RemoveRandomElements (sockets.send );
88+ RemoveRandomElements (sockets.err );
89+ };
90+
7391 CConnmanTest connman{fuzzed_data_provider, *g_setup->m_node .addrman };
7492 CConnman::Options options;
7593 options.m_msgproc = g_setup->m_node .peerman .get ();
@@ -210,6 +228,9 @@ FUZZ_TARGET_INIT(connman, initialize_connman)
210228 }
211229
212230 connman.InitBindsPublic (binds, white_binds, onion_binds);
231+ },
232+ [&] {
233+ connman.SocketHandlerPublic ();
213234 });
214235 }
215236 (void )connman.GetAddedNodeInfo ();
@@ -228,5 +249,6 @@ FUZZ_TARGET_INIT(connman, initialize_connman)
228249 (void )connman.GetTryNewOutboundPeer ();
229250 (void )connman.GetUseAddrmanOutgoing ();
230251
252+ SockWaitMany = SockWaitManyOrig;
231253 CreateSock = CreateSockOrig;
232254}
0 commit comments