Bitcoin Core 28.0.0
P2P Digital Currency
Loading...
Searching...
No Matches
buffered_file.cpp
Go to the documentation of this file.
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 <span.h>
6#include <streams.h>
8#include <test/fuzz/fuzz.h>
9#include <test/fuzz/util.h>
10
11#include <array>
12#include <cstddef>
13#include <cstdint>
14#include <iostream>
15#include <optional>
16#include <vector>
17
18FUZZ_TARGET(buffered_file)
19{
20 FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
21 FuzzedFileProvider fuzzed_file_provider{fuzzed_data_provider};
22 std::optional<BufferedFile> opt_buffered_file;
23 AutoFile fuzzed_file{
24 fuzzed_file_provider.open(),
25 ConsumeRandomLengthByteVector<std::byte>(fuzzed_data_provider),
26 };
27 try {
28 opt_buffered_file.emplace(fuzzed_file, fuzzed_data_provider.ConsumeIntegralInRange<uint64_t>(0, 4096), fuzzed_data_provider.ConsumeIntegralInRange<uint64_t>(0, 4096));
29 } catch (const std::ios_base::failure&) {
30 }
31 if (opt_buffered_file && !fuzzed_file.IsNull()) {
32 bool setpos_fail = false;
33 LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 100)
34 {
36 fuzzed_data_provider,
37 [&] {
38 std::array<std::byte, 4096> arr{};
39 try {
40 opt_buffered_file->read({arr.data(), fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, 4096)});
41 } catch (const std::ios_base::failure&) {
42 }
43 },
44 [&] {
45 opt_buffered_file->SetLimit(fuzzed_data_provider.ConsumeIntegralInRange<uint64_t>(0, 4096));
46 },
47 [&] {
48 if (!opt_buffered_file->SetPos(fuzzed_data_provider.ConsumeIntegralInRange<uint64_t>(0, 4096))) {
49 setpos_fail = true;
50 }
51 },
52 [&] {
53 if (setpos_fail) {
54 // Calling FindByte(...) after a failed SetPos(...) call may result in an infinite loop.
55 return;
56 }
57 try {
58 opt_buffered_file->FindByte(std::byte(fuzzed_data_provider.ConsumeIntegral<uint8_t>()));
59 } catch (const std::ios_base::failure&) {
60 }
61 },
62 [&] {
63 ReadFromStream(fuzzed_data_provider, *opt_buffered_file);
64 });
65 }
66 opt_buffered_file->GetPos();
67 }
68}
void ReadFromStream(AddrMan &addr, DataStream &ssPeers)
Only used by tests.
Definition addrdb.cpp:186
Non-refcounted RAII wrapper for FILE*.
Definition streams.h:389
#define FUZZ_TARGET(...)
Definition fuzz.h:35
#define LIMITED_WHILE(condition, limit)
Can be used to limit a theoretically unbounded loop.
Definition fuzz.h:22
size_t CallOneOf(FuzzedDataProvider &fuzzed_data_provider, Callables... callables)
Definition util.h:35
std::vector< B > ConsumeRandomLengthByteVector(FuzzedDataProvider &fuzzed_data_provider, const std::optional< size_t > &max_length=std::nullopt) noexcept
Definition util.h:57