xref: /netbsd-src/external/gpl3/gcc/dist/libsanitizer/hwasan/hwasan_allocation_functions.cpp (revision b1e838363e3c6fc78a55519254d99869742dd33c)
1*b1e83836Smrg //===-- hwasan_allocation_functions.cpp -----------------------------------===//
2*b1e83836Smrg //
3*b1e83836Smrg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*b1e83836Smrg // See https://llvm.org/LICENSE.txt for license information.
5*b1e83836Smrg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*b1e83836Smrg //
7*b1e83836Smrg //===----------------------------------------------------------------------===//
8*b1e83836Smrg //
9*b1e83836Smrg // This file is a part of HWAddressSanitizer.
10*b1e83836Smrg //
11*b1e83836Smrg // Definitions for __sanitizer allocation functions.
12*b1e83836Smrg //
13*b1e83836Smrg //===----------------------------------------------------------------------===//
14*b1e83836Smrg 
15*b1e83836Smrg #include "hwasan.h"
16*b1e83836Smrg #include "interception/interception.h"
17*b1e83836Smrg #include "sanitizer_common/sanitizer_allocator_dlsym.h"
18*b1e83836Smrg #include "sanitizer_common/sanitizer_allocator_interface.h"
19*b1e83836Smrg #include "sanitizer_common/sanitizer_tls_get_addr.h"
20*b1e83836Smrg 
21*b1e83836Smrg #if !SANITIZER_FUCHSIA
22*b1e83836Smrg 
23*b1e83836Smrg using namespace __hwasan;
24*b1e83836Smrg 
25*b1e83836Smrg struct DlsymAlloc : public DlSymAllocator<DlsymAlloc> {
UseImplDlsymAlloc26*b1e83836Smrg   static bool UseImpl() { return !hwasan_inited; }
27*b1e83836Smrg };
28*b1e83836Smrg 
29*b1e83836Smrg extern "C" {
30*b1e83836Smrg 
31*b1e83836Smrg SANITIZER_INTERFACE_ATTRIBUTE
__sanitizer_posix_memalign(void ** memptr,uptr alignment,uptr size)32*b1e83836Smrg int __sanitizer_posix_memalign(void **memptr, uptr alignment, uptr size) {
33*b1e83836Smrg   GET_MALLOC_STACK_TRACE;
34*b1e83836Smrg   CHECK_NE(memptr, 0);
35*b1e83836Smrg   int res = hwasan_posix_memalign(memptr, alignment, size, &stack);
36*b1e83836Smrg   return res;
37*b1e83836Smrg }
38*b1e83836Smrg 
39*b1e83836Smrg SANITIZER_INTERFACE_ATTRIBUTE
__sanitizer_memalign(uptr alignment,uptr size)40*b1e83836Smrg void *__sanitizer_memalign(uptr alignment, uptr size) {
41*b1e83836Smrg   GET_MALLOC_STACK_TRACE;
42*b1e83836Smrg   return hwasan_memalign(alignment, size, &stack);
43*b1e83836Smrg }
44*b1e83836Smrg 
45*b1e83836Smrg SANITIZER_INTERFACE_ATTRIBUTE
__sanitizer_aligned_alloc(uptr alignment,uptr size)46*b1e83836Smrg void *__sanitizer_aligned_alloc(uptr alignment, uptr size) {
47*b1e83836Smrg   GET_MALLOC_STACK_TRACE;
48*b1e83836Smrg   return hwasan_aligned_alloc(alignment, size, &stack);
49*b1e83836Smrg }
50*b1e83836Smrg 
51*b1e83836Smrg SANITIZER_INTERFACE_ATTRIBUTE
__sanitizer___libc_memalign(uptr alignment,uptr size)52*b1e83836Smrg void *__sanitizer___libc_memalign(uptr alignment, uptr size) {
53*b1e83836Smrg   GET_MALLOC_STACK_TRACE;
54*b1e83836Smrg   void *ptr = hwasan_memalign(alignment, size, &stack);
55*b1e83836Smrg   if (ptr)
56*b1e83836Smrg     DTLS_on_libc_memalign(ptr, size);
57*b1e83836Smrg   return ptr;
58*b1e83836Smrg }
59*b1e83836Smrg 
60*b1e83836Smrg SANITIZER_INTERFACE_ATTRIBUTE
__sanitizer_valloc(uptr size)61*b1e83836Smrg void *__sanitizer_valloc(uptr size) {
62*b1e83836Smrg   GET_MALLOC_STACK_TRACE;
63*b1e83836Smrg   return hwasan_valloc(size, &stack);
64*b1e83836Smrg }
65*b1e83836Smrg 
66*b1e83836Smrg SANITIZER_INTERFACE_ATTRIBUTE
__sanitizer_pvalloc(uptr size)67*b1e83836Smrg void *__sanitizer_pvalloc(uptr size) {
68*b1e83836Smrg   GET_MALLOC_STACK_TRACE;
69*b1e83836Smrg   return hwasan_pvalloc(size, &stack);
70*b1e83836Smrg }
71*b1e83836Smrg 
72*b1e83836Smrg SANITIZER_INTERFACE_ATTRIBUTE
__sanitizer_free(void * ptr)73*b1e83836Smrg void __sanitizer_free(void *ptr) {
74*b1e83836Smrg   if (!ptr)
75*b1e83836Smrg     return;
76*b1e83836Smrg   if (DlsymAlloc::PointerIsMine(ptr))
77*b1e83836Smrg     return DlsymAlloc::Free(ptr);
78*b1e83836Smrg   GET_MALLOC_STACK_TRACE;
79*b1e83836Smrg   hwasan_free(ptr, &stack);
80*b1e83836Smrg }
81*b1e83836Smrg 
82*b1e83836Smrg SANITIZER_INTERFACE_ATTRIBUTE
__sanitizer_cfree(void * ptr)83*b1e83836Smrg void __sanitizer_cfree(void *ptr) {
84*b1e83836Smrg   if (!ptr)
85*b1e83836Smrg     return;
86*b1e83836Smrg   if (DlsymAlloc::PointerIsMine(ptr))
87*b1e83836Smrg     return DlsymAlloc::Free(ptr);
88*b1e83836Smrg   GET_MALLOC_STACK_TRACE;
89*b1e83836Smrg   hwasan_free(ptr, &stack);
90*b1e83836Smrg }
91*b1e83836Smrg 
92*b1e83836Smrg SANITIZER_INTERFACE_ATTRIBUTE
__sanitizer_malloc_usable_size(const void * ptr)93*b1e83836Smrg uptr __sanitizer_malloc_usable_size(const void *ptr) {
94*b1e83836Smrg   return __sanitizer_get_allocated_size(ptr);
95*b1e83836Smrg }
96*b1e83836Smrg 
97*b1e83836Smrg SANITIZER_INTERFACE_ATTRIBUTE
__sanitizer_mallinfo()98*b1e83836Smrg struct __sanitizer_struct_mallinfo __sanitizer_mallinfo() {
99*b1e83836Smrg   __sanitizer_struct_mallinfo sret;
100*b1e83836Smrg   internal_memset(&sret, 0, sizeof(sret));
101*b1e83836Smrg   return sret;
102*b1e83836Smrg }
103*b1e83836Smrg 
104*b1e83836Smrg SANITIZER_INTERFACE_ATTRIBUTE
__sanitizer_mallopt(int cmd,int value)105*b1e83836Smrg int __sanitizer_mallopt(int cmd, int value) { return 0; }
106*b1e83836Smrg 
107*b1e83836Smrg SANITIZER_INTERFACE_ATTRIBUTE
__sanitizer_malloc_stats(void)108*b1e83836Smrg void __sanitizer_malloc_stats(void) {
109*b1e83836Smrg   // FIXME: implement, but don't call REAL(malloc_stats)!
110*b1e83836Smrg }
111*b1e83836Smrg 
112*b1e83836Smrg SANITIZER_INTERFACE_ATTRIBUTE
__sanitizer_calloc(uptr nmemb,uptr size)113*b1e83836Smrg void *__sanitizer_calloc(uptr nmemb, uptr size) {
114*b1e83836Smrg   if (DlsymAlloc::Use())
115*b1e83836Smrg     return DlsymAlloc::Callocate(nmemb, size);
116*b1e83836Smrg   GET_MALLOC_STACK_TRACE;
117*b1e83836Smrg   return hwasan_calloc(nmemb, size, &stack);
118*b1e83836Smrg }
119*b1e83836Smrg 
120*b1e83836Smrg SANITIZER_INTERFACE_ATTRIBUTE
__sanitizer_realloc(void * ptr,uptr size)121*b1e83836Smrg void *__sanitizer_realloc(void *ptr, uptr size) {
122*b1e83836Smrg   if (DlsymAlloc::Use() || DlsymAlloc::PointerIsMine(ptr))
123*b1e83836Smrg     return DlsymAlloc::Realloc(ptr, size);
124*b1e83836Smrg   GET_MALLOC_STACK_TRACE;
125*b1e83836Smrg   return hwasan_realloc(ptr, size, &stack);
126*b1e83836Smrg }
127*b1e83836Smrg 
128*b1e83836Smrg SANITIZER_INTERFACE_ATTRIBUTE
__sanitizer_reallocarray(void * ptr,uptr nmemb,uptr size)129*b1e83836Smrg void *__sanitizer_reallocarray(void *ptr, uptr nmemb, uptr size) {
130*b1e83836Smrg   GET_MALLOC_STACK_TRACE;
131*b1e83836Smrg   return hwasan_reallocarray(ptr, nmemb, size, &stack);
132*b1e83836Smrg }
133*b1e83836Smrg 
134*b1e83836Smrg SANITIZER_INTERFACE_ATTRIBUTE
__sanitizer_malloc(uptr size)135*b1e83836Smrg void *__sanitizer_malloc(uptr size) {
136*b1e83836Smrg   if (UNLIKELY(!hwasan_init_is_running))
137*b1e83836Smrg     ENSURE_HWASAN_INITED();
138*b1e83836Smrg   if (DlsymAlloc::Use())
139*b1e83836Smrg     return DlsymAlloc::Allocate(size);
140*b1e83836Smrg   GET_MALLOC_STACK_TRACE;
141*b1e83836Smrg   return hwasan_malloc(size, &stack);
142*b1e83836Smrg }
143*b1e83836Smrg 
144*b1e83836Smrg }  // extern "C"
145*b1e83836Smrg 
146*b1e83836Smrg #if HWASAN_WITH_INTERCEPTORS
147*b1e83836Smrg #  define INTERCEPTOR_ALIAS(RET, FN, ARGS...)                                 \
148*b1e83836Smrg     extern "C" SANITIZER_INTERFACE_ATTRIBUTE RET WRAP(FN)(ARGS)               \
149*b1e83836Smrg         ALIAS("__sanitizer_" #FN);                                            \
150*b1e83836Smrg     extern "C" SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE RET FN( \
151*b1e83836Smrg         ARGS) ALIAS("__sanitizer_" #FN)
152*b1e83836Smrg 
153*b1e83836Smrg INTERCEPTOR_ALIAS(int, posix_memalign, void **memptr, SIZE_T alignment,
154*b1e83836Smrg                   SIZE_T size);
155*b1e83836Smrg INTERCEPTOR_ALIAS(void *, aligned_alloc, SIZE_T alignment, SIZE_T size);
156*b1e83836Smrg INTERCEPTOR_ALIAS(void *, __libc_memalign, SIZE_T alignment, SIZE_T size);
157*b1e83836Smrg INTERCEPTOR_ALIAS(void *, valloc, SIZE_T size);
158*b1e83836Smrg INTERCEPTOR_ALIAS(void, free, void *ptr);
159*b1e83836Smrg INTERCEPTOR_ALIAS(uptr, malloc_usable_size, const void *ptr);
160*b1e83836Smrg INTERCEPTOR_ALIAS(void *, calloc, SIZE_T nmemb, SIZE_T size);
161*b1e83836Smrg INTERCEPTOR_ALIAS(void *, realloc, void *ptr, SIZE_T size);
162*b1e83836Smrg INTERCEPTOR_ALIAS(void *, reallocarray, void *ptr, SIZE_T nmemb, SIZE_T size);
163*b1e83836Smrg INTERCEPTOR_ALIAS(void *, malloc, SIZE_T size);
164*b1e83836Smrg 
165*b1e83836Smrg #  if !SANITIZER_FREEBSD && !SANITIZER_NETBSD
166*b1e83836Smrg INTERCEPTOR_ALIAS(void *, memalign, SIZE_T alignment, SIZE_T size);
167*b1e83836Smrg INTERCEPTOR_ALIAS(void *, pvalloc, SIZE_T size);
168*b1e83836Smrg INTERCEPTOR_ALIAS(void, cfree, void *ptr);
169*b1e83836Smrg INTERCEPTOR_ALIAS(__sanitizer_struct_mallinfo, mallinfo);
170*b1e83836Smrg INTERCEPTOR_ALIAS(int, mallopt, int cmd, int value);
171*b1e83836Smrg INTERCEPTOR_ALIAS(void, malloc_stats, void);
172*b1e83836Smrg #  endif
173*b1e83836Smrg #endif  // #if HWASAN_WITH_INTERCEPTORS
174*b1e83836Smrg 
175*b1e83836Smrg #endif  // SANITIZER_FUCHSIA
176