// Copyright 2017 syzkaller project authors. All rights reserved. // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. // This file is shared between executor and csource package. #include #include "common.h" #if SYZ_EXECUTOR || SYZ_HANDLE_SEGV static void install_segv_handler() { } #define NONFAILING(...) \ __try { \ __VA_ARGS__; \ } __except (EXCEPTION_EXECUTE_HANDLER) { \ } #endif #if SYZ_EXECUTOR || SYZ_THREADED || SYZ_REPEAT && SYZ_EXECUTOR_USES_FORK_SERVER static uint64 current_time_ms() { return GetTickCount64(); } #endif #if SYZ_EXECUTOR || SYZ_THREADED || SYZ_REPEAT && SYZ_EXECUTOR_USES_FORK_SERVER static void sleep_ms(uint64 ms) { Sleep(ms); } #endif #if SYZ_EXECUTOR || SYZ_THREADED static void thread_start(void* (*fn)(void*), void* arg) { HANDLE th = CreateThread(NULL, 128 << 10, (LPTHREAD_START_ROUTINE)fn, arg, 0, NULL); if (th == NULL) exitf("CreateThread failed"); } struct event_t { CRITICAL_SECTION cs; CONDITION_VARIABLE cv; int state; }; static void event_init(event_t* ev) { InitializeCriticalSection(&ev->cs); InitializeConditionVariable(&ev->cv); ev->state = 0; } static void event_reset(event_t* ev) { ev->state = 0; } static void event_set(event_t* ev) { EnterCriticalSection(&ev->cs); if (ev->state) fail("event already set"); ev->state = 1; LeaveCriticalSection(&ev->cs); WakeAllConditionVariable(&ev->cv); } static void event_wait(event_t* ev) { EnterCriticalSection(&ev->cs); while (!ev->state) SleepConditionVariableCS(&ev->cv, &ev->cs, INFINITE); LeaveCriticalSection(&ev->cs); } static int event_isset(event_t* ev) { EnterCriticalSection(&ev->cs); int res = ev->state; LeaveCriticalSection(&ev->cs); return res; } static int event_timedwait(event_t* ev, uint64 timeout_ms) { EnterCriticalSection(&ev->cs); uint64 start = current_time_ms(); for (;;) { if (ev->state) break; uint64 now = current_time_ms(); if (now - start > timeout_ms) break; SleepConditionVariableCS(&ev->cv, &ev->cs, timeout_ms - (now - start)); } int res = ev->state; LeaveCriticalSection(&ev->cs); return res; } #endif #if SYZ_EXECUTOR || SYZ_SANDBOX_NONE static void loop(); static int do_sandbox_none(void) { loop(); doexit(0); } #endif #if SYZ_EXECUTOR #define do_sandbox_setuid() 0 #define do_sandbox_namespace() 0 #endif