diff --git a/compiler-rt/lib/hwasan/hwasan_interceptors.cpp b/compiler-rt/lib/hwasan/hwasan_interceptors.cpp --- a/compiler-rt/lib/hwasan/hwasan_interceptors.cpp +++ b/compiler-rt/lib/hwasan/hwasan_interceptors.cpp @@ -15,6 +15,7 @@ //===----------------------------------------------------------------------===// #include "hwasan.h" +#include "hwasan_checks.h" #include "hwasan_thread.h" #include "interception/interception.h" #include "sanitizer_common/sanitizer_linux.h" @@ -40,6 +41,22 @@ return A.callback(A.param); } +# define COMMON_SYSCALL_PRE_READ_RANGE(p, s) __hwasan_loadN((uptr)p, (uptr)s) +# define COMMON_SYSCALL_PRE_WRITE_RANGE(p, s) \ + __hwasan_storeN((uptr)p, (uptr)s) +# define COMMON_SYSCALL_POST_READ_RANGE(p, s) \ + do { \ + (void)(p); \ + (void)(s); \ + } while (false) +# define COMMON_SYSCALL_POST_WRITE_RANGE(p, s) \ + do { \ + (void)(p); \ + (void)(s); \ + } while (false) +# include "sanitizer_common/sanitizer_common_syscalls.inc" +# include "sanitizer_common/sanitizer_syscalls_netbsd.inc" + INTERCEPTOR(int, pthread_create, void *th, void *attr, void *(*callback)(void*), void * param) { EnsureMainThreadIDIsCorrect(); diff --git a/compiler-rt/test/hwasan/TestCases/Linux/syscalls.cpp b/compiler-rt/test/hwasan/TestCases/Linux/syscalls.cpp new file mode 100644 --- /dev/null +++ b/compiler-rt/test/hwasan/TestCases/Linux/syscalls.cpp @@ -0,0 +1,33 @@ +// RUN: %clangxx_hwasan -O0 %s -o %t && not %env_hwasan_opts=symbolize=0 %run %t 2>&1 | FileCheck %s +// RUN: %clangxx_hwasan -O3 %s -o %t && not %env_hwasan_opts=symbolize=0 %run %t 2>&1 | FileCheck %s + +// UNSUPPORTED: android + +#include +#include +#include +#include +#include +#include + +#include +#include + +/* Test the presence of __sanitizer_syscall_ in the tool runtime, and general + sanity of their behaviour. */ + +int main(int argc, char *argv[]) { + // lit.cfg.py currently sets 'disable_allocator_tagging=1' + __hwasan_enable_allocator_tagging(); + + char *buf = (char *)malloc(1000); + assert(buf != NULL); + + __sanitizer_syscall_pre_recvmsg(0, buf - 1, 0); + // CHECK: HWAddressSanitizer: tag-mismatch on address [[PTR:0x[a-f0-9]+]] + // CHECK: Cause: heap-buffer-overflow + // CHECK: [[PTR]] is located 1 bytes before a 1000-byte region + + free(buf); + return 0; +}