Changeset View
Changeset View
Standalone View
Standalone View
src/test/fuzz/fuzz.cpp
- This file was added.
// Copyright (c) 2009-2019 The Bitcoin Core developers | |||||
// Distributed under the MIT software license, see the accompanying | |||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | |||||
#include <test/fuzz/fuzz.h> | |||||
#include <pubkey.h> | |||||
#include <memory> | |||||
#include <unistd.h> | |||||
static bool read_stdin(std::vector<uint8_t> &data) { | |||||
uint8_t buffer[1024]; | |||||
ssize_t length = 0; | |||||
while ((length = read(STDIN_FILENO, buffer, 1024)) > 0) { | |||||
data.insert(data.end(), buffer, buffer + length); | |||||
if (data.size() > (1 << 20)) { | |||||
return false; | |||||
} | |||||
} | |||||
return length == 0; | |||||
} | |||||
static void initialize() { | |||||
const static auto verify_handle = std::make_unique<ECCVerifyHandle>(); | |||||
} | |||||
// This function is used by libFuzzer | |||||
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { | |||||
test_one_input(std::vector<uint8_t>(data, data + size)); | |||||
return 0; | |||||
} | |||||
// This function is used by libFuzzer | |||||
extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv) { | |||||
initialize(); | |||||
return 0; | |||||
} | |||||
// Disabled under WIN32 due to clash with Cygwin's WinMain. | |||||
#ifndef WIN32 | |||||
// Declare main(...) "weak" to allow for libFuzzer linking. libFuzzer provides | |||||
// the main(...) function. | |||||
__attribute__((weak)) | |||||
#endif | |||||
int main(int argc, char **argv) { | |||||
initialize(); | |||||
#ifdef __AFL_INIT | |||||
// Enable AFL deferred forkserver mode. Requires compilation using | |||||
// afl-clang-fast++. See fuzzing.md for details. | |||||
__AFL_INIT(); | |||||
#endif | |||||
#ifdef __AFL_LOOP | |||||
// Enable AFL persistent mode. Requires compilation using afl-clang-fast++. | |||||
// See fuzzing.md for details. | |||||
while (__AFL_LOOP(1000)) { | |||||
std::vector<uint8_t> buffer; | |||||
if (!read_stdin(buffer)) { | |||||
continue; | |||||
} | |||||
test_one_input(buffer); | |||||
} | |||||
#else | |||||
std::vector<uint8_t> buffer; | |||||
if (!read_stdin(buffer)) { | |||||
return 0; | |||||
} | |||||
test_one_input(buffer); | |||||
#endif | |||||
return 0; | |||||
} |