| Index: tools/ipc_fuzzer/mutate/generate.cc
|
| diff --git a/tools/ipc_fuzzer/mutate/generate.cc b/tools/ipc_fuzzer/mutate/generate.cc
|
| index a8cd78a57b341439ec02004fa4f6124cbb520628..d002d8b72f4e44446bdf5b99580b2e0ff4f25607 100644
|
| --- a/tools/ipc_fuzzer/mutate/generate.cc
|
| +++ b/tools/ipc_fuzzer/mutate/generate.cc
|
| @@ -73,6 +73,10 @@ class Generator {
|
| virtual void GenerateBytes(void* data, int data_len) = 0;
|
| };
|
|
|
| +typedef IPC::Message* (*GeneratorFunction)(Generator*);
|
| +typedef std::vector<GeneratorFunction> GeneratorFunctionVector;
|
| +GeneratorFunctionVector g_function_vector;
|
| +
|
| template <typename T>
|
| void GenerateIntegralType(T* value) {
|
| switch (RandInRange(16)) {
|
| @@ -457,32 +461,6 @@ struct GenerateTraits<std::pair<A, B> > {
|
|
|
| // Specializations to generate hand-coded types.
|
| template <>
|
| -struct GenerateTraits<IPC::PlatformFileForTransit> {
|
| - static bool Generate(IPC::PlatformFileForTransit* p, Generator* generator) {
|
| - // TODO(inferno): I don't think we can generate real ones due to check on
|
| - // construct.
|
| - *p = IPC::InvalidPlatformFileForTransit();
|
| - return true;
|
| - }
|
| -};
|
| -
|
| -template <>
|
| -struct GenerateTraits<IPC::ChannelHandle> {
|
| - static bool Generate(IPC::ChannelHandle* p, Generator* generator) {
|
| - // TODO(inferno): Add way to generate real channel handles.
|
| -#if defined(OS_WIN)
|
| - HANDLE fake_handle = (HANDLE)(RandU64());
|
| - p->pipe = IPC::ChannelHandle::PipeHandle(fake_handle);
|
| - return true;
|
| -#elif defined(OS_POSIX)
|
| - return
|
| - GenerateParam(&p->name, generator) &&
|
| - GenerateParam(&p->socket, generator);
|
| -#endif
|
| - }
|
| -};
|
| -
|
| -template <>
|
| struct GenerateTraits<base::NullableString16> {
|
| static bool Generate(base::NullableString16* p, Generator* generator) {
|
| *p = base::NullableString16();
|
| @@ -1184,6 +1162,46 @@ struct GenerateTraits<gfx::Vector2dF> {
|
| }
|
| };
|
|
|
| +template <>
|
| +struct GenerateTraits<IPC::Message> {
|
| + static bool Generate(IPC::Message *p, Generator* generator) {
|
| + if (g_function_vector.empty())
|
| + return false;
|
| + size_t index = RandInRange(g_function_vector.size());
|
| + IPC::Message* ipc_message = (*g_function_vector[index])(generator);
|
| + if (!ipc_message)
|
| + return false;
|
| + p = ipc_message;
|
| + return true;
|
| + }
|
| +};
|
| +
|
| +template <>
|
| +struct GenerateTraits<IPC::PlatformFileForTransit> {
|
| + static bool Generate(IPC::PlatformFileForTransit* p, Generator* generator) {
|
| + // TODO(inferno): I don't think we can generate real ones due to check on
|
| + // construct.
|
| + *p = IPC::InvalidPlatformFileForTransit();
|
| + return true;
|
| + }
|
| +};
|
| +
|
| +template <>
|
| +struct GenerateTraits<IPC::ChannelHandle> {
|
| + static bool Generate(IPC::ChannelHandle* p, Generator* generator) {
|
| + // TODO(inferno): Add way to generate real channel handles.
|
| +#if defined(OS_WIN)
|
| + HANDLE fake_handle = (HANDLE)(RandU64());
|
| + p->pipe = IPC::ChannelHandle::PipeHandle(fake_handle);
|
| + return true;
|
| +#elif defined(OS_POSIX)
|
| + return
|
| + GenerateParam(&p->name, generator) &&
|
| + GenerateParam(&p->socket, generator);
|
| +#endif
|
| + }
|
| +};
|
| +
|
| // PP_ traits.
|
| template <>
|
| struct GenerateTraits<PP_Bool> {
|
| @@ -1569,9 +1587,6 @@ struct GenerateTraits<webrtc::DesktopRect> {
|
| #include "tools/ipc_fuzzer/message_lib/all_messages.h"
|
| #include "ipc/ipc_message_null_macros.h"
|
|
|
| -typedef IPC::Message* (*GeneratorFunction)(Generator*);
|
| -typedef std::vector<GeneratorFunction> GeneratorFunctionVector;
|
| -
|
| void PopulateGeneratorFunctionVector(
|
| GeneratorFunctionVector *function_vector) {
|
| #undef IPC_MESSAGE_DECL
|
| @@ -1600,9 +1615,8 @@ int GenerateMain(int argc, char** argv) {
|
|
|
| InitRand();
|
|
|
| - GeneratorFunctionVector function_vector;
|
| - PopulateGeneratorFunctionVector(&function_vector);
|
| - std::cerr << "Counted " << function_vector.size()
|
| + PopulateGeneratorFunctionVector(&g_function_vector);
|
| + std::cerr << "Counted " << g_function_vector.size()
|
| << " distinct messages present in chrome.\n";
|
|
|
| Generator* generator = new GeneratorImpl();
|
| @@ -1611,8 +1625,8 @@ int GenerateMain(int argc, char** argv) {
|
| int bad_count = 0;
|
| if (message_count < 0) {
|
| // Enumerate them all.
|
| - for (size_t i = 0; i < function_vector.size(); ++i) {
|
| - if (IPC::Message* new_message = (*function_vector[i])(generator))
|
| + for (size_t i = 0; i < g_function_vector.size(); ++i) {
|
| + if (IPC::Message* new_message = (*g_function_vector[i])(generator))
|
| message_vector.push_back(new_message);
|
| else
|
| bad_count += 1;
|
| @@ -1620,8 +1634,8 @@ int GenerateMain(int argc, char** argv) {
|
| } else {
|
| // Generate a random batch.
|
| for (int i = 0; i < message_count; ++i) {
|
| - size_t index = RandInRange(function_vector.size());
|
| - if (IPC::Message* new_message = (*function_vector[index])(generator))
|
| + size_t index = RandInRange(g_function_vector.size());
|
| + if (IPC::Message* new_message = (*g_function_vector[index])(generator))
|
| message_vector.push_back(new_message);
|
| else
|
| bad_count += 1;
|
|
|