aboutsummaryrefslogtreecommitdiff
path: root/src/processor/exploitability_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/processor/exploitability_unittest.cc')
-rw-r--r--src/processor/exploitability_unittest.cc222
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"));
}
}