Unverified Commit 4d9f3ca7 authored by Kirill Stoimenov's avatar Kirill Stoimenov Committed by GitHub
Browse files

[HWASAN] Add memset interceptor (#71244)

parent 9832eb4b
Loading
Loading
Loading
Loading
+11 −7
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#include "hwasan.h"
#include "hwasan_allocator.h"
#include "hwasan_checks.h"
#include "hwasan_mapping.h"
#include "hwasan_platform_interceptors.h"
#include "hwasan_thread.h"
#include "hwasan_thread_list.h"
@@ -146,13 +147,16 @@ struct HWAsanInterceptorContext {
        (void)(name);                           \
      } while (false)

#    define COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, block, c, size) \
      do {                                                      \
        (void)(ctx);                                            \
        (void)(block);                                          \
        (void)(c);                                              \
        (void)(size);                                           \
      } while (false)
#    define COMMON_INTERCEPTOR_MEMSET_IMPL(ctx, dst, v, size)   \
      {                                                         \
        if (COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED)          \
          return internal_memset(dst, v, size);                 \
        COMMON_INTERCEPTOR_ENTER(ctx, memset, dst, v, size);    \
        if (MemIsApp(UntagAddr(reinterpret_cast<uptr>(dst))) && \
            common_flags()->intercept_intrin)                   \
          COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dst, size);       \
        return REAL(memset)(dst, v, size);                      \
      }

#    define COMMON_INTERCEPTOR_STRERROR() \
      do {                                \
+2 −2
Original line number Diff line number Diff line
@@ -56,8 +56,8 @@
#undef SANITIZER_INTERCEPT_STRCASECMP
#define SANITIZER_INTERCEPT_STRCASECMP 0

#undef SANITIZER_INTERCEPT_MEMSET
#define SANITIZER_INTERCEPT_MEMSET 0
// #undef SANITIZER_INTERCEPT_MEMSET
// #define SANITIZER_INTERCEPT_MEMSET 0

// #undef SANITIZER_INTERCEPT_MEMMOVE
// #define SANITIZER_INTERCEPT_MEMMOVE 0
+32 −0
Original line number Diff line number Diff line
// RUN: %clangxx_hwasan -O0 %s -o %t && not %run %t 2>&1 | FileCheck %s
// RUN: %clangxx_hwasan -O1 %s -o %t && not %run %t 2>&1 | FileCheck %s
// RUN: %clangxx_hwasan -O2 %s -o %t && not %run %t 2>&1 | FileCheck %s
// RUN: %clangxx_hwasan -O3 %s -o %t && not %run %t 2>&1 | FileCheck %s

#include <sanitizer/hwasan_interface.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

__attribute__((no_sanitize("hwaddress"))) void
ForceCallInterceptor(void *p, int c, size_t size) {
  memset(p, c, size) == nullptr;
}

int main(int argc, char **argv) {
  __hwasan_enable_allocator_tagging();
  char a[] = {static_cast<char>(argc), 2, 3, 4};
  int size = sizeof(a);
  char *volatile p = (char *)malloc(size);
  free(p);
  ForceCallInterceptor(p, 0, size);
  return 0;
  // CHECK: HWAddressSanitizer: tag-mismatch on address
  // CHECK: WRITE of size 4
  // CHECK: #{{[[:digit:]]+}} 0x{{[[:xdigit:]]+}} in main {{.*}}memset.cpp:[[@LINE-4]]
  // CHECK: Cause: use-after-free
  // CHECK: freed by thread
  // CHECK: #{{[[:digit:]]+}} 0x{{[[:xdigit:]]+}} in main {{.*}}memset.cpp:[[@LINE-8]]
  // CHECK: previously allocated by thread
  // CHECK: #{{[[:digit:]]+}} 0x{{[[:xdigit:]]+}} in main {{.*}}memset.cpp:[[@LINE-11]]
}