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