mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-10 14:08:40 +01:00
netbase: extend CreateSock() to support creating arbitrary sockets
Allow the callers of `CreateSock()` to pass all 3 arguments to the `socket(2)` syscall. This makes it possible to create sockets of any domain/type/protocol.
This commit is contained in:
@@ -101,8 +101,9 @@ void ResetCoverageCounters() {}
|
||||
|
||||
void initialize()
|
||||
{
|
||||
// Terminate immediately if a fuzzing harness ever tries to create a TCP socket.
|
||||
CreateSock = [](const sa_family_t&) -> std::unique_ptr<Sock> { std::terminate(); };
|
||||
// Terminate immediately if a fuzzing harness ever tries to create a socket.
|
||||
// Individual tests can override this by pointing CreateSock to a mocked alternative.
|
||||
CreateSock = [](int, int, int) -> std::unique_ptr<Sock> { std::terminate(); };
|
||||
|
||||
// Terminate immediately if a fuzzing harness ever tries to perform a DNS lookup.
|
||||
g_dns_lookup = [](const std::string& name, bool allow_lookup) {
|
||||
|
||||
@@ -27,7 +27,7 @@ FUZZ_TARGET(i2p, .init = initialize_i2p)
|
||||
|
||||
// Mock CreateSock() to create FuzzedSock.
|
||||
auto CreateSockOrig = CreateSock;
|
||||
CreateSock = [&fuzzed_data_provider](const sa_family_t&) {
|
||||
CreateSock = [&fuzzed_data_provider](int, int, int) {
|
||||
return std::make_unique<FuzzedSock>(fuzzed_data_provider);
|
||||
};
|
||||
|
||||
|
||||
@@ -39,15 +39,14 @@ public:
|
||||
|
||||
private:
|
||||
const BCLog::Level m_prev_log_level;
|
||||
const std::function<std::unique_ptr<Sock>(const sa_family_t&)> m_create_sock_orig;
|
||||
const decltype(CreateSock) m_create_sock_orig;
|
||||
};
|
||||
|
||||
BOOST_FIXTURE_TEST_SUITE(i2p_tests, EnvTestingSetup)
|
||||
|
||||
BOOST_AUTO_TEST_CASE(unlimited_recv)
|
||||
{
|
||||
// Mock CreateSock() to create MockSock.
|
||||
CreateSock = [](const sa_family_t&) {
|
||||
CreateSock = [](int, int, int) {
|
||||
return std::make_unique<StaticContentsSock>(std::string(i2p::sam::MAX_MSG_SIZE + 1, 'a'));
|
||||
};
|
||||
|
||||
@@ -69,7 +68,7 @@ BOOST_AUTO_TEST_CASE(unlimited_recv)
|
||||
BOOST_AUTO_TEST_CASE(listen_ok_accept_fail)
|
||||
{
|
||||
size_t num_sockets{0};
|
||||
CreateSock = [&num_sockets](const sa_family_t&) {
|
||||
CreateSock = [&num_sockets](int, int, int) {
|
||||
// clang-format off
|
||||
++num_sockets;
|
||||
// First socket is the control socket for creating the session.
|
||||
@@ -133,9 +132,7 @@ BOOST_AUTO_TEST_CASE(listen_ok_accept_fail)
|
||||
|
||||
BOOST_AUTO_TEST_CASE(damaged_private_key)
|
||||
{
|
||||
const auto CreateSockOrig = CreateSock;
|
||||
|
||||
CreateSock = [](const sa_family_t&) {
|
||||
CreateSock = [](int, int, int) {
|
||||
return std::make_unique<StaticContentsSock>("HELLO REPLY RESULT=OK VERSION=3.1\n"
|
||||
"SESSION STATUS RESULT=OK DESTINATION=\n");
|
||||
};
|
||||
@@ -172,8 +169,6 @@ BOOST_AUTO_TEST_CASE(damaged_private_key)
|
||||
BOOST_CHECK(!session.Connect(CService{}, conn, proxy_error));
|
||||
}
|
||||
}
|
||||
|
||||
CreateSock = CreateSockOrig;
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
Reference in New Issue
Block a user