void fuzz(std::string const& filename, el::Level logLevel, std::vector<std::string> const& metrics) { Logging::setFmt("<fuzz>", false); Logging::setLogLevel(logLevel, nullptr); LOG(INFO) << "Fuzzing stellar-core " << STELLAR_CORE_VERSION; LOG(INFO) << "Fuzz input is in " << filename; Config cfg1, cfg2; cfg1.RUN_STANDALONE = true; cfg1.ARTIFICIALLY_ACCELERATE_TIME_FOR_TESTING = true; cfg1.LOG_FILE_PATH = "fuzz-app-1.log"; cfg1.TMP_DIR_PATH = "fuzz-tmp-1"; cfg1.BUCKET_DIR_PATH = "fuzz-buckets-1"; cfg2.RUN_STANDALONE = true; cfg2.ARTIFICIALLY_ACCELERATE_TIME_FOR_TESTING = true; cfg1.LOG_FILE_PATH = "fuzz-app-2.log"; cfg2.TMP_DIR_PATH = "fuzz-tmp-2"; cfg2.BUCKET_DIR_PATH = "fuzz-buckets-2"; CfgDirGuard g1(cfg1); CfgDirGuard g2(cfg2); restart: { VirtualClock clock; Application::pointer app1 = Application::create(clock, cfg1); Application::pointer app2 = Application::create(clock, cfg2); LoopbackPeerConnection loop(*app1, *app2); while (clock.crank(false) > 0) ; XDRInputFileStream in; in.open(filename); StellarMessage msg; size_t i = 0; while (tryRead(in, msg)) { ++i; if (msg.type() != HELLO) { LOG(INFO) << "Fuzzer injecting message " << i << ": " << msgSummary(msg); loop.getAcceptor()->Peer::sendMessage(msg); } size_t iter = 20; while (clock.crank(false) > 0 && iter-- > 0) ; } } if (getenv("AFL_PERSISTENT") && persist_cnt++ < PERSIST_MAX) { #ifndef _WIN32 raise(SIGSTOP); #endif goto restart; } }