/root/bitcoin/src/test/fuzz/socks5.cpp
| Line | Count | Source | 
| 1 |  | // Copyright (c) 2020-2022 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 <netaddress.h> | 
| 6 |  | #include <netbase.h> | 
| 7 |  | #include <test/fuzz/FuzzedDataProvider.h> | 
| 8 |  | #include <test/fuzz/fuzz.h> | 
| 9 |  | #include <test/fuzz/util.h> | 
| 10 |  | #include <test/fuzz/util/net.h> | 
| 11 |  | #include <test/util/setup_common.h> | 
| 12 |  | #include <util/time.h> | 
| 13 |  |  | 
| 14 |  | #include <cstdint> | 
| 15 |  | #include <string> | 
| 16 |  | #include <vector> | 
| 17 |  |  | 
| 18 |  | extern std::chrono::milliseconds g_socks5_recv_timeout; | 
| 19 |  |  | 
| 20 |  | namespace { | 
| 21 |  | decltype(g_socks5_recv_timeout) default_socks5_recv_timeout; | 
| 22 |  | }; | 
| 23 |  |  | 
| 24 |  | void initialize_socks5() | 
| 25 | 0 | { | 
| 26 | 0 |     static const auto testing_setup = MakeNoLogFileContext<const BasicTestingSetup>(); | 
| 27 | 0 |     default_socks5_recv_timeout = g_socks5_recv_timeout; | 
| 28 | 0 | } | 
| 29 |  |  | 
| 30 |  | FUZZ_TARGET(socks5, .init = initialize_socks5) | 
| 31 | 0 | { | 
| 32 | 0 |     FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()}; | 
| 33 | 0 |     SetMockTime(ConsumeTime(fuzzed_data_provider)); | 
| 34 | 0 |     ProxyCredentials proxy_credentials; | 
| 35 | 0 |     proxy_credentials.username = fuzzed_data_provider.ConsumeRandomLengthString(512); | 
| 36 | 0 |     proxy_credentials.password = fuzzed_data_provider.ConsumeRandomLengthString(512); | 
| 37 | 0 |     if (fuzzed_data_provider.ConsumeBool()) { | 
| 38 | 0 |         g_socks5_interrupt(); | 
| 39 | 0 |     } | 
| 40 |  |     // Set FUZZED_SOCKET_FAKE_LATENCY=1 to exercise recv timeout code paths. This | 
| 41 |  |     // will slow down fuzzing. | 
| 42 | 0 |     g_socks5_recv_timeout = (fuzzed_data_provider.ConsumeBool() && std::getenv("FUZZED_SOCKET_FAKE_LATENCY") != nullptr) ? 1ms : default_socks5_recv_timeout; | 
| 43 | 0 |     FuzzedSock fuzzed_sock = ConsumeSock(fuzzed_data_provider); | 
| 44 |  |     // This Socks5(...) fuzzing harness would have caught CVE-2017-18350 within | 
| 45 |  |     // a few seconds of fuzzing. | 
| 46 | 0 |     auto str_dest = fuzzed_data_provider.ConsumeRandomLengthString(512); | 
| 47 | 0 |     auto port = fuzzed_data_provider.ConsumeIntegral<uint16_t>(); | 
| 48 | 0 |     auto* auth = fuzzed_data_provider.ConsumeBool() ? &proxy_credentials : nullptr; | 
| 49 | 0 |     (void)Socks5(str_dest, port, auth, fuzzed_sock); | 
| 50 | 0 | } |