summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Fuzzer/FuzzerUtilWindows.cpp
diff options
context:
space:
mode:
authorMarcos Pividori <mpividori@google.com>2016-12-13 17:45:20 +0000
committerMarcos Pividori <mpividori@google.com>2016-12-13 17:45:20 +0000
commitc59b692c85e0b75ffb3168c2dbec2a0280886c9b (patch)
treecec0e0d25a453d4860ebc832fdc9f7e8f80e4389 /llvm/lib/Fuzzer/FuzzerUtilWindows.cpp
parent3462cac9afb58c5355f47ecfc8ce1c5dcae85a0a (diff)
downloadbcm5719-llvm-c59b692c85e0b75ffb3168c2dbec2a0280886c9b.tar.gz
bcm5719-llvm-c59b692c85e0b75ffb3168c2dbec2a0280886c9b.zip
[libFuzzer] Improve Signal Handler interface.
Add new flags to FuzzingOptions to represent the different conditions on the signal handling. These options are passed when calling SetSignalHandler(). This changes simplify the implementation of Windows's exception handling. Now we can define a unique handler for all the exceptions. Differential Revision: https://reviews.llvm.org/D27238 llvm-svn: 289557
Diffstat (limited to 'llvm/lib/Fuzzer/FuzzerUtilWindows.cpp')
-rw-r--r--llvm/lib/Fuzzer/FuzzerUtilWindows.cpp169
1 files changed, 63 insertions, 106 deletions
diff --git a/llvm/lib/Fuzzer/FuzzerUtilWindows.cpp b/llvm/lib/Fuzzer/FuzzerUtilWindows.cpp
index c149699e588..f2dd6e6cca0 100644
--- a/llvm/lib/Fuzzer/FuzzerUtilWindows.cpp
+++ b/llvm/lib/Fuzzer/FuzzerUtilWindows.cpp
@@ -13,7 +13,6 @@
#if LIBFUZZER_WINDOWS
#include "FuzzerIO.h"
#include "FuzzerInternal.h"
-#include <Psapi.h>
#include <cassert>
#include <chrono>
#include <cstring>
@@ -24,75 +23,58 @@
#include <stdio.h>
#include <sys/types.h>
#include <windows.h>
+#include <Psapi.h>
namespace fuzzer {
-LONG WINAPI SEGVHandler(PEXCEPTION_POINTERS ExceptionInfo) {
- switch (ExceptionInfo->ExceptionRecord->ExceptionCode) {
- case EXCEPTION_ACCESS_VIOLATION:
- case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
- case EXCEPTION_STACK_OVERFLOW:
- Fuzzer::StaticCrashSignalCallback();
- break;
- }
- return EXCEPTION_CONTINUE_SEARCH;
-}
-
-LONG WINAPI BUSHandler(PEXCEPTION_POINTERS ExceptionInfo) {
- switch (ExceptionInfo->ExceptionRecord->ExceptionCode) {
- case EXCEPTION_DATATYPE_MISALIGNMENT:
- case EXCEPTION_IN_PAGE_ERROR:
- Fuzzer::StaticCrashSignalCallback();
- break;
- }
- return EXCEPTION_CONTINUE_SEARCH;
-}
+static const FuzzingOptions* HandlerOpt = nullptr;
-LONG WINAPI ILLHandler(PEXCEPTION_POINTERS ExceptionInfo) {
+LONG CALLBACK ExceptionHandler(PEXCEPTION_POINTERS ExceptionInfo) {
switch (ExceptionInfo->ExceptionRecord->ExceptionCode) {
- case EXCEPTION_ILLEGAL_INSTRUCTION:
- case EXCEPTION_PRIV_INSTRUCTION:
- Fuzzer::StaticCrashSignalCallback();
- break;
+ case EXCEPTION_ACCESS_VIOLATION:
+ case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
+ case EXCEPTION_STACK_OVERFLOW:
+ if (HandlerOpt->HandleSegv)
+ Fuzzer::StaticCrashSignalCallback();
+ break;
+ case EXCEPTION_DATATYPE_MISALIGNMENT:
+ case EXCEPTION_IN_PAGE_ERROR:
+ if (HandlerOpt->HandleBus)
+ Fuzzer::StaticCrashSignalCallback();
+ break;
+ case EXCEPTION_ILLEGAL_INSTRUCTION:
+ case EXCEPTION_PRIV_INSTRUCTION:
+ if (HandlerOpt->HandleIll)
+ Fuzzer::StaticCrashSignalCallback();
+ break;
+ case EXCEPTION_FLT_DENORMAL_OPERAND:
+ case EXCEPTION_FLT_DIVIDE_BY_ZERO:
+ case EXCEPTION_FLT_INEXACT_RESULT:
+ case EXCEPTION_FLT_INVALID_OPERATION:
+ case EXCEPTION_FLT_OVERFLOW:
+ case EXCEPTION_FLT_STACK_CHECK:
+ case EXCEPTION_FLT_UNDERFLOW:
+ case EXCEPTION_INT_DIVIDE_BY_ZERO:
+ case EXCEPTION_INT_OVERFLOW:
+ if (HandlerOpt->HandleFpe)
+ Fuzzer::StaticCrashSignalCallback();
+ break;
}
return EXCEPTION_CONTINUE_SEARCH;
}
-LONG WINAPI FPEHandler(PEXCEPTION_POINTERS ExceptionInfo) {
- switch (ExceptionInfo->ExceptionRecord->ExceptionCode) {
- case EXCEPTION_FLT_DENORMAL_OPERAND:
- case EXCEPTION_FLT_DIVIDE_BY_ZERO:
- case EXCEPTION_FLT_INEXACT_RESULT:
- case EXCEPTION_FLT_INVALID_OPERATION:
- case EXCEPTION_FLT_OVERFLOW:
- case EXCEPTION_FLT_STACK_CHECK:
- case EXCEPTION_FLT_UNDERFLOW:
- case EXCEPTION_INT_DIVIDE_BY_ZERO:
- case EXCEPTION_INT_OVERFLOW:
- Fuzzer::StaticCrashSignalCallback();
- break;
- }
- return EXCEPTION_CONTINUE_SEARCH;
-}
-
-BOOL WINAPI INTHandler(DWORD dwCtrlType) {
+BOOL WINAPI CtrlHandler(DWORD dwCtrlType) {
switch (dwCtrlType) {
- case CTRL_C_EVENT:
- Fuzzer::StaticInterruptCallback();
- return TRUE;
- default:
- return FALSE;
- }
-}
-
-BOOL WINAPI TERMHandler(DWORD dwCtrlType) {
- switch (dwCtrlType) {
- case CTRL_BREAK_EVENT:
- Fuzzer::StaticInterruptCallback();
- return TRUE;
- default:
- return FALSE;
+ case CTRL_C_EVENT:
+ if (HandlerOpt->HandleInt)
+ Fuzzer::StaticInterruptCallback();
+ return TRUE;
+ case CTRL_BREAK_EVENT:
+ if (HandlerOpt->HandleTerm)
+ Fuzzer::StaticInterruptCallback();
+ return TRUE;
}
+ return FALSE;
}
void CALLBACK AlarmHandler(PVOID, BOOLEAN) {
@@ -126,59 +108,34 @@ class TimerQ {
static TimerQ Timer;
-void SetTimer(int Seconds) {
- Timer.SetTimer(Seconds);
- return;
-}
-
-void SetSigSegvHandler() {
- if (!AddVectoredExceptionHandler(1, SEGVHandler)) {
- Printf("libFuzzer: AddVectoredExceptionHandler failed.\n");
- exit(1);
- }
-}
-
-void SetSigBusHandler() {
- if (!AddVectoredExceptionHandler(1, BUSHandler)) {
- Printf("libFuzzer: AddVectoredExceptionHandler failed.\n");
- exit(1);
- }
-}
-
static void CrashHandler(int) { Fuzzer::StaticCrashSignalCallback(); }
-void SetSigAbrtHandler() { signal(SIGABRT, CrashHandler); }
+void SetSignalHandler(const FuzzingOptions& Options) {
+ HandlerOpt = &Options;
-void SetSigIllHandler() {
- if (!AddVectoredExceptionHandler(1, ILLHandler)) {
- Printf("libFuzzer: AddVectoredExceptionHandler failed.\n");
- exit(1);
- }
-}
+ if (Options.UnitTimeoutSec > 0)
+ Timer.SetTimer(Options.UnitTimeoutSec / 2 + 1);
-void SetSigFpeHandler() {
- if (!AddVectoredExceptionHandler(1, FPEHandler)) {
- Printf("libFuzzer: AddVectoredExceptionHandler failed.\n");
- exit(1);
- }
-}
+ if (Options.HandleInt || Options.HandleTerm)
+ if (!SetConsoleCtrlHandler(CtrlHandler, TRUE)) {
+ DWORD LastError = GetLastError();
+ Printf("libFuzzer: SetConsoleCtrlHandler failed (Error code: %lu).\n",
+ LastError);
+ exit(1);
+ }
-void SetSigIntHandler() {
- if (!SetConsoleCtrlHandler(INTHandler, TRUE)) {
- DWORD LastError = GetLastError();
- Printf("libFuzzer: SetConsoleCtrlHandler failed (Error code: %lu).\n",
- LastError);
- exit(1);
- }
-}
+ if (Options.HandleSegv || Options.HandleBus || Options.HandleIll ||
+ Options.HandleFpe)
+ if (!AddVectoredExceptionHandler(1, ExceptionHandler)) {
+ Printf("libFuzzer: AddVectoredExceptionHandler failed.\n");
+ exit(1);
+ }
-void SetSigTermHandler() {
- if (!SetConsoleCtrlHandler(TERMHandler, TRUE)) {
- DWORD LastError = GetLastError();
- Printf("libFuzzer: SetConsoleCtrlHandler failed (Error code: %lu).\n",
- LastError);
- exit(1);
- }
+ if (Options.HandleAbrt)
+ if (SIG_ERR == signal(SIGABRT, CrashHandler)) {
+ Printf("libFuzzer: signal failed with %d\n", errno);
+ exit(1);
+ }
}
void SleepSeconds(int Seconds) { Sleep(Seconds * 1000); }
OpenPOWER on IntegriCloud