Skip to content

Commit

Permalink
syz-fuzzer: repair leak checking
Browse files Browse the repository at this point in the history
Notify fuzzer from the manager when corpus triage has finished
to start leak checking.

Fixes google#4728
  • Loading branch information
dvyukov committed May 23, 2024
1 parent 4c2072e commit ef4747c
Show file tree
Hide file tree
Showing 7 changed files with 248 additions and 28 deletions.
7 changes: 7 additions & 0 deletions pkg/flatrpc/flatrpc.fbs
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ table FeatureInfoRaw {
union HostMessagesRaw {
ExecRequest :ExecRequestRaw,
SignalUpdate :SignalUpdateRaw,
StartLeakChecks :StartLeakChecksRaw
}

table HostMessageRaw {
Expand Down Expand Up @@ -160,6 +161,12 @@ table SignalUpdateRaw {
drop_max :[uint32];
}

// Leak checking is very slow so we don't do it while triaging the corpus
// (otherwise it takes infinity). This message serves as a signal that
// the corpus was triaged and the fuzzer can start leak checking.
table StartLeakChecksRaw {
}

// Notification from the executor that it started executing the program 'id'.
// We want this request to be as small and as fast as possible b/c we need it
// to reach the host (or at least leave the VM) before the VM crashes
Expand Down
83 changes: 74 additions & 9 deletions pkg/flatrpc/flatrpc.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

123 changes: 118 additions & 5 deletions pkg/flatrpc/flatrpc.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,10 @@ struct SignalUpdateRaw;
struct SignalUpdateRawBuilder;
struct SignalUpdateRawT;

struct StartLeakChecksRaw;
struct StartLeakChecksRawBuilder;
struct StartLeakChecksRawT;

struct ExecutingMessageRaw;
struct ExecutingMessageRawBuilder;
struct ExecutingMessageRawT;
Expand Down Expand Up @@ -161,31 +165,34 @@ enum class HostMessagesRaw : uint8_t {
NONE = 0,
ExecRequest = 1,
SignalUpdate = 2,
StartLeakChecks = 3,
MIN = NONE,
MAX = SignalUpdate
MAX = StartLeakChecks
};

inline const HostMessagesRaw (&EnumValuesHostMessagesRaw())[3] {
inline const HostMessagesRaw (&EnumValuesHostMessagesRaw())[4] {
static const HostMessagesRaw values[] = {
HostMessagesRaw::NONE,
HostMessagesRaw::ExecRequest,
HostMessagesRaw::SignalUpdate
HostMessagesRaw::SignalUpdate,
HostMessagesRaw::StartLeakChecks
};
return values;
}

inline const char * const *EnumNamesHostMessagesRaw() {
static const char * const names[4] = {
static const char * const names[5] = {
"NONE",
"ExecRequest",
"SignalUpdate",
"StartLeakChecks",
nullptr
};
return names;
}

inline const char *EnumNameHostMessagesRaw(HostMessagesRaw e) {
if (flatbuffers::IsOutRange(e, HostMessagesRaw::NONE, HostMessagesRaw::SignalUpdate)) return "";
if (flatbuffers::IsOutRange(e, HostMessagesRaw::NONE, HostMessagesRaw::StartLeakChecks)) return "";
const size_t index = static_cast<size_t>(e);
return EnumNamesHostMessagesRaw()[index];
}
Expand All @@ -202,6 +209,10 @@ template<> struct HostMessagesRawTraits<rpc::SignalUpdateRaw> {
static const HostMessagesRaw enum_value = HostMessagesRaw::SignalUpdate;
};

template<> struct HostMessagesRawTraits<rpc::StartLeakChecksRaw> {
static const HostMessagesRaw enum_value = HostMessagesRaw::StartLeakChecks;
};

template<typename T> struct HostMessagesRawUnionTraits {
static const HostMessagesRaw enum_value = HostMessagesRaw::NONE;
};
Expand All @@ -214,6 +225,10 @@ template<> struct HostMessagesRawUnionTraits<rpc::SignalUpdateRawT> {
static const HostMessagesRaw enum_value = HostMessagesRaw::SignalUpdate;
};

template<> struct HostMessagesRawUnionTraits<rpc::StartLeakChecksRawT> {
static const HostMessagesRaw enum_value = HostMessagesRaw::StartLeakChecks;
};

struct HostMessagesRawUnion {
HostMessagesRaw type;
void *value;
Expand Down Expand Up @@ -260,6 +275,14 @@ struct HostMessagesRawUnion {
return type == HostMessagesRaw::SignalUpdate ?
reinterpret_cast<const rpc::SignalUpdateRawT *>(value) : nullptr;
}
rpc::StartLeakChecksRawT *AsStartLeakChecks() {
return type == HostMessagesRaw::StartLeakChecks ?
reinterpret_cast<rpc::StartLeakChecksRawT *>(value) : nullptr;
}
const rpc::StartLeakChecksRawT *AsStartLeakChecks() const {
return type == HostMessagesRaw::StartLeakChecks ?
reinterpret_cast<const rpc::StartLeakChecksRawT *>(value) : nullptr;
}
};

bool VerifyHostMessagesRaw(flatbuffers::Verifier &verifier, const void *obj, HostMessagesRaw type);
Expand Down Expand Up @@ -1322,6 +1345,9 @@ struct HostMessageRaw FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
const rpc::SignalUpdateRaw *msg_as_SignalUpdate() const {
return msg_type() == rpc::HostMessagesRaw::SignalUpdate ? static_cast<const rpc::SignalUpdateRaw *>(msg()) : nullptr;
}
const rpc::StartLeakChecksRaw *msg_as_StartLeakChecks() const {
return msg_type() == rpc::HostMessagesRaw::StartLeakChecks ? static_cast<const rpc::StartLeakChecksRaw *>(msg()) : nullptr;
}
bool Verify(flatbuffers::Verifier &verifier) const {
return VerifyTableStart(verifier) &&
VerifyField<uint8_t>(verifier, VT_MSG_TYPE, 1) &&
Expand All @@ -1342,6 +1368,10 @@ template<> inline const rpc::SignalUpdateRaw *HostMessageRaw::msg_as<rpc::Signal
return msg_as_SignalUpdate();
}

template<> inline const rpc::StartLeakChecksRaw *HostMessageRaw::msg_as<rpc::StartLeakChecksRaw>() const {
return msg_as_StartLeakChecks();
}

struct HostMessageRawBuilder {
typedef HostMessageRaw Table;
flatbuffers::FlatBufferBuilder &fbb_;
Expand Down Expand Up @@ -1676,6 +1706,45 @@ inline flatbuffers::Offset<SignalUpdateRaw> CreateSignalUpdateRawDirect(

flatbuffers::Offset<SignalUpdateRaw> CreateSignalUpdateRaw(flatbuffers::FlatBufferBuilder &_fbb, const SignalUpdateRawT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);

struct StartLeakChecksRawT : public flatbuffers::NativeTable {
typedef StartLeakChecksRaw TableType;
};

struct StartLeakChecksRaw FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
typedef StartLeakChecksRawT NativeTableType;
typedef StartLeakChecksRawBuilder Builder;
bool Verify(flatbuffers::Verifier &verifier) const {
return VerifyTableStart(verifier) &&
verifier.EndTable();
}
StartLeakChecksRawT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
void UnPackTo(StartLeakChecksRawT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
static flatbuffers::Offset<StartLeakChecksRaw> Pack(flatbuffers::FlatBufferBuilder &_fbb, const StartLeakChecksRawT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
};

struct StartLeakChecksRawBuilder {
typedef StartLeakChecksRaw Table;
flatbuffers::FlatBufferBuilder &fbb_;
flatbuffers::uoffset_t start_;
explicit StartLeakChecksRawBuilder(flatbuffers::FlatBufferBuilder &_fbb)
: fbb_(_fbb) {
start_ = fbb_.StartTable();
}
flatbuffers::Offset<StartLeakChecksRaw> Finish() {
const auto end = fbb_.EndTable(start_);
auto o = flatbuffers::Offset<StartLeakChecksRaw>(end);
return o;
}
};

inline flatbuffers::Offset<StartLeakChecksRaw> CreateStartLeakChecksRaw(
flatbuffers::FlatBufferBuilder &_fbb) {
StartLeakChecksRawBuilder builder_(_fbb);
return builder_.Finish();
}

flatbuffers::Offset<StartLeakChecksRaw> CreateStartLeakChecksRaw(flatbuffers::FlatBufferBuilder &_fbb, const StartLeakChecksRawT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);

struct ExecutingMessageRawT : public flatbuffers::NativeTable {
typedef ExecutingMessageRaw TableType;
int64_t id = 0;
Expand Down Expand Up @@ -2494,6 +2563,29 @@ inline flatbuffers::Offset<SignalUpdateRaw> CreateSignalUpdateRaw(flatbuffers::F
_drop_max);
}

inline StartLeakChecksRawT *StartLeakChecksRaw::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
auto _o = std::unique_ptr<StartLeakChecksRawT>(new StartLeakChecksRawT());
UnPackTo(_o.get(), _resolver);
return _o.release();
}

inline void StartLeakChecksRaw::UnPackTo(StartLeakChecksRawT *_o, const flatbuffers::resolver_function_t *_resolver) const {
(void)_o;
(void)_resolver;
}

inline flatbuffers::Offset<StartLeakChecksRaw> StartLeakChecksRaw::Pack(flatbuffers::FlatBufferBuilder &_fbb, const StartLeakChecksRawT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
return CreateStartLeakChecksRaw(_fbb, _o, _rehasher);
}

inline flatbuffers::Offset<StartLeakChecksRaw> CreateStartLeakChecksRaw(flatbuffers::FlatBufferBuilder &_fbb, const StartLeakChecksRawT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
(void)_rehasher;
(void)_o;
struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const StartLeakChecksRawT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
return rpc::CreateStartLeakChecksRaw(
_fbb);
}

inline ExecutingMessageRawT *ExecutingMessageRaw::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
auto _o = std::unique_ptr<ExecutingMessageRawT>(new ExecutingMessageRawT());
UnPackTo(_o.get(), _resolver);
Expand Down Expand Up @@ -2681,6 +2773,10 @@ inline bool VerifyHostMessagesRaw(flatbuffers::Verifier &verifier, const void *o
auto ptr = reinterpret_cast<const rpc::SignalUpdateRaw *>(obj);
return verifier.VerifyTable(ptr);
}
case HostMessagesRaw::StartLeakChecks: {
auto ptr = reinterpret_cast<const rpc::StartLeakChecksRaw *>(obj);
return verifier.VerifyTable(ptr);
}
default: return true;
}
}
Expand Down Expand Up @@ -2708,6 +2804,10 @@ inline void *HostMessagesRawUnion::UnPack(const void *obj, HostMessagesRaw type,
auto ptr = reinterpret_cast<const rpc::SignalUpdateRaw *>(obj);
return ptr->UnPack(resolver);
}
case HostMessagesRaw::StartLeakChecks: {
auto ptr = reinterpret_cast<const rpc::StartLeakChecksRaw *>(obj);
return ptr->UnPack(resolver);
}
default: return nullptr;
}
}
Expand All @@ -2723,6 +2823,10 @@ inline flatbuffers::Offset<void> HostMessagesRawUnion::Pack(flatbuffers::FlatBuf
auto ptr = reinterpret_cast<const rpc::SignalUpdateRawT *>(value);
return CreateSignalUpdateRaw(_fbb, ptr, _rehasher).Union();
}
case HostMessagesRaw::StartLeakChecks: {
auto ptr = reinterpret_cast<const rpc::StartLeakChecksRawT *>(value);
return CreateStartLeakChecksRaw(_fbb, ptr, _rehasher).Union();
}
default: return 0;
}
}
Expand All @@ -2737,6 +2841,10 @@ inline HostMessagesRawUnion::HostMessagesRawUnion(const HostMessagesRawUnion &u)
value = new rpc::SignalUpdateRawT(*reinterpret_cast<rpc::SignalUpdateRawT *>(u.value));
break;
}
case HostMessagesRaw::StartLeakChecks: {
value = new rpc::StartLeakChecksRawT(*reinterpret_cast<rpc::StartLeakChecksRawT *>(u.value));
break;
}
default:
break;
}
Expand All @@ -2754,6 +2862,11 @@ inline void HostMessagesRawUnion::Reset() {
delete ptr;
break;
}
case HostMessagesRaw::StartLeakChecks: {
auto ptr = reinterpret_cast<rpc::StartLeakChecksRawT *>(value);
delete ptr;
break;
}
default: break;
}
value = nullptr;
Expand Down
1 change: 1 addition & 0 deletions pkg/flatrpc/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ type ExecutorMessages = ExecutorMessagesRawT
type ExecutorMessage = ExecutorMessageRawT
type ExecRequest = ExecRequestRawT
type SignalUpdate = SignalUpdateRawT
type StartLeakChecks = StartLeakChecksRawT
type ExecutingMessage = ExecutingMessageRawT
type CallInfo = CallInfoRawT
type Comparison = ComparisonRawT
Expand Down
Loading

0 comments on commit ef4747c

Please sign in to comment.