diff options
Diffstat (limited to 'src/processor/exploitability_unittest.cc')
-rw-r--r-- | src/processor/exploitability_unittest.cc | 222 |
1 files changed, 46 insertions, 176 deletions
diff --git a/src/processor/exploitability_unittest.cc b/src/processor/exploitability_unittest.cc index ceb4ee85..72994d5a 100644 --- a/src/processor/exploitability_unittest.cc +++ b/src/processor/exploitability_unittest.cc @@ -35,213 +35,83 @@ #include "breakpad_googletest_includes.h" #include "common/using_std_string.h" #include "google_breakpad/processor/basic_source_line_resolver.h" -#include "google_breakpad/processor/call_stack.h" -#include "google_breakpad/processor/code_module.h" -#include "google_breakpad/processor/code_modules.h" -#include "google_breakpad/processor/minidump.h" #include "google_breakpad/processor/minidump_processor.h" #include "google_breakpad/processor/process_state.h" -#include "google_breakpad/processor/stack_frame.h" -#include "google_breakpad/processor/symbol_supplier.h" - -namespace google_breakpad { -class MockMinidump : public Minidump { - public: - MockMinidump() : Minidump("") { - } - - MOCK_METHOD0(Read, bool()); - MOCK_CONST_METHOD0(path, string()); - MOCK_CONST_METHOD0(header, const MDRawHeader*()); - MOCK_METHOD0(GetThreadList, MinidumpThreadList*()); -}; -} +#include "processor/simple_symbol_supplier.h" namespace { using google_breakpad::BasicSourceLineResolver; -using google_breakpad::CallStack; -using google_breakpad::CodeModule; using google_breakpad::MinidumpProcessor; -using google_breakpad::MinidumpThreadList; -using google_breakpad::MinidumpThread; -using google_breakpad::MockMinidump; using google_breakpad::ProcessState; -using google_breakpad::SymbolSupplier; -using google_breakpad::SystemInfo; - -class TestSymbolSupplier : public SymbolSupplier { - public: - TestSymbolSupplier() : interrupt_(false) {} +using google_breakpad::SimpleSymbolSupplier; - virtual SymbolResult GetSymbolFile(const CodeModule *module, - const SystemInfo *system_info, - string *symbol_file); - - virtual SymbolResult GetSymbolFile(const CodeModule *module, - const SystemInfo *system_info, - string *symbol_file, - string *symbol_data); - - virtual SymbolResult GetCStringSymbolData(const CodeModule *module, - const SystemInfo *system_info, - string *symbol_file, - char **symbol_data, - size_t *symbol_data_size); - - virtual void FreeSymbolData(const CodeModule *module) { } - // When set to true, causes the SymbolSupplier to return INTERRUPT - void set_interrupt(bool interrupt) { interrupt_ = interrupt; } +string TestDataDir() { + return string(getenv("srcdir") ? getenv("srcdir") : ".") + + "/src/processor/testdata"; +} - private: - bool interrupt_; -}; +// Find the given dump file in <srcdir>/src/processor/testdata, process it, +// and get the exploitability rating. Returns EXPLOITABILITY_ERR_PROCESSING +// if the crash dump can't be processed. +google_breakpad::ExploitabilityRating +ExploitabilityFor(const string& filename) { + SimpleSymbolSupplier supplier(TestDataDir() + "/symbols"); + BasicSourceLineResolver resolver; + MinidumpProcessor processor(&supplier, &resolver, true); + ProcessState state; -SymbolSupplier::SymbolResult TestSymbolSupplier::GetSymbolFile( - const CodeModule *module, - const SystemInfo *system_info, - string *symbol_file) { + string minidump_file = TestDataDir() + "/" + filename; - if (interrupt_) { - return INTERRUPT; + if (processor.Process(minidump_file, &state) != + google_breakpad::PROCESS_OK) { + return google_breakpad::EXPLOITABILITY_ERR_PROCESSING; } - return NOT_FOUND; -} - -SymbolSupplier::SymbolResult TestSymbolSupplier::GetCStringSymbolData( - const CodeModule *module, - const SystemInfo *system_info, - string *symbol_file, - char **symbol_data, - size_t *symbol_data_size) { - return GetSymbolFile(module, system_info, symbol_file); -} - -SymbolSupplier::SymbolResult TestSymbolSupplier::GetSymbolFile( - const CodeModule *module, - const SystemInfo *system_info, - string *symbol_file, - string *symbol_data) { - return GetSymbolFile(module, system_info, symbol_file); + return state.exploitability(); } TEST(ExploitabilityTest, TestWindowsEngine) { - TestSymbolSupplier supplier; - BasicSourceLineResolver resolver; - MinidumpProcessor processor(&supplier, &resolver, true); - ProcessState state; - - string minidump_file = string(getenv("srcdir") ? getenv("srcdir") : ".") + - "/src/processor/testdata/ascii_read_av.dmp"; - ASSERT_EQ(processor.Process(minidump_file, &state), - google_breakpad::PROCESS_OK); ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, - state.exploitability()); - - minidump_file = string(getenv("srcdir") ? getenv("srcdir") : ".") + - "/src/processor/testdata/ascii_read_av_block_write.dmp"; - ASSERT_EQ(processor.Process(minidump_file, &state), - google_breakpad::PROCESS_OK); + ExploitabilityFor("ascii_read_av.dmp")); ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, - state.exploitability()); - - minidump_file = string(getenv("srcdir") ? getenv("srcdir") : ".") + - "/src/processor/testdata/ascii_read_av_clobber_write.dmp"; - ASSERT_EQ(processor.Process(minidump_file, &state), - google_breakpad::PROCESS_OK); + ExploitabilityFor("ascii_read_av_block_write.dmp")); ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, - state.exploitability()); - - minidump_file = string(getenv("srcdir") ? getenv("srcdir") : ".") + - "/src/processor/testdata/ascii_read_av_conditional.dmp"; - ASSERT_EQ(processor.Process(minidump_file, &state), - google_breakpad::PROCESS_OK); + ExploitabilityFor("ascii_read_av_clobber_write.dmp")); ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, - state.exploitability()); - - minidump_file = string(getenv("srcdir") ? getenv("srcdir") : ".") + - "/src/processor/testdata/ascii_read_av_then_jmp.dmp"; - ASSERT_EQ(processor.Process(minidump_file, &state), - google_breakpad::PROCESS_OK); + ExploitabilityFor("ascii_read_av_conditional.dmp")); ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, - state.exploitability()); - - minidump_file = string(getenv("srcdir") ? getenv("srcdir") : ".") + - "/src/processor/testdata/ascii_read_av_xchg_write.dmp"; - ASSERT_EQ(processor.Process(minidump_file, &state), - google_breakpad::PROCESS_OK); + ExploitabilityFor("ascii_read_av_then_jmp.dmp")); ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, - state.exploitability()); - - minidump_file = string(getenv("srcdir") ? getenv("srcdir") : ".") + - "/src/processor/testdata/ascii_write_av.dmp"; - ASSERT_EQ(processor.Process(minidump_file, &state), - google_breakpad::PROCESS_OK); + ExploitabilityFor("ascii_read_av_xchg_write.dmp")); ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, - state.exploitability()); - - minidump_file = string(getenv("srcdir") ? getenv("srcdir") : ".") + - "/src/processor/testdata/ascii_write_av_arg_to_call.dmp"; - ASSERT_EQ(processor.Process(minidump_file, &state), - google_breakpad::PROCESS_OK); + ExploitabilityFor("ascii_write_av.dmp")); ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, - state.exploitability()); - - minidump_file = string(getenv("srcdir") ? getenv("srcdir") : ".") + - "/src/processor/testdata/null_read_av.dmp"; - ASSERT_EQ(processor.Process(minidump_file, &state), - google_breakpad::PROCESS_OK); + ExploitabilityFor("ascii_write_av_arg_to_call.dmp")); ASSERT_EQ(google_breakpad::EXPLOITABILITY_NONE, - state.exploitability()); - - minidump_file = string(getenv("srcdir") ? getenv("srcdir") : ".") + - "/src/processor/testdata/null_write_av.dmp"; - ASSERT_EQ(processor.Process(minidump_file, &state), - google_breakpad::PROCESS_OK); + ExploitabilityFor("null_read_av.dmp")); ASSERT_EQ(google_breakpad::EXPLOITABILITY_NONE, - state.exploitability()); - - minidump_file = string(getenv("srcdir") ? getenv("srcdir") : ".") + - "/src/processor/testdata/stack_exhaustion.dmp"; - ASSERT_EQ(processor.Process(minidump_file, &state), - google_breakpad::PROCESS_OK); + ExploitabilityFor("null_write_av.dmp")); ASSERT_EQ(google_breakpad::EXPLOITABILITY_NONE, - state.exploitability()); - - minidump_file = string(getenv("srcdir") ? getenv("srcdir") : ".") + - "/src/processor/testdata/exec_av_on_stack.dmp"; - ASSERT_EQ(processor.Process(minidump_file, &state), - google_breakpad::PROCESS_OK); + ExploitabilityFor("stack_exhaustion.dmp")); ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, - state.exploitability()); - - minidump_file = string(getenv("srcdir") ? getenv("srcdir") : ".") + - "/src/processor/testdata/write_av_non_null.dmp"; - ASSERT_EQ(processor.Process(minidump_file, &state), - google_breakpad::PROCESS_OK); - ASSERT_EQ(google_breakpad::EXPLOITABLITY_MEDIUM, - state.exploitability()); - - minidump_file = string(getenv("srcdir") ? getenv("srcdir") : ".") + - "/src/processor/testdata/read_av_non_null.dmp"; - ASSERT_EQ(processor.Process(minidump_file, &state), - google_breakpad::PROCESS_OK); + ExploitabilityFor("exec_av_on_stack.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_MEDIUM, + ExploitabilityFor("write_av_non_null.dmp")); ASSERT_EQ(google_breakpad::EXPLOITABILITY_LOW, - state.exploitability()); - - minidump_file = string(getenv("srcdir") ? getenv("srcdir") : ".") + - "/src/processor/testdata/read_av_clobber_write.dmp"; - ASSERT_EQ(processor.Process(minidump_file, &state), - google_breakpad::PROCESS_OK); + ExploitabilityFor("read_av_non_null.dmp")); ASSERT_EQ(google_breakpad::EXPLOITABILITY_LOW, - state.exploitability()); - - minidump_file = string(getenv("srcdir") ? getenv("srcdir") : ".") + - "/src/processor/testdata/read_av_conditional.dmp"; - ASSERT_EQ(processor.Process(minidump_file, &state), - google_breakpad::PROCESS_OK); + ExploitabilityFor("read_av_clobber_write.dmp")); ASSERT_EQ(google_breakpad::EXPLOITABILITY_LOW, - state.exploitability()); + ExploitabilityFor("read_av_conditional.dmp")); +} + +TEST(ExploitabilityTest, TestLinuxEngine) { + ASSERT_EQ(google_breakpad::EXPLOITABILITY_NONE, + ExploitabilityFor("linux_null_read_av.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, + ExploitabilityFor("linux_overflow.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, + ExploitabilityFor("linux_stacksmash.dmp")); } } |