aboutsummaryrefslogtreecommitdiff
path: root/libsanitizer/asan/dynamic/asan_interceptors_dynamic.cc
blob: 727edf2b43b94e4dc9ab72ce9a5ac9da079056a9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
//===-- asan_interceptors_dynamic.cc --------------------------------------===//
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file is a part of AddressSanitizer, an address sanity checker.
//
// __DATA,__interpose section of the dynamic runtime library for Mac OS.
//===----------------------------------------------------------------------===//

#if defined(__APPLE__)

#include "../asan_interceptors.h"
#include "../asan_intercepted_functions.h"

namespace __asan {

#define INTERPOSE_FUNCTION(function) \
    { reinterpret_cast<const uptr>(WRAP(function)), \
      reinterpret_cast<const uptr>(function) }

#define INTERPOSE_FUNCTION_2(function, wrapper) \
    { reinterpret_cast<const uptr>(wrapper), \
      reinterpret_cast<const uptr>(function) }

struct interpose_substitution {
  const uptr replacement;
  const uptr original;
};

__attribute__((used))
const interpose_substitution substitutions[]
    __attribute__((section("__DATA, __interpose"))) = {
  INTERPOSE_FUNCTION(strlen),
  INTERPOSE_FUNCTION(memcmp),
  INTERPOSE_FUNCTION(memcpy),
  INTERPOSE_FUNCTION(memmove),
  INTERPOSE_FUNCTION(memset),
  INTERPOSE_FUNCTION(strchr),
  INTERPOSE_FUNCTION(strcat),
  INTERPOSE_FUNCTION(strncat),
  INTERPOSE_FUNCTION(strcpy),
  INTERPOSE_FUNCTION(strncpy),
  INTERPOSE_FUNCTION(pthread_create),
  INTERPOSE_FUNCTION(longjmp),
#if ASAN_INTERCEPT__LONGJMP
  INTERPOSE_FUNCTION(_longjmp),
#endif
#if ASAN_INTERCEPT_SIGLONGJMP
  INTERPOSE_FUNCTION(siglongjmp),
#endif
#if ASAN_INTERCEPT_STRDUP
  INTERPOSE_FUNCTION(strdup),
#endif
#if ASAN_INTERCEPT_STRNLEN
  INTERPOSE_FUNCTION(strnlen),
#endif
#if ASAN_INTERCEPT_INDEX
  INTERPOSE_FUNCTION_2(index, WRAP(strchr)),
#endif
  INTERPOSE_FUNCTION(strcmp),
  INTERPOSE_FUNCTION(strncmp),
#if ASAN_INTERCEPT_STRCASECMP_AND_STRNCASECMP
  INTERPOSE_FUNCTION(strcasecmp),
  INTERPOSE_FUNCTION(strncasecmp),
#endif
  INTERPOSE_FUNCTION(atoi),
  INTERPOSE_FUNCTION(atol),
  INTERPOSE_FUNCTION(strtol),
#if ASAN_INTERCEPT_ATOLL_AND_STRTOLL
  INTERPOSE_FUNCTION(atoll),
  INTERPOSE_FUNCTION(strtoll),
#endif
#if ASAN_INTERCEPT_MLOCKX
  INTERPOSE_FUNCTION(mlock),
  INTERPOSE_FUNCTION(munlock),
  INTERPOSE_FUNCTION(mlockall),
  INTERPOSE_FUNCTION(munlockall),
#endif
  INTERPOSE_FUNCTION(dispatch_async_f),
  INTERPOSE_FUNCTION(dispatch_sync_f),
  INTERPOSE_FUNCTION(dispatch_after_f),
  INTERPOSE_FUNCTION(dispatch_barrier_async_f),
  INTERPOSE_FUNCTION(dispatch_group_async_f),
#ifndef MISSING_BLOCKS_SUPPORT
  INTERPOSE_FUNCTION(dispatch_group_async),
  INTERPOSE_FUNCTION(dispatch_async),
  INTERPOSE_FUNCTION(dispatch_after),
  INTERPOSE_FUNCTION(dispatch_source_set_event_handler),
  INTERPOSE_FUNCTION(dispatch_source_set_cancel_handler),
#endif
  INTERPOSE_FUNCTION(signal),
  INTERPOSE_FUNCTION(sigaction),

  INTERPOSE_FUNCTION(malloc_create_zone),
  INTERPOSE_FUNCTION(malloc_default_zone),
  INTERPOSE_FUNCTION(malloc_default_purgeable_zone),
  INTERPOSE_FUNCTION(malloc_make_purgeable),
  INTERPOSE_FUNCTION(malloc_make_nonpurgeable),
  INTERPOSE_FUNCTION(malloc_set_zone_name),
  INTERPOSE_FUNCTION(malloc),
  INTERPOSE_FUNCTION(free),
  INTERPOSE_FUNCTION(realloc),
  INTERPOSE_FUNCTION(calloc),
  INTERPOSE_FUNCTION(valloc),
  INTERPOSE_FUNCTION(malloc_good_size),
  INTERPOSE_FUNCTION(posix_memalign),
};

}  // namespace __asan

#endif  // __APPLE__