| Index: src/processor/exploitability_linux.cc | 
| =================================================================== | 
| --- src/processor/exploitability_linux.cc	(revision 1466) | 
| +++ src/processor/exploitability_linux.cc	(working copy) | 
| @@ -36,6 +36,7 @@ | 
|  | 
| #include "processor/exploitability_linux.h" | 
|  | 
| +#include "google_breakpad/common/minidump_exception_linux.h" | 
| #include "google_breakpad/processor/process_state.h" | 
| #include "google_breakpad/processor/call_stack.h" | 
| #include "google_breakpad/processor/stack_frame.h" | 
| @@ -119,11 +120,23 @@ | 
| return EXPLOITABILITY_ERR_PROCESSING; | 
| } | 
|  | 
| +  // Checking for the instruction pointer in a valid instruction region. | 
| if (!this->InstructionPointerInCode(instruction_ptr)) { | 
| return EXPLOITABILITY_HIGH; | 
| } | 
|  | 
| -  return EXPLOITABILITY_NONE; | 
| +  const MDRawExceptionStream *raw_exception_stream = exception->exception(); | 
| +  if (raw_exception_stream == NULL) { | 
| +    BPLOG(INFO) << "No raw exception stream."; | 
| +    return EXPLOITABILITY_ERR_PROCESSING; | 
| +  } | 
| + | 
| +  // Checking for benign exceptions that caused the crash. | 
| +  if (this->BenignCrashTrigger(raw_exception_stream)) { | 
| +    return EXPLOITABILITY_NONE; | 
| +  } | 
| + | 
| +  return EXPLOITABILITY_INTERESTING; | 
| } | 
|  | 
| bool ExploitabilityLinux::InstructionPointerInCode(uint64_t instruction_ptr) { | 
| @@ -149,4 +162,46 @@ | 
| minidump_module_list->GetModuleForAddress(instruction_ptr); | 
| } | 
|  | 
| +bool ExploitabilityLinux::BenignCrashTrigger(const MDRawExceptionStream | 
| +                                                  *raw_exception_stream) { | 
| +  // Here we check the cause of crash. | 
| +  // If the exception of the crash is a benign exception, | 
| +  // it is probably not exploitable. | 
| +  switch (raw_exception_stream->exception_record.exception_code) { | 
| +    case MD_EXCEPTION_CODE_LIN_SIGHUP: | 
| +    case MD_EXCEPTION_CODE_LIN_SIGINT: | 
| +    case MD_EXCEPTION_CODE_LIN_SIGQUIT: | 
| +    case MD_EXCEPTION_CODE_LIN_SIGTRAP: | 
| +    case MD_EXCEPTION_CODE_LIN_SIGABRT: | 
| +    case MD_EXCEPTION_CODE_LIN_SIGFPE: | 
| +    case MD_EXCEPTION_CODE_LIN_SIGKILL: | 
| +    case MD_EXCEPTION_CODE_LIN_SIGUSR1: | 
| +    case MD_EXCEPTION_CODE_LIN_SIGUSR2: | 
| +    case MD_EXCEPTION_CODE_LIN_SIGPIPE: | 
| +    case MD_EXCEPTION_CODE_LIN_SIGALRM: | 
| +    case MD_EXCEPTION_CODE_LIN_SIGTERM: | 
| +    case MD_EXCEPTION_CODE_LIN_SIGCHLD: | 
| +    case MD_EXCEPTION_CODE_LIN_SIGCONT: | 
| +    case MD_EXCEPTION_CODE_LIN_SIGSTOP: | 
| +    case MD_EXCEPTION_CODE_LIN_SIGTSTP: | 
| +    case MD_EXCEPTION_CODE_LIN_SIGTTIN: | 
| +    case MD_EXCEPTION_CODE_LIN_SIGTTOU: | 
| +    case MD_EXCEPTION_CODE_LIN_SIGURG: | 
| +    case MD_EXCEPTION_CODE_LIN_SIGXCPU: | 
| +    case MD_EXCEPTION_CODE_LIN_SIGXFSZ: | 
| +    case MD_EXCEPTION_CODE_LIN_SIGVTALRM: | 
| +    case MD_EXCEPTION_CODE_LIN_SIGPROF: | 
| +    case MD_EXCEPTION_CODE_LIN_SIGWINCH: | 
| +    case MD_EXCEPTION_CODE_LIN_SIGIO: | 
| +    case MD_EXCEPTION_CODE_LIN_SIGPWR: | 
| +    case MD_EXCEPTION_CODE_LIN_SIGSYS: | 
| +    case MD_EXCEPTION_CODE_LIN_DUMP_REQUESTED: | 
| +      return true; | 
| +      break; | 
| +    default: | 
| +      return false; | 
| +      break; | 
| +  } | 
| +} | 
| + | 
| }  // namespace google_breakpad | 
|  |