// Copyright (c) The Bitcoin Core developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include #include #include #include #include #include #include #include #include #include #include void initialize_i2p() { static const auto testing_setup = MakeNoLogFileContext<>(); } FUZZ_TARGET(i2p, .init = initialize_i2p) { FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()}; SetMockTime(ConsumeTime(fuzzed_data_provider)); // Mock CreateSock() to create FuzzedSock. auto CreateSockOrig = CreateSock; CreateSock = [&fuzzed_data_provider](int, int, int) { return std::make_unique(fuzzed_data_provider); }; const fs::path private_key_path = gArgs.GetDataDirNet() / "fuzzed_i2p_private_key"; const CService addr{in6_addr(IN6ADDR_LOOPBACK_INIT), 7656}; const Proxy sam_proxy{addr, false}; CThreadInterrupt interrupt; i2p::sam::Session session{private_key_path, sam_proxy, &interrupt}; i2p::Connection conn; if (session.Listen(conn)) { if (session.Accept(conn)) { try { (void)conn.sock->RecvUntilTerminator('\n', 10ms, interrupt, i2p::sam::MAX_MSG_SIZE); } catch (const std::runtime_error&) { } } } bool proxy_error; if (session.Connect(CService{}, conn, proxy_error)) { try { conn.sock->SendComplete("verack\n", 10ms, interrupt); } catch (const std::runtime_error&) { } } fs::remove_all(private_key_path); CreateSock = CreateSockOrig; }