Merge commit 'a3126d581b6a872f0b8d5641f199fb233306e181'
This commit is contained in:
@ -28,6 +28,7 @@ cc_library(
|
||||
|
||||
cc_fuzz_test(
|
||||
name = "bootstrap_fuzz_test",
|
||||
#size = "small",
|
||||
srcs = ["bootstrap_harness.cc"],
|
||||
copts = ["-UNDEBUG"],
|
||||
corpus = ["//tools/toktok-fuzzer/corpus:bootstrap_fuzzer"],
|
||||
@ -42,6 +43,7 @@ cc_fuzz_test(
|
||||
|
||||
cc_fuzz_test(
|
||||
name = "e2e_fuzz_test",
|
||||
#size = "small",
|
||||
srcs = ["e2e_fuzz_test.cc"],
|
||||
copts = ["-UNDEBUG"],
|
||||
corpus = ["//tools/toktok-fuzzer/corpus:e2e_fuzz_test"],
|
||||
@ -57,6 +59,7 @@ cc_fuzz_test(
|
||||
|
||||
cc_fuzz_test(
|
||||
name = "toxsave_fuzz_test",
|
||||
#size = "small",
|
||||
srcs = ["toxsave_harness.cc"],
|
||||
copts = ["-UNDEBUG"],
|
||||
corpus = ["//tools/toktok-fuzzer/corpus:toxsave_fuzzer"],
|
||||
@ -89,6 +92,7 @@ fuzzing_binary(
|
||||
|
||||
cc_fuzz_test(
|
||||
name = "protodump_reduce",
|
||||
#size = "small",
|
||||
srcs = ["protodump_reduce.cc"],
|
||||
copts = ["-UNDEBUG"],
|
||||
deps = [
|
||||
|
@ -107,6 +107,9 @@ void setup_callbacks(Tox_Dispatch *dispatch)
|
||||
|
||||
void TestBootstrap(Fuzz_Data &input)
|
||||
{
|
||||
// Null system for regularly working memory allocations needed in
|
||||
// tox_events_equal.
|
||||
Null_System null_sys;
|
||||
Fuzz_System sys(input);
|
||||
|
||||
Ptr<Tox_Options> opts(tox_options_new(nullptr), tox_options_free);
|
||||
@ -154,11 +157,9 @@ void TestBootstrap(Fuzz_Data &input)
|
||||
|
||||
uint8_t pub_key[TOX_PUBLIC_KEY_SIZE] = {0};
|
||||
|
||||
const bool udp_success = tox_bootstrap(tox, "127.0.0.2", 33446, pub_key, nullptr);
|
||||
assert(udp_success);
|
||||
|
||||
const bool tcp_success = tox_add_tcp_relay(tox, "127.0.0.2", 33446, pub_key, nullptr);
|
||||
assert(tcp_success);
|
||||
// These may fail, but that's ok. We ignore their return values.
|
||||
tox_bootstrap(tox, "127.0.0.2", 33446, pub_key, nullptr);
|
||||
tox_add_tcp_relay(tox, "127.0.0.2", 33446, pub_key, nullptr);
|
||||
|
||||
tox_events_init(tox);
|
||||
|
||||
@ -169,7 +170,7 @@ void TestBootstrap(Fuzz_Data &input)
|
||||
while (input.size > 0) {
|
||||
Tox_Err_Events_Iterate error_iterate;
|
||||
Tox_Events *events = tox_events_iterate(tox, true, &error_iterate);
|
||||
assert(tox_events_equal(events, events));
|
||||
assert(tox_events_equal(null_sys.sys.get(), events, events));
|
||||
tox_dispatch_invoke(dispatch, events, tox, nullptr);
|
||||
tox_events_free(events);
|
||||
// Move the clock forward a decent amount so all the time-based checks
|
||||
|
@ -24,7 +24,7 @@ void setup_callbacks(Tox_Dispatch *dispatch)
|
||||
});
|
||||
tox_events_callback_conference_connected(
|
||||
dispatch, [](Tox *tox, const Tox_Event_Conference_Connected *event, void *user_data) {
|
||||
assert(event == nullptr);
|
||||
assert(event != nullptr);
|
||||
});
|
||||
tox_events_callback_conference_invite(
|
||||
dispatch, [](Tox *tox, const Tox_Event_Conference_Invite *event, void *user_data) {
|
||||
@ -35,19 +35,19 @@ void setup_callbacks(Tox_Dispatch *dispatch)
|
||||
});
|
||||
tox_events_callback_conference_message(
|
||||
dispatch, [](Tox *tox, const Tox_Event_Conference_Message *event, void *user_data) {
|
||||
assert(event == nullptr);
|
||||
assert(event != nullptr);
|
||||
});
|
||||
tox_events_callback_conference_peer_list_changed(dispatch,
|
||||
[](Tox *tox, const Tox_Event_Conference_Peer_List_Changed *event, void *user_data) {
|
||||
assert(event == nullptr);
|
||||
assert(event != nullptr);
|
||||
});
|
||||
tox_events_callback_conference_peer_name(
|
||||
dispatch, [](Tox *tox, const Tox_Event_Conference_Peer_Name *event, void *user_data) {
|
||||
assert(event == nullptr);
|
||||
assert(event != nullptr);
|
||||
});
|
||||
tox_events_callback_conference_title(
|
||||
dispatch, [](Tox *tox, const Tox_Event_Conference_Title *event, void *user_data) {
|
||||
assert(event == nullptr);
|
||||
assert(event != nullptr);
|
||||
});
|
||||
tox_events_callback_file_chunk_request(
|
||||
dispatch, [](Tox *tox, const Tox_Event_File_Chunk_Request *event, void *user_data) {
|
||||
@ -61,11 +61,11 @@ void setup_callbacks(Tox_Dispatch *dispatch)
|
||||
});
|
||||
tox_events_callback_file_recv_chunk(
|
||||
dispatch, [](Tox *tox, const Tox_Event_File_Recv_Chunk *event, void *user_data) {
|
||||
assert(event == nullptr);
|
||||
assert(event != nullptr);
|
||||
});
|
||||
tox_events_callback_file_recv_control(
|
||||
dispatch, [](Tox *tox, const Tox_Event_File_Recv_Control *event, void *user_data) {
|
||||
assert(event == nullptr);
|
||||
assert(event != nullptr);
|
||||
});
|
||||
tox_events_callback_friend_connection_status(
|
||||
dispatch, [](Tox *tox, const Tox_Event_Friend_Connection_Status *event, void *user_data) {
|
||||
@ -134,6 +134,8 @@ void setup_callbacks(Tox_Dispatch *dispatch)
|
||||
void TestEndToEnd(Fuzz_Data &input)
|
||||
{
|
||||
Fuzz_System sys(input);
|
||||
// Used for places where we want all allocations to succeed.
|
||||
Null_System null_sys;
|
||||
|
||||
Ptr<Tox_Options> opts(tox_options_new(nullptr), tox_options_free);
|
||||
assert(opts != nullptr);
|
||||
@ -170,7 +172,7 @@ void TestEndToEnd(Fuzz_Data &input)
|
||||
while (input.size > 0) {
|
||||
Tox_Err_Events_Iterate error_iterate;
|
||||
Tox_Events *events = tox_events_iterate(tox, true, &error_iterate);
|
||||
assert(tox_events_equal(events, events));
|
||||
assert(tox_events_equal(null_sys.sys.get(), events, events));
|
||||
tox_dispatch_invoke(dispatch, events, tox, nullptr);
|
||||
tox_events_free(events);
|
||||
// Move the clock forward a decent amount so all the time-based checks
|
||||
|
@ -62,6 +62,33 @@ static int recv_common(Fuzz_Data &input, uint8_t *buf, size_t buf_len)
|
||||
return res;
|
||||
}
|
||||
|
||||
template <typename F>
|
||||
static void *alloc_common(Fuzz_Data &data, F func)
|
||||
{
|
||||
CONSUME1_OR_RETURN_VAL(const uint8_t want_alloc, data, func());
|
||||
if (!want_alloc) {
|
||||
return nullptr;
|
||||
}
|
||||
return func();
|
||||
}
|
||||
|
||||
static constexpr Memory_Funcs fuzz_memory_funcs = {
|
||||
/* .malloc = */
|
||||
 {
|
||||
return alloc_common(self->data, [=]() { return std::malloc(size); });
|
||||
},
|
||||
/* .calloc = */
|
||||
 {
|
||||
return alloc_common(self->data, [=]() { return std::calloc(nmemb, size); });
|
||||
},
|
||||
/* .realloc = */
|
||||
 {
|
||||
return alloc_common(self->data, [=]() { return std::realloc(ptr, size); });
|
||||
},
|
||||
/* .free = */
|
||||
 { std::free(ptr); },
|
||||
};
|
||||
|
||||
static constexpr Network_Funcs fuzz_network_funcs = {
|
||||
/* .close = */  { return 0; },
|
||||
/* .accept = */  { return 1337; },
|
||||
@ -149,6 +176,7 @@ static constexpr Random_Funcs fuzz_random_funcs = {
|
||||
Fuzz_System::Fuzz_System(Fuzz_Data &input)
|
||||
: System{
|
||||
std::make_unique<Tox_System>(),
|
||||
std::make_unique<Memory>(Memory{&fuzz_memory_funcs, this}),
|
||||
std::make_unique<Network>(Network{&fuzz_network_funcs, this}),
|
||||
std::make_unique<Random>(Random{&fuzz_random_funcs, this}),
|
||||
}
|
||||
@ -156,10 +184,22 @@ Fuzz_System::Fuzz_System(Fuzz_Data &input)
|
||||
{
|
||||
sys->mono_time_callback =  { return self->clock; };
|
||||
sys->mono_time_user_data = this;
|
||||
sys->mem = mem.get();
|
||||
sys->ns = ns.get();
|
||||
sys->rng = rng.get();
|
||||
}
|
||||
|
||||
static constexpr Memory_Funcs null_memory_funcs = {
|
||||
/* .malloc = */
|
||||
 { return std::malloc(size); },
|
||||
/* .calloc = */
|
||||
 { return std::calloc(nmemb, size); },
|
||||
/* .realloc = */
|
||||
 { return std::realloc(ptr, size); },
|
||||
/* .free = */
|
||||
 { std::free(ptr); },
|
||||
};
|
||||
|
||||
static constexpr Network_Funcs null_network_funcs = {
|
||||
/* .close = */  { return 0; },
|
||||
/* .accept = */  { return 1337; },
|
||||
@ -224,12 +264,14 @@ static constexpr Random_Funcs null_random_funcs = {
|
||||
Null_System::Null_System()
|
||||
: System{
|
||||
std::make_unique<Tox_System>(),
|
||||
std::make_unique<Memory>(Memory{&null_memory_funcs, this}),
|
||||
std::make_unique<Network>(Network{&null_network_funcs, this}),
|
||||
std::make_unique<Random>(Random{&null_random_funcs, this}),
|
||||
}
|
||||
{
|
||||
sys->mono_time_callback =  { return self->clock; };
|
||||
sys->mono_time_user_data = this;
|
||||
sys->mem = mem.get();
|
||||
sys->ns = ns.get();
|
||||
sys->rng = rng.get();
|
||||
}
|
||||
@ -244,6 +286,8 @@ static uint16_t get_port(const Network_Addr *addr)
|
||||
}
|
||||
}
|
||||
|
||||
static constexpr Memory_Funcs record_memory_funcs = null_memory_funcs;
|
||||
|
||||
static constexpr Network_Funcs record_network_funcs = {
|
||||
/* .close = */  { return 0; },
|
||||
/* .accept = */  { return 2; },
|
||||
@ -348,6 +392,7 @@ static constexpr Random_Funcs record_random_funcs = {
|
||||
Record_System::Record_System(Global &global, uint64_t seed, const char *name)
|
||||
: System{
|
||||
std::make_unique<Tox_System>(),
|
||||
std::make_unique<Memory>(Memory{&record_memory_funcs, this}),
|
||||
std::make_unique<Network>(Network{&record_network_funcs, this}),
|
||||
std::make_unique<Random>(Random{&record_random_funcs, this}),
|
||||
}
|
||||
@ -357,6 +402,7 @@ Record_System::Record_System(Global &global, uint64_t seed, const char *name)
|
||||
{
|
||||
sys->mono_time_callback =  { return self->clock; };
|
||||
sys->mono_time_user_data = this;
|
||||
sys->mem = mem.get();
|
||||
sys->ns = ns.get();
|
||||
sys->rng = rng.get();
|
||||
}
|
||||
|
@ -59,6 +59,23 @@ struct Fuzz_Data {
|
||||
} \
|
||||
DECL = INPUT.consume1()
|
||||
|
||||
/** @brief Consumes 1 byte of the fuzzer input or returns a value if no data
|
||||
* available.
|
||||
*
|
||||
* This advances the fuzzer input data by 1 byte and consumes that byte in the
|
||||
* declaration.
|
||||
*
|
||||
* @example
|
||||
* @code
|
||||
* CONSUME1_OR_RETURN_VAL(const uint8_t one_byte, input, nullptr);
|
||||
* @endcode
|
||||
*/
|
||||
#define CONSUME1_OR_RETURN_VAL(DECL, INPUT, VAL) \
|
||||
if (INPUT.size < 1) { \
|
||||
return VAL; \
|
||||
} \
|
||||
DECL = INPUT.consume1()
|
||||
|
||||
/** @brief Consumes SIZE bytes of the fuzzer input or returns if not enough data available.
|
||||
*
|
||||
* This advances the fuzzer input data by SIZE byte and consumes those bytes in
|
||||
@ -100,11 +117,13 @@ void fuzz_select_target(const uint8_t *data, std::size_t size, Args &&... args)
|
||||
return fuzz_select_target(selector, input, std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
struct Memory;
|
||||
struct Network;
|
||||
struct Random;
|
||||
|
||||
struct System {
|
||||
std::unique_ptr<Tox_System> sys;
|
||||
std::unique_ptr<Memory> mem;
|
||||
std::unique_ptr<Network> ns;
|
||||
std::unique_ptr<Random> rng;
|
||||
|
||||
|
@ -62,13 +62,14 @@ struct with<IP_Port> {
|
||||
|
||||
/** @brief Construct a Networking_Core object using the Network vtable passed.
|
||||
*
|
||||
* Use `with<Logger>{} >> with<Networking_Core>{input, ns} >> ...` to construct
|
||||
* Use `with<Logger>{} >> with<Networking_Core>{input, ns, mem} >> ...` to construct
|
||||
* a logger and pass it to the Networking_Core constructor function.
|
||||
*/
|
||||
template <>
|
||||
struct with<Networking_Core> {
|
||||
Fuzz_Data &input_;
|
||||
const Network *ns_;
|
||||
const Memory *mem_;
|
||||
Ptr<Logger> logger_{nullptr, logger_kill};
|
||||
|
||||
friend with operator>>(with<Logger> f, with self)
|
||||
@ -82,7 +83,7 @@ struct with<Networking_Core> {
|
||||
{
|
||||
with<IP_Port>{input_} >> [&f, this](const IP_Port &ipp) {
|
||||
Ptr<Networking_Core> net(
|
||||
new_networking_ex(logger_.get(), ns_, &ipp.ip, ipp.port, ipp.port + 100, nullptr),
|
||||
new_networking_ex(logger_.get(), mem_, ns_, &ipp.ip, ipp.port, ipp.port + 100, nullptr),
|
||||
kill_networking);
|
||||
if (net == nullptr) {
|
||||
return;
|
||||
|
@ -20,6 +20,7 @@
|
||||
* bazel build //c-toxcore/testing/fuzzing:protodump_bin && \
|
||||
* bazel-bin/c-toxcore/testing/fuzzing/protodump_bin
|
||||
*/
|
||||
#include <array>
|
||||
#include <cassert>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
@ -243,12 +244,12 @@ void RecordBootstrap()
|
||||
Tox_Events *events;
|
||||
|
||||
events = tox_events_iterate(tox1, true, &error_iterate);
|
||||
assert(tox_events_equal(events, events));
|
||||
assert(tox_events_equal(sys1.sys.get(), events, events));
|
||||
tox_dispatch_invoke(dispatch, events, tox1, &done1);
|
||||
tox_events_free(events);
|
||||
|
||||
events = tox_events_iterate(tox2, true, &error_iterate);
|
||||
assert(tox_events_equal(events, events));
|
||||
assert(tox_events_equal(sys2.sys.get(), events, events));
|
||||
tox_dispatch_invoke(dispatch, events, tox2, &done2);
|
||||
tox_events_free(events);
|
||||
|
||||
|
@ -172,7 +172,7 @@ void TestEndToEnd(Fuzz_Data &input)
|
||||
while (input.size > 0) {
|
||||
Tox_Err_Events_Iterate error_iterate;
|
||||
Tox_Events *events = tox_events_iterate(tox, true, &error_iterate);
|
||||
assert(tox_events_equal(events, events));
|
||||
assert(tox_events_equal(tox_get_system(tox), events, events));
|
||||
tox_dispatch_invoke(dispatch, events, tox, nullptr);
|
||||
tox_events_free(events);
|
||||
sys.clock += std::max(System::MIN_ITERATION_INTERVAL, random_u08(sys.rng.get()));
|
||||
|
Reference in New Issue
Block a user