23 #include <sys/types.h>
29 static const FuzzingOptions* HandlerOpt =
nullptr;
31 LONG CALLBACK ExceptionHandler(PEXCEPTION_POINTERS ExceptionInfo) {
32 switch (ExceptionInfo->ExceptionRecord->ExceptionCode) {
33 case EXCEPTION_ACCESS_VIOLATION:
34 case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
35 case EXCEPTION_STACK_OVERFLOW:
36 if (HandlerOpt->HandleSegv)
39 case EXCEPTION_DATATYPE_MISALIGNMENT:
40 case EXCEPTION_IN_PAGE_ERROR:
41 if (HandlerOpt->HandleBus)
44 case EXCEPTION_ILLEGAL_INSTRUCTION:
45 case EXCEPTION_PRIV_INSTRUCTION:
46 if (HandlerOpt->HandleIll)
49 case EXCEPTION_FLT_DENORMAL_OPERAND:
50 case EXCEPTION_FLT_DIVIDE_BY_ZERO:
51 case EXCEPTION_FLT_INEXACT_RESULT:
52 case EXCEPTION_FLT_INVALID_OPERATION:
53 case EXCEPTION_FLT_OVERFLOW:
54 case EXCEPTION_FLT_STACK_CHECK:
55 case EXCEPTION_FLT_UNDERFLOW:
56 case EXCEPTION_INT_DIVIDE_BY_ZERO:
57 case EXCEPTION_INT_OVERFLOW:
58 if (HandlerOpt->HandleFpe)
63 return EXCEPTION_CONTINUE_SEARCH;
66 BOOL WINAPI CtrlHandler(
DWORD dwCtrlType) {
69 if (HandlerOpt->HandleInt)
72 case CTRL_BREAK_EVENT:
73 if (HandlerOpt->HandleTerm)
80 void CALLBACK AlarmHandler(PVOID, BOOLEAN) {
87 TimerQ() : TimerQueue(NULL) {};
90 DeleteTimerQueueEx(TimerQueue, NULL);
92 void SetTimer(
int Seconds) {
94 TimerQueue = CreateTimerQueue();
96 Printf(
"libFuzzer: CreateTimerQueue failed.\n");
101 if (!CreateTimerQueueTimer(&Timer, TimerQueue, AlarmHandler, NULL,
102 Seconds*1000, Seconds*1000, 0)) {
103 Printf(
"libFuzzer: CreateTimerQueueTimer failed.\n");
114 HandlerOpt = &Options;
116 if (Options.UnitTimeoutSec > 0)
117 Timer.SetTimer(Options.UnitTimeoutSec / 2 + 1);
119 if (Options.HandleInt || Options.HandleTerm)
120 if (!SetConsoleCtrlHandler(CtrlHandler, TRUE)) {
121 DWORD LastError = GetLastError();
122 Printf(
"libFuzzer: SetConsoleCtrlHandler failed (Error code: %lu).\n",
127 if (Options.HandleSegv || Options.HandleBus || Options.HandleIll ||
129 if (!AddVectoredExceptionHandler(1, ExceptionHandler)) {
130 Printf(
"libFuzzer: AddVectoredExceptionHandler failed.\n");
134 if (Options.HandleAbrt)
136 Printf(
"libFuzzer: signal failed with %d\n", errno);
141 void SleepSeconds(
int Seconds) { Sleep(Seconds * 1000); }
143 unsigned long GetPid() {
return GetCurrentProcessId(); }
146 PROCESS_MEMORY_COUNTERS
info;
147 if (!GetProcessMemoryInfo(GetCurrentProcess(), &info,
sizeof(info)))
149 return info.PeakWorkingSetSize >> 20;
153 return _popen(Command, Mode);
157 return system(Command.c_str());
160 const void *
SearchMemory(
const void *Data,
size_t DataLen,
const void *Patt,
163 const char *Cdata = (
const char *)Data;
164 const char *Cpatt = (
const char *)Patt;
166 if (!Data || !Patt || DataLen == 0 || PattLen == 0 || DataLen < PattLen)
170 return memchr(Data, *Cpatt, DataLen);
172 const char *
End = Cdata + DataLen - PattLen + 1;
174 for (
const char *It = Cdata; It <
End; ++It)
175 if (It[0] == Cpatt[0] && memcmp(It, Cpatt, PattLen) == 0)
183 #endif // LIBFUZZER_WINDOWS
void SleepSeconds(int Seconds)
void Printf(const char *Fmt,...)
FILE * OpenProcessPipe(const char *Command, const char *Mode)
static const unsigned End
void SetSignalHandler(const FuzzingOptions &Options)
const void * SearchMemory(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen)
static void CrashHandler(void *)
CrashHandler - This callback is run if a fatal signal is delivered to the process, it prints the pretty stack trace.
static void StaticAlarmCallback()
static void StaticInterruptCallback()
int ExecuteCommand(const std::string &Command)
static void StaticCrashSignalCallback()