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 <util/fs_helpers.h>
17 : : #include <util/threadinterrupt.h>
18 : :
19 : 1 : void initialize_i2p()
20 : : {
21 [ + - + - : 1 : static const auto testing_setup = MakeNoLogFileContext<>();
+ - ]
22 : 1 : }
23 : :
24 [ + - ]: 1102 : FUZZ_TARGET(i2p, .init = initialize_i2p)
25 : : {
26 : 652 : SeedRandomStateForTest(SeedRand::ZEROS);
27 : 652 : FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
28 : :
29 : 652 : SetMockTime(ConsumeTime(fuzzed_data_provider));
30 : :
31 : : // Mock CreateSock() to create FuzzedSock.
32 : 652 : auto CreateSockOrig = CreateSock;
33 : 2234 : CreateSock = [&fuzzed_data_provider](int, int, int) {
34 : 1582 : return std::make_unique<FuzzedSock>(fuzzed_data_provider);
35 : 652 : };
36 : :
37 [ + - + - ]: 1304 : const fs::path private_key_path = gArgs.GetDataDirNet() / "fuzzed_i2p_private_key";
38 [ + - ]: 652 : const CService addr{in6_addr(COMPAT_IN6ADDR_LOOPBACK_INIT), 7656};
39 : 652 : const Proxy sam_proxy{addr, /*tor_stream_isolation=*/false};
40 [ + - ]: 652 : auto interrupt{ConsumeThreadInterrupt(fuzzed_data_provider)};
41 : :
42 [ + - + - ]: 1304 : i2p::sam::Session session{private_key_path, sam_proxy, interrupt};
43 [ + - ]: 652 : i2p::Connection conn;
44 : :
45 [ + - + + ]: 652 : if (session.Listen(conn)) {
46 [ + - + + ]: 112 : if (session.Accept(conn)) {
47 : 30 : try {
48 [ + + ]: 55 : (void)conn.sock->RecvUntilTerminator('\n', 10ms, *interrupt, i2p::sam::MAX_MSG_SIZE);
49 [ - + ]: 5 : } catch (const std::runtime_error&) {
50 : 5 : }
51 : : }
52 : : }
53 : :
54 : 652 : bool proxy_error;
55 : :
56 [ + - + - : 652 : if (session.Connect(CService{}, conn, proxy_error)) {
+ + ]
57 : 22 : try {
58 [ + + ]: 22 : conn.sock->SendComplete("verack\n", 10ms, *interrupt);
59 [ - + ]: 12 : } catch (const std::runtime_error&) {
60 : 12 : }
61 : : }
62 : :
63 [ + - ]: 652 : fs::remove_all(private_key_path);
64 : :
65 [ + - ]: 652 : CreateSock = CreateSockOrig;
66 [ + - ]: 2608 : }
|