aboutsummaryrefslogtreecommitdiff
path: root/lib/asan/dynamic/asan_interceptors_dynamic.cc
blob: 4f0f7bd2d5f89be400c23790b90d98ed3933d806 (plain) (blame)
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
//===-- asan_interceptors_dynamic.cc --------------------------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// 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 {

#if !MAC_INTERPOSE_FUNCTIONS
# error \
  Dynamic interposing library should be built with -DMAC_INTERPOSE_FUNCTIONS
#endif

#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(__CFInitialize),
  INTERPOSE_FUNCTION(CFStringCreateCopy),
  INTERPOSE_FUNCTION(free),
};

}  // namespace __asan

#endif  // __APPLE__