From 881b677c189e65872fd315a75a0e56f077339189 Mon Sep 17 00:00:00 2001 From: Evgeniy Stepanov Date: Fri, 12 Apr 2013 14:57:03 +0000 Subject: [sanitizer] Add syscall handlers to ASan and TSan runtimes. ASan checks addressability of syscall arguments. TSan does nothing for now. git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@179380 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/asan/asan_interceptors.cc | 6 ++++++ lib/asan/lit_tests/Linux/syscalls.cc | 22 ++++++++++++++++++++++ lib/tsan/rtl/tsan_interceptors.cc | 7 +++++++ 3 files changed, 35 insertions(+) create mode 100644 lib/asan/lit_tests/Linux/syscalls.cc diff --git a/lib/asan/asan_interceptors.cc b/lib/asan/asan_interceptors.cc index 656477f79..8a954bd67 100644 --- a/lib/asan/asan_interceptors.cc +++ b/lib/asan/asan_interceptors.cc @@ -115,6 +115,12 @@ using namespace __asan; // NOLINT #define COMMON_INTERCEPTOR_SET_THREAD_NAME(ctx, name) SetThreadName(name) #include "sanitizer_common/sanitizer_common_interceptors.inc" +#define COMMON_SYSCALL_PRE_READ_RANGE(p, s) ASAN_READ_RANGE(p, s) +#define COMMON_SYSCALL_PRE_WRITE_RANGE(p, s) ASAN_WRITE_RANGE(p, s) +#define COMMON_SYSCALL_POST_READ_RANGE(p, s) +#define COMMON_SYSCALL_POST_WRITE_RANGE(p, s) +#include "sanitizer_common/sanitizer_common_syscalls.inc" + static thread_return_t THREAD_CALLING_CONV asan_thread_start(void *arg) { AsanThread *t = (AsanThread*)arg; SetCurrentThread(t); diff --git a/lib/asan/lit_tests/Linux/syscalls.cc b/lib/asan/lit_tests/Linux/syscalls.cc new file mode 100644 index 000000000..b2edcfb92 --- /dev/null +++ b/lib/asan/lit_tests/Linux/syscalls.cc @@ -0,0 +1,22 @@ +// RUN: %clangxx_asan -m64 -O0 %s -o %t && %t 2>&1 | %symbolize | FileCheck %s +// RUN: %clangxx_asan -m64 -O3 %s -o %t && %t 2>&1 | %symbolize | FileCheck %s + +#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[]) { + char buf[1000]; + __sanitizer_syscall_pre_recvmsg(0, buf - 1, 0); + // CHECK: AddressSanitizer: stack-buffer-{{.*}}erflow + // CHECK: READ of size {{.*}} at {{.*}} thread T0 + // CHECK: #0 {{.*}} in __sanitizer_syscall_pre_recvmsg + return 0; +} diff --git a/lib/tsan/rtl/tsan_interceptors.cc b/lib/tsan/rtl/tsan_interceptors.cc index c2438f66c..dc7d31dcb 100644 --- a/lib/tsan/rtl/tsan_interceptors.cc +++ b/lib/tsan/rtl/tsan_interceptors.cc @@ -1856,6 +1856,13 @@ struct TsanInterceptorContext { ThreadSetName(((TsanInterceptorContext*)ctx)->thr, name) #include "sanitizer_common/sanitizer_common_interceptors.inc" +// FIXME: Implement these with MemoryAccessRange(). +#define COMMON_SYSCALL_PRE_READ_RANGE(p, s) +#define COMMON_SYSCALL_PRE_WRITE_RANGE(p, s) +#define COMMON_SYSCALL_POST_READ_RANGE(p, s) +#define COMMON_SYSCALL_POST_WRITE_RANGE(p, s) +#include "sanitizer_common/sanitizer_common_syscalls.inc" + namespace __tsan { void ProcessPendingSignals(ThreadState *thr) { -- cgit v1.2.1