Branch data Line data Source code
1 : : // Copyright (c) The Bitcoin Core developers
2 : : // Distributed under the MIT software license, see the accompanying
3 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 : :
5 : : #include <common/args.h>
6 : : #include <compat/compat.h>
7 : : #include <i2p.h>
8 : : #include <netaddress.h>
9 : : #include <netbase.h>
10 : : #include <test/fuzz/FuzzedDataProvider.h>
11 : : #include <test/fuzz/fuzz.h>
12 : : #include <test/fuzz/util.h>
13 : : #include <test/fuzz/util/net.h>
14 : : #include <test/fuzz/util/threadinterrupt.h>
15 : : #include <test/util/setup_common.h>
16 : : #include <test/util/time.h>
17 : : #include <util/fs_helpers.h>
18 : : #include <util/threadinterrupt.h>
19 : :
20 : 1 : void initialize_i2p()
21 : : {
22 [ + - + - : 2 : static const auto testing_setup = MakeNoLogFileContext<>();
+ - ]
23 : 1 : }
24 : :
25 [ + - ]: 1055 : FUZZ_TARGET(i2p, .init = initialize_i2p)
26 : : {
27 : 581 : SeedRandomStateForTest(SeedRand::ZEROS);
28 : 581 : FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
29 : :
30 : 581 : FakeNodeClock clock{ConsumeTime(fuzzed_data_provider)};
31 [ + - ]: 581 : FakeSteadyClock steady_clock;
32 : :
33 : : // Mock CreateSock() to create FuzzedSock.
34 [ + - ]: 581 : auto CreateSockOrig = CreateSock;
35 : 2050 : CreateSock = [&fuzzed_data_provider, &steady_clock](int, int, int) {
36 : 1469 : return std::make_unique<FuzzedSock>(fuzzed_data_provider, steady_clock);
37 : 581 : };
38 : :
39 [ + - ]: 1162 : const fs::path private_key_path = gArgs.GetDataDirNet() / "fuzzed_i2p_private_key";
40 [ + - ]: 581 : const CService addr{in6_addr(COMPAT_IN6ADDR_LOOPBACK_INIT), 7656};
41 : 581 : const Proxy sam_proxy{addr, /*tor_stream_isolation=*/false};
42 [ + - ]: 581 : auto interrupt{ConsumeThreadInterrupt(fuzzed_data_provider)};
43 : :
44 [ + - + - ]: 1162 : i2p::sam::Session session{private_key_path, sam_proxy, interrupt};
45 [ + - ]: 581 : i2p::Connection conn;
46 : :
47 [ + - + + ]: 581 : if (session.Listen(conn)) {
48 [ + - + + ]: 126 : if (session.Accept(conn)) {
49 : 34 : try {
50 [ + + ]: 56 : (void)conn.sock->RecvUntilTerminator('\n', 10ms, *interrupt, i2p::sam::MAX_MSG_SIZE);
51 [ - + ]: 12 : } catch (const std::runtime_error&) {
52 : 12 : }
53 : : }
54 : : }
55 : :
56 : 581 : bool proxy_error;
57 : :
58 [ + - + - : 581 : if (session.Connect(CService{}, conn, proxy_error)) {
+ + ]
59 : 17 : try {
60 [ + + ]: 17 : conn.sock->SendComplete("verack\n", 10ms, *interrupt);
61 [ - + ]: 10 : } catch (const std::runtime_error&) {
62 : 10 : }
63 : : }
64 : :
65 [ + - ]: 581 : fs::remove(private_key_path);
66 : :
67 [ + - ]: 581 : CreateSock = CreateSockOrig;
68 [ + - ]: 2324 : }
|