diff options
| author | Suraj K Suresh <kssuraj15@gmail.com> | 2020-09-28 14:48:39 +0530 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2020-10-03 14:17:26 +0200 |
| commit | ca27b3bc5783ce1dbda7f23883d0ddf3729902a8 (patch) | |
| tree | 7a8b2516093aafd5c1ce9f89fc3aaf833cbdc163 | |
| parent | 2653fa43f8cced3279808d74e5f712bf45ef7551 (diff) | |
executor: msvc support syz-executor
| -rw-r--r-- | CONTRIBUTORS | 1 | ||||
| -rw-r--r-- | executor/common.h | 20 | ||||
| -rw-r--r-- | executor/common_fuchsia.h | 9 | ||||
| -rw-r--r-- | executor/common_windows.h | 20 | ||||
| -rw-r--r-- | executor/executor.cc | 16 | ||||
| -rw-r--r-- | executor/executor_windows.h | 18 | ||||
| -rw-r--r-- | pkg/csource/generated.go | 49 |
7 files changed, 101 insertions, 32 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS index c3aadcea0..e3a7857a6 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -76,3 +76,4 @@ Marijo Simunovic Jouni Högander VMware Radoslav Gerganov +Suraj K Suresh diff --git a/executor/common.h b/executor/common.h index 2e619065f..e054cf434 100644 --- a/executor/common.h +++ b/executor/common.h @@ -17,6 +17,13 @@ #if GOOS_freebsd || GOOS_test && HOSTGOOS_freebsd #include <sys/endian.h> // for htobe*. +#elif GOOS_windows +#define htobe16 _byteswap_ushort +#define htobe32 _byteswap_ulong +#define htobe64 _byteswap_uint64 +#define le16toh(x) x +#define htole16(x) x +typedef signed int ssize_t; #else #include <endian.h> // for htobe*. #endif @@ -30,7 +37,9 @@ #endif #if SYZ_EXECUTOR && !GOOS_linux +#if !GOOS_windows #include <unistd.h> +#endif NORETURN void doexit(int status) { _exit(status); @@ -124,13 +133,16 @@ static void install_segv_handler(void) } #define NONFAILING(...) \ - { \ + ({ \ + int ok = 1; \ __atomic_fetch_add(&skip_segv, 1, __ATOMIC_SEQ_CST); \ if (_setjmp(segv_env) == 0) { \ __VA_ARGS__; \ - } \ + } else \ + ok = 0; \ __atomic_fetch_sub(&skip_segv, 1, __ATOMIC_SEQ_CST); \ - } + ok; \ + }) #endif #endif @@ -440,12 +452,14 @@ static long syz_execute_func(volatile long text) // from the reach of the random code, otherwise it's known to reach // the output region somehow. The asm block is arch-independent except // for the number of available registers. +#if defined(__GNUC__) volatile long p[8] = {0}; (void)p; #if GOARCH_amd64 asm volatile("" ::"r"(0l), "r"(1l), "r"(2l), "r"(3l), "r"(4l), "r"(5l), "r"(6l), "r"(7l), "r"(8l), "r"(9l), "r"(10l), "r"(11l), "r"(12l), "r"(13l)); #endif +#endif ((void (*)(void))(text))(); return 0; } diff --git a/executor/common_fuchsia.h b/executor/common_fuchsia.h index 2d76891da..6576e83f0 100644 --- a/executor/common_fuchsia.h +++ b/executor/common_fuchsia.h @@ -126,13 +126,16 @@ static void install_segv_handler(void) } #define NONFAILING(...) \ - { \ + ({ \ + int ok = 1; \ __atomic_fetch_add(&skip_segv, 1, __ATOMIC_SEQ_CST); \ if (sigsetjmp(segv_env, 0) == 0) { \ __VA_ARGS__; \ - } \ + } else \ + ok = 0; \ __atomic_fetch_sub(&skip_segv, 1, __ATOMIC_SEQ_CST); \ - } + ok; \ + }) #endif #if SYZ_EXECUTOR || SYZ_THREADED diff --git a/executor/common_windows.h b/executor/common_windows.h index e9722a360..a29d437b8 100644 --- a/executor/common_windows.h +++ b/executor/common_windows.h @@ -3,20 +3,17 @@ // This file is shared between executor and csource package. +#include <direct.h> // for _chdir +#include <io.h> // for mktemp #include <windows.h> -#include "common.h" - #if SYZ_EXECUTOR || SYZ_HANDLE_SEGV static void install_segv_handler() { } -#define NONFAILING(...) \ - __try { \ - __VA_ARGS__; \ - } __except (EXCEPTION_EXECUTE_HANDLER) { \ - } +#define NONFAILING(...) \ + ([&]() { __try { __VA_ARGS__; } __except (EXCEPTION_EXECUTE_HANDLER) { return false; } return true; }()) #endif #if SYZ_EXECUTOR || SYZ_THREADED || SYZ_REPEAT && SYZ_EXECUTOR_USES_FORK_SERVER @@ -111,3 +108,12 @@ static int do_sandbox_none(void) return 0; } #endif + +static void use_temporary_dir(void) +{ + char tmpdir_template[] = "./syzkaller.XXXXXX"; + char* tmpdir = mktemp(tmpdir_template); + + CreateDirectory(tmpdir, NULL); + _chdir(tmpdir); +} diff --git a/executor/executor.cc b/executor/executor.cc index 9473b871f..174d4bb15 100644 --- a/executor/executor.cc +++ b/executor/executor.cc @@ -14,7 +14,10 @@ #include <stdlib.h> #include <string.h> #include <time.h> + +#if !GOOS_windows #include <unistd.h> +#endif #include "defs.h" @@ -23,12 +26,15 @@ #define NORETURN __attribute__((noreturn)) #define ALIGNED(N) __attribute__((aligned(N))) #define PRINTF(fmt, args) __attribute__((format(printf, fmt, args))) +#define INPUT_DATA_ALIGNMENT 64 << 10 #else // Assuming windows/cl. #define SYSCALLAPI WINAPI #define NORETURN __declspec(noreturn) -#define ALIGNED(N) __declspec(align(N)) +#define INPUT_DATA_ALIGNMENT 4 << 10 +#define ALIGNED(N) __declspec(align(N)) // here we are not aligning the value because of msvc reporting the value as an illegal value #define PRINTF(fmt, args) +#define __thread __declspec(thread) #endif #ifndef GIT_REVISION @@ -172,7 +178,7 @@ static bool collide; uint32 completed; bool is_kernel_64_bit = true; -ALIGNED(64 << 10) +ALIGNED(INPUT_DATA_ALIGNMENT) static char input_data[kMaxInput]; // Checksum kinds. @@ -1233,8 +1239,7 @@ void copyin(char* addr, uint64 val, uint64 size, uint64 bf, uint64 bf_off, uint6 bool copyout(char* addr, uint64 size, uint64* res) { - bool ok = false; - NONFAILING( + return NONFAILING( switch (size) { case 1: *res = *(uint8*)addr; @@ -1250,8 +1255,7 @@ bool copyout(char* addr, uint64 size, uint64* res) break; default: fail("copyout: bad argument size %llu", size); - } __atomic_store_n(&ok, true, __ATOMIC_RELEASE);); - return ok; + }); } uint64 read_arg(uint64** input_posp) diff --git a/executor/executor_windows.h b/executor/executor_windows.h index 1e210826b..bb863c009 100644 --- a/executor/executor_windows.h +++ b/executor/executor_windows.h @@ -6,6 +6,9 @@ #include "nocover.h" +#define read read_win +#define write write_win + static void os_init(int argc, char** argv, void* data, size_t data_size) { if (VirtualAlloc(data, data_size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE) != data) @@ -20,3 +23,18 @@ static intptr_t execute_syscall(const call_t* c, intptr_t a[kMaxArgs]) return -1; } } + +static __inline int read_win(int pipe_id, void* input_data, int data_size) +{ + DWORD dwBytesRead = 0; + ReadFile((HANDLE)_get_osfhandle(pipe_id), input_data, data_size, &dwBytesRead, NULL); + + return (int)dwBytesRead; +} + +static __inline int write_win(int pipe_id, void* input_data, int data_size) +{ + DWORD dwBytesWritten = 0; + WriteFile((HANDLE)_get_osfhandle(pipe_id), input_data, data_size, &dwBytesWritten, NULL); + return (int)dwBytesWritten; +} diff --git a/pkg/csource/generated.go b/pkg/csource/generated.go index 83c3616a6..2d3263b65 100644 --- a/pkg/csource/generated.go +++ b/pkg/csource/generated.go @@ -11,6 +11,13 @@ var commonHeader = ` #if GOOS_freebsd || GOOS_test && HOSTGOOS_freebsd #include <sys/endian.h> +#elif GOOS_windows +#define htobe16 _byteswap_ushort +#define htobe32 _byteswap_ulong +#define htobe64 _byteswap_uint64 +#define le16toh(x) x +#define htole16(x) x +typedef signed int ssize_t; #else #include <endian.h> #endif @@ -24,7 +31,9 @@ var commonHeader = ` #endif #if SYZ_EXECUTOR && !GOOS_linux +#if !GOOS_windows #include <unistd.h> +#endif NORETURN void doexit(int status) { _exit(status); @@ -104,13 +113,16 @@ static void install_segv_handler(void) } #define NONFAILING(...) \ - { \ + ({ \ + int ok = 1; \ __atomic_fetch_add(&skip_segv, 1, __ATOMIC_SEQ_CST); \ if (_setjmp(segv_env) == 0) { \ __VA_ARGS__; \ - } \ + } else \ + ok = 0; \ __atomic_fetch_sub(&skip_segv, 1, __ATOMIC_SEQ_CST); \ - } + ok; \ + }) #endif #endif @@ -2090,13 +2102,16 @@ static void install_segv_handler(void) } #define NONFAILING(...) \ - { \ + ({ \ + int ok = 1; \ __atomic_fetch_add(&skip_segv, 1, __ATOMIC_SEQ_CST); \ if (sigsetjmp(segv_env, 0) == 0) { \ __VA_ARGS__; \ - } \ + } else \ + ok = 0; \ __atomic_fetch_sub(&skip_segv, 1, __ATOMIC_SEQ_CST); \ - } + ok; \ + }) #endif #if SYZ_EXECUTOR || SYZ_THREADED @@ -9704,20 +9719,17 @@ static int do_sandbox_none(void) #elif GOOS_windows +#include <direct.h> +#include <io.h> #include <windows.h> -#include "common.h" - #if SYZ_EXECUTOR || SYZ_HANDLE_SEGV static void install_segv_handler() { } -#define NONFAILING(...) \ - __try { \ - __VA_ARGS__; \ - } __except (EXCEPTION_EXECUTE_HANDLER) { \ - } +#define NONFAILING(...) \ + ([&]() { __try { __VA_ARGS__; } __except (EXCEPTION_EXECUTE_HANDLER) { return false; } return true; }()) #endif #if SYZ_EXECUTOR || SYZ_THREADED || SYZ_REPEAT && SYZ_EXECUTOR_USES_FORK_SERVER @@ -9813,6 +9825,15 @@ static int do_sandbox_none(void) } #endif +static void use_temporary_dir(void) +{ + char tmpdir_template[] = "./syzkaller.XXXXXX"; + char* tmpdir = mktemp(tmpdir_template); + + CreateDirectory(tmpdir, NULL); + _chdir(tmpdir); +} + #else #error "unknown OS" #endif @@ -9820,12 +9841,14 @@ static int do_sandbox_none(void) #if SYZ_EXECUTOR || __NR_syz_execute_func static long syz_execute_func(volatile long text) { +#if defined(__GNUC__) volatile long p[8] = {0}; (void)p; #if GOARCH_amd64 asm volatile("" ::"r"(0l), "r"(1l), "r"(2l), "r"(3l), "r"(4l), "r"(5l), "r"(6l), "r"(7l), "r"(8l), "r"(9l), "r"(10l), "r"(11l), "r"(12l), "r"(13l)); #endif +#endif ((void (*)(void))(text))(); return 0; } |
