Chromium Code Reviews| Index: src/processor/exploitability_linux.cc |
| =================================================================== |
| --- src/processor/exploitability_linux.cc (revision 1462) |
| +++ src/processor/exploitability_linux.cc (working copy) |
| @@ -39,6 +39,7 @@ |
| #include "google_breakpad/processor/process_state.h" |
| #include "google_breakpad/processor/call_stack.h" |
| #include "google_breakpad/processor/stack_frame.h" |
| +#include "processor/logging.h" |
| namespace { |
| @@ -80,7 +81,67 @@ |
| } |
| } |
| + // Check if the instruction pointer is in a valid instruction region |
| + // by finding if it maps to an executable part of memory |
| + uint64_t instruction_ptr = 0; |
| + |
| + // get exception data (should exist for all minidumps) |
| + MinidumpException *exception = dump_->GetException(); |
| + if (exception == NULL) { |
| + BPLOG(INFO) << "No exception record."; |
| + return EXPLOITABILITY_ERR_PROCESSING; |
| + } |
| + const MinidumpContext *context = exception->GetContext(); |
| + if (context == NULL) { |
| + BPLOG(INFO) << "No exception context."; |
| + return EXPLOITABILITY_ERR_PROCESSING; |
| + } |
| + |
| + // get instruction pointer based off architecture |
| + uint32_t architecture = context->GetContextCPU(); |
| + switch (architecture) { |
| + case MD_CONTEXT_X86: |
| + instruction_ptr = context->GetContextX86()->eip; |
| + break; |
| + case MD_CONTEXT_AMD64: |
| + instruction_ptr = context->GetContextAMD64()->rip; |
| + break; |
| + default: |
| + // TODO(liuandrew) support ARM and arm64 architectures |
|
ivanpe
2015/06/25 20:58:39
The style should be:
// TODO(liuandrew): Add supp
|
| + BPLOG(INFO) << "Unsupported architecture."; |
| + return EXPLOITABILITY_ERR_PROCESSING; |
| + } |
| + |
| + if (!this->InstructionPointerInCode(instruction_ptr)) { |
| + return EXPLOITABILITY_HIGH; |
| + } |
| + |
| return EXPLOITABILITY_NONE; |
| } |
| +bool ExploitabilityLinux::InstructionPointerInCode(uint64_t instruction_ptr) { |
| + // get memory mapping |
|
ivanpe
2015/06/25 20:58:38
same
|
| + // most minidumps will not contain a memory mapping, so we will commonly |
| + // resort to stack pointer approximation and checking modules |
| + MinidumpMemoryInfoList *mem_info_list = dump_->GetMemoryInfoList(); |
| + const MinidumpMemoryInfo *mem_info = |
| + mem_info_list ? |
| + mem_info_list->GetMemoryInfoForAddress(instruction_ptr) : NULL; |
| + |
| + // check if the memory mapping at the instruction pointer is executable |
|
ivanpe
2015/06/25 20:58:38
same
|
| + // if there is no memory mapping, we will use stack pointer approximation |
| + // and the modules as reference |
| + if (mem_info != NULL) { |
| + return mem_info->IsExecutable(); |
| + } |
| + |
| + // if the memory mapping retrieval fails, we will approximate check |
|
ivanpe
2015/06/25 20:58:39
same
|
| + // modules to see if the instruction pointer is inside a module |
| + // TODO(liuandrew) the entirety of a module is not necessarily executable |
|
ivanpe
2015/06/25 20:58:39
same:
TODO(liuandrew):
|
| + // check if the instruction pointer lies in an executable region |
| + MinidumpModuleList *minidump_module_list = dump_->GetModuleList(); |
| + return !minidump_module_list || |
| + minidump_module_list->GetModuleForAddress(instruction_ptr); |
| +} |
| + |
| } // namespace google_breakpad |