Inside Bitcoin
Opening the selected file…
Inside Bitcoin
Opening the selected file…
The code behind the network, with room to understand it.
Release published 2026-10-28 · Snapshot fetched 2026-11-01. Latest stable release at fetch time; development branches and Git history are excluded. Only the selected code window and visible folders load here.
251FILE* FuzzedFileProvider::open()252{253SetFuzzedErrNo(m_fuzzed_data_provider);254if (m_fuzzed_data_provider.ConsumeBool()) {255return nullptr;256}257std::string mode;258CallOneOf(259m_fuzzed_data_provider,260[&] {261mode = "r";262},263[&] {264mode = "r+";265},266[&] {267mode = "w";268},269[&] {270mode = "w+";271},272[&] {273mode = "a";274},275[&] {276mode = "a+";277});278#if defined _GNU_SOURCE && (defined(__linux__) || defined(__FreeBSD__))279const cookie_io_functions_t io_hooks = {280FuzzedFileProvider::read,281FuzzedFileProvider::write,282FuzzedFileProvider::seek,283FuzzedFileProvider::close,284};285return fopencookie(this, mode.c_str(), io_hooks);286#else287(void)mode;288return nullptr;289#endif290}292ssize_t FuzzedFileProvider::read(void* cookie, char* buf, size_t size)293{294FuzzedFileProvider* fuzzed_file = (FuzzedFileProvider*)cookie;295SetFuzzedErrNo(fuzzed_file->m_fuzzed_data_provider);296if (buf == nullptr || size == 0 || fuzzed_file->m_fuzzed_data_provider.ConsumeBool()) {297return fuzzed_file->m_fuzzed_data_provider.ConsumeBool() ? 0 : -1;298}299const std::vector<uint8_t> random_bytes = fuzzed_file->m_fuzzed_data_provider.ConsumeBytes<uint8_t>(size);300if (random_bytes.empty()) {301return 0;302}303std::memcpy(buf, random_bytes.data(), random_bytes.size());304if (AdditionOverflow(fuzzed_file->m_offset, (int64_t)random_bytes.size())) {305return fuzzed_file->m_fuzzed_data_provider.ConsumeBool() ? 0 : -1;306}307fuzzed_file->m_offset += random_bytes.size();308return random_bytes.size();309}311ssize_t FuzzedFileProvider::write(void* cookie, const char* buf, size_t size)312{313FuzzedFileProvider* fuzzed_file = (FuzzedFileProvider*)cookie;314SetFuzzedErrNo(fuzzed_file->m_fuzzed_data_provider);315const ssize_t n = fuzzed_file->m_fuzzed_data_provider.ConsumeIntegralInRange<ssize_t>(0, size);316if (AdditionOverflow(fuzzed_file->m_offset, (int64_t)n)) {317return 0;318}319fuzzed_file->m_offset += n;320return n;321}323int FuzzedFileProvider::seek(void* cookie, int64_t* offset, int whence)324{325assert(whence == SEEK_SET || whence == SEEK_CUR || whence == SEEK_END);326FuzzedFileProvider* fuzzed_file = (FuzzedFileProvider*)cookie;327SetFuzzedErrNo(fuzzed_file->m_fuzzed_data_provider);328int64_t new_offset = 0;329if (whence == SEEK_SET) {330new_offset = *offset;331} else if (whence == SEEK_CUR) {332if (AdditionOverflow(fuzzed_file->m_offset, *offset)) {333return -1;334}335new_offset = fuzzed_file->m_offset + *offset;336} else if (whence == SEEK_END) {337const int64_t n = fuzzed_file->m_fuzzed_data_provider.ConsumeIntegralInRange<int64_t>(0, 4096);338if (AdditionOverflow(n, *offset)) {339return -1;340}341new_offset = n + *offset;342}343if (new_offset < 0) {344return -1;345}346fuzzed_file->m_offset = new_offset;347*offset = new_offset;348return fuzzed_file->m_fuzzed_data_provider.ConsumeIntegralInRange<int>(-1, 0);349}351int FuzzedFileProvider::close(void* cookie)352{353FuzzedFileProvider* fuzzed_file = (FuzzedFileProvider*)cookie;354SetFuzzedErrNo(fuzzed_file->m_fuzzed_data_provider);355return fuzzed_file->m_fuzzed_data_provider.ConsumeIntegralInRange<int>(-1, 0);356}
Independent explanations by MyBitcoinExplorer. Not affiliated with or endorsed by Bitcoin Core. Guides are educational and do not replace the source or its tests.
Bitcoin Core source © its contributors, distributed under the MIT license. Original notices and bundled third-party licenses are retained in the source tree.