• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===-- asan_intercepted_functions.h ----------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file is a part of AddressSanitizer, an address sanity checker.
11 //
12 // ASan-private header containing prototypes for wrapper functions and wrappers
13 //===----------------------------------------------------------------------===//
14 #ifndef ASAN_INTERCEPTED_FUNCTIONS_H
15 #define ASAN_INTERCEPTED_FUNCTIONS_H
16 
17 #include "asan_internal.h"
18 #include "interception/interception.h"
19 
20 using __sanitizer::uptr;
21 
22 // Use macro to describe if specific function should be
23 // intercepted on a given platform.
24 #if !defined(_WIN32)
25 # define ASAN_INTERCEPT_ATOLL_AND_STRTOLL 1
26 # define ASAN_INTERCEPT__LONGJMP 1
27 # define ASAN_INTERCEPT_STRDUP 1
28 # define ASAN_INTERCEPT_STRCASECMP_AND_STRNCASECMP 1
29 # define ASAN_INTERCEPT_INDEX 1
30 # define ASAN_INTERCEPT_PTHREAD_CREATE 1
31 # define ASAN_INTERCEPT_MLOCKX 1
32 #else
33 # define ASAN_INTERCEPT_ATOLL_AND_STRTOLL 0
34 # define ASAN_INTERCEPT__LONGJMP 0
35 # define ASAN_INTERCEPT_STRDUP 0
36 # define ASAN_INTERCEPT_STRCASECMP_AND_STRNCASECMP 0
37 # define ASAN_INTERCEPT_INDEX 0
38 # define ASAN_INTERCEPT_PTHREAD_CREATE 0
39 # define ASAN_INTERCEPT_MLOCKX 0
40 #endif
41 
42 #if defined(__linux__)
43 # define ASAN_USE_ALIAS_ATTRIBUTE_FOR_INDEX 1
44 #else
45 # define ASAN_USE_ALIAS_ATTRIBUTE_FOR_INDEX 0
46 #endif
47 
48 #if !defined(__APPLE__)
49 # define ASAN_INTERCEPT_STRNLEN 1
50 #else
51 # define ASAN_INTERCEPT_STRNLEN 0
52 #endif
53 
54 #if !defined(ANDROID) && !defined(_WIN32)
55 # define ASAN_INTERCEPT_SIGNAL_AND_SIGACTION 1
56 #else
57 # define ASAN_INTERCEPT_SIGNAL_AND_SIGACTION 0
58 #endif
59 
60 // On Darwin siglongjmp tailcalls longjmp, so we don't want to intercept it
61 // there.
62 #if !defined(_WIN32) && (!defined(__APPLE__) || MAC_INTERPOSE_FUNCTIONS)
63 # define ASAN_INTERCEPT_SIGLONGJMP 1
64 #else
65 # define ASAN_INTERCEPT_SIGLONGJMP 0
66 #endif
67 
68 #if ASAN_HAS_EXCEPTIONS && !defined(_WIN32)
69 # define ASAN_INTERCEPT___CXA_THROW 1
70 #else
71 # define ASAN_INTERCEPT___CXA_THROW 0
72 #endif
73 
74 #define DECLARE_FUNCTION_AND_WRAPPER(ret_type, func, ...) \
75   ret_type func(__VA_ARGS__); \
76   ret_type WRAP(func)(__VA_ARGS__)
77 
78 // Use extern declarations of intercepted functions on Mac and Windows
79 // to avoid including system headers.
80 #if defined(__APPLE__) || (defined(_WIN32) && !defined(_DLL))
81 extern "C" {
82 // signal.h
83 # if ASAN_INTERCEPT_SIGNAL_AND_SIGACTION
84 struct sigaction;
85 DECLARE_FUNCTION_AND_WRAPPER(int, sigaction, int sig,
86               const struct sigaction *act,
87               struct sigaction *oldact);
88 DECLARE_FUNCTION_AND_WRAPPER(void*, signal, int signum, void *handler);
89 # endif
90 
91 // setjmp.h
92 DECLARE_FUNCTION_AND_WRAPPER(void, longjmp, void *env, int value);
93 # if ASAN_INTERCEPT__LONGJMP
94 DECLARE_FUNCTION_AND_WRAPPER(void, _longjmp, void *env, int value);
95 # endif
96 # if ASAN_INTERCEPT_SIGLONGJMP
97 DECLARE_FUNCTION_AND_WRAPPER(void, siglongjmp, void *env, int value);
98 # endif
99 # if ASAN_INTERCEPT___CXA_THROW
100 DECLARE_FUNCTION_AND_WRAPPER(void, __cxa_throw, void *a, void *b, void *c);
101 #endif
102 
103 // string.h / strings.h
104 DECLARE_FUNCTION_AND_WRAPPER(int, memcmp,
105                              const void *a1, const void *a2, uptr size);
106 DECLARE_FUNCTION_AND_WRAPPER(void*, memmove,
107                              void *to, const void *from, uptr size);
108 DECLARE_FUNCTION_AND_WRAPPER(void*, memcpy,
109                              void *to, const void *from, uptr size);
110 DECLARE_FUNCTION_AND_WRAPPER(void*, memset, void *block, int c, uptr size);
111 DECLARE_FUNCTION_AND_WRAPPER(char*, strchr, const char *str, int c);
112 DECLARE_FUNCTION_AND_WRAPPER(char*, strcat,  /* NOLINT */
113                              char *to, const char* from);
114 DECLARE_FUNCTION_AND_WRAPPER(char*, strncat,
115                              char *to, const char* from, uptr size);
116 DECLARE_FUNCTION_AND_WRAPPER(char*, strcpy,  /* NOLINT */
117                              char *to, const char* from);
118 DECLARE_FUNCTION_AND_WRAPPER(char*, strncpy,
119                              char *to, const char* from, uptr size);
120 DECLARE_FUNCTION_AND_WRAPPER(int, strcmp, const char *s1, const char* s2);
121 DECLARE_FUNCTION_AND_WRAPPER(int, strncmp,
122                              const char *s1, const char* s2, uptr size);
123 DECLARE_FUNCTION_AND_WRAPPER(uptr, strlen, const char *s);
124 # if ASAN_INTERCEPT_STRCASECMP_AND_STRNCASECMP
125 DECLARE_FUNCTION_AND_WRAPPER(int, strcasecmp, const char *s1, const char *s2);
126 DECLARE_FUNCTION_AND_WRAPPER(int, strncasecmp,
127                              const char *s1, const char *s2, uptr n);
128 # endif
129 # if ASAN_INTERCEPT_STRDUP
130 DECLARE_FUNCTION_AND_WRAPPER(char*, strdup, const char *s);
131 # endif
132 # if ASAN_INTERCEPT_STRNLEN
133 DECLARE_FUNCTION_AND_WRAPPER(uptr, strnlen, const char *s, uptr maxlen);
134 # endif
135 #if ASAN_INTERCEPT_INDEX
136 DECLARE_FUNCTION_AND_WRAPPER(char*, index, const char *string, int c);
137 #endif
138 
139 // stdlib.h
140 DECLARE_FUNCTION_AND_WRAPPER(int, atoi, const char *nptr);
141 DECLARE_FUNCTION_AND_WRAPPER(long, atol, const char *nptr);  // NOLINT
142 DECLARE_FUNCTION_AND_WRAPPER(long, strtol, const char *nptr, char **endptr, int base);  // NOLINT
143 # if ASAN_INTERCEPT_ATOLL_AND_STRTOLL
144 DECLARE_FUNCTION_AND_WRAPPER(long long, atoll, const char *nptr);  // NOLINT
145 DECLARE_FUNCTION_AND_WRAPPER(long long, strtoll, const char *nptr, char **endptr, int base);  // NOLINT
146 # endif
147 
148 # if ASAN_INTERCEPT_MLOCKX
149 // mlock/munlock
150 DECLARE_FUNCTION_AND_WRAPPER(int, mlock, const void *addr, size_t len);
151 DECLARE_FUNCTION_AND_WRAPPER(int, munlock, const void *addr, size_t len);
152 DECLARE_FUNCTION_AND_WRAPPER(int, mlockall, int flags);
153 DECLARE_FUNCTION_AND_WRAPPER(int, munlockall, void);
154 # endif
155 
156 // Windows threads.
157 # if defined(_WIN32)
158 __declspec(dllimport)
159 void* __stdcall CreateThread(void *sec, uptr st, void* start,
160                              void *arg, DWORD fl, DWORD *id);
161 # endif
162 // Posix threads.
163 # if ASAN_INTERCEPT_PTHREAD_CREATE
164 DECLARE_FUNCTION_AND_WRAPPER(int, pthread_create,
165                              void *thread, void *attr,
166                              void *(*start_routine)(void*), void *arg);
167 # endif
168 
169 #if defined(__APPLE__)
170 typedef void* pthread_workqueue_t;
171 typedef void* pthread_workitem_handle_t;
172 
173 typedef void* dispatch_group_t;
174 typedef void* dispatch_queue_t;
175 typedef void* dispatch_source_t;
176 typedef u64 dispatch_time_t;
177 typedef void (*dispatch_function_t)(void *block);
178 typedef void* (*worker_t)(void *block);
179 typedef void* CFStringRef;
180 typedef void* CFAllocatorRef;
181 
182 DECLARE_FUNCTION_AND_WRAPPER(void, dispatch_async_f,
183                              dispatch_queue_t dq,
184                              void *ctxt, dispatch_function_t func);
185 DECLARE_FUNCTION_AND_WRAPPER(void, dispatch_sync_f,
186                              dispatch_queue_t dq,
187                              void *ctxt, dispatch_function_t func);
188 DECLARE_FUNCTION_AND_WRAPPER(void, dispatch_after_f,
189                              dispatch_time_t when, dispatch_queue_t dq,
190                              void *ctxt, dispatch_function_t func);
191 DECLARE_FUNCTION_AND_WRAPPER(void, dispatch_barrier_async_f,
192                              dispatch_queue_t dq,
193                              void *ctxt, dispatch_function_t func);
194 DECLARE_FUNCTION_AND_WRAPPER(void, dispatch_group_async_f,
195                              dispatch_group_t group, dispatch_queue_t dq,
196                              void *ctxt, dispatch_function_t func);
197 
198 DECLARE_FUNCTION_AND_WRAPPER(void, __CFInitialize, void);
199 DECLARE_FUNCTION_AND_WRAPPER(CFStringRef, CFStringCreateCopy,
200                              CFAllocatorRef alloc, CFStringRef str);
201 DECLARE_FUNCTION_AND_WRAPPER(void, free, void* ptr);
202 #if MAC_INTERPOSE_FUNCTIONS
203 DECLARE_FUNCTION_AND_WRAPPER(void, dispatch_group_async,
204                              dispatch_group_t dg,
205                              dispatch_queue_t dq, void (^work)(void));
206 DECLARE_FUNCTION_AND_WRAPPER(void, dispatch_async,
207                              dispatch_queue_t dq, void (^work)(void));
208 DECLARE_FUNCTION_AND_WRAPPER(void, dispatch_after,
209                              dispatch_queue_t dq, void (^work)(void));
210 DECLARE_FUNCTION_AND_WRAPPER(void, dispatch_source_set_event_handler,
211                              dispatch_source_t ds, void (^work)(void));
212 DECLARE_FUNCTION_AND_WRAPPER(void, dispatch_source_set_cancel_handler,
213                              dispatch_source_t ds, void (^work)(void));
214 #endif  // MAC_INTERPOSE_FUNCTIONS
215 #endif  // __APPLE__
216 }  // extern "C"
217 #endif
218 
219 #endif  // ASAN_INTERCEPTED_FUNCTIONS_H
220