[hwasan] Enable common syscall interceptors
authorThurston Dang <thurston@google.com>
Thu, 27 Apr 2023 22:05:46 +0000 (22:05 +0000)
committerThurston Dang <thurston@google.com>
Thu, 27 Apr 2023 23:13:29 +0000 (23:13 +0000)
This adds the sanitizer_common syscall hooks to HWASan and also defines
the COMMON_SYSCALL_PRE_{READ/WRITE}_RANGE macros.

Differential Revision: https://reviews.llvm.org/D149386

compiler-rt/lib/hwasan/hwasan_interceptors.cpp
compiler-rt/test/hwasan/TestCases/Linux/syscalls.cpp [new file with mode: 0644]

index 06f4eec..67edba4 100644 (file)
@@ -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 @@ static void *HwasanThreadStartFunc(void *arg) {
   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 (file)
index 0000000..d7bc34e
--- /dev/null
@@ -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 <assert.h>
+#include <errno.h>
+#include <glob.h>
+#include <malloc.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <sanitizer/hwasan_interface.h>
+#include <sanitizer/linux_syscall_hooks.h>
+
+/* 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;
+}