2222#if HWASAN_REPLACE_OPERATORS_NEW_AND_DELETE
2323
2424// TODO(alekseys): throw std::bad_alloc instead of dying on OOM.
25- # define OPERATOR_NEW_BODY ( nothrow ) \
25+ # define OPERATOR_NEW_BODY \
2626 GET_MALLOC_STACK_TRACE; \
2727 void *res = hwasan_malloc(size, &stack); \
28- if (!nothrow && UNLIKELY(!res)) \
28+ if (UNLIKELY(!res)) \
2929 ReportOutOfMemory (size, &stack); \
3030 return res
31- # define OPERATOR_NEW_ALIGN_BODY (nothrow ) \
31+ # define OPERATOR_NEW_BODY_NOTHROW \
32+ GET_MALLOC_STACK_TRACE; \
33+ return hwasan_malloc(size, &stack)
34+ # define OPERATOR_NEW_BODY_ARRAY \
35+ GET_MALLOC_STACK_TRACE; \
36+ void *res = hwasan_malloc(size, &stack); \
37+ if (UNLIKELY(!res)) \
38+ ReportOutOfMemory (size, &stack); \
39+ return res
40+ # define OPERATOR_NEW_BODY_ARRAY_NOTHROW \
41+ GET_MALLOC_STACK_TRACE; \
42+ return hwasan_malloc(size, &stack)
43+ # define OPERATOR_NEW_BODY_ALIGN \
44+ GET_MALLOC_STACK_TRACE; \
45+ void *res = hwasan_memalign(static_cast <uptr>(align), size, &stack); \
46+ if (UNLIKELY(!res)) \
47+ ReportOutOfMemory (size, &stack); \
48+ return res
49+ # define OPERATOR_NEW_BODY_ALIGN_NOTHROW \
50+ GET_MALLOC_STACK_TRACE; \
51+ return hwasan_memalign(static_cast <uptr>(align), size, &stack)
52+ # define OPERATOR_NEW_BODY_ALIGN_ARRAY \
3253 GET_MALLOC_STACK_TRACE; \
3354 void *res = hwasan_memalign(static_cast <uptr>(align), size, &stack); \
34- if (!nothrow && UNLIKELY(!res)) \
55+ if (UNLIKELY(!res)) \
3556 ReportOutOfMemory (size, &stack); \
3657 return res
58+ # define OPERATOR_NEW_BODY_ALIGN_ARRAY_NOTHROW \
59+ GET_MALLOC_STACK_TRACE; \
60+ return hwasan_memalign(static_cast <uptr>(align), size, &stack)
3761
3862# define OPERATOR_DELETE_BODY \
3963 GET_MALLOC_STACK_TRACE; \
4064 if (ptr) \
4165 hwasan_free (ptr, &stack)
66+ # define OPERATOR_DELETE_BODY_ARRAY \
67+ GET_MALLOC_STACK_TRACE; \
68+ if (ptr) \
69+ hwasan_free (ptr, &stack)
70+ # define OPERATOR_DELETE_BODY_ALIGN \
71+ GET_MALLOC_STACK_TRACE; \
72+ if (ptr) \
73+ hwasan_free (ptr, &stack)
74+ # define OPERATOR_DELETE_BODY_ALIGN_ARRAY \
75+ GET_MALLOC_STACK_TRACE; \
76+ if (ptr) \
77+ hwasan_free (ptr, &stack)
78+ # define OPERATOR_DELETE_BODY_SIZE \
79+ GET_MALLOC_STACK_TRACE; \
80+ if (ptr) \
81+ hwasan_free (ptr, &stack)
82+ # define OPERATOR_DELETE_BODY_SIZE_ARRAY \
83+ GET_MALLOC_STACK_TRACE; \
84+ if (ptr) \
85+ hwasan_free (ptr, &stack)
86+ # define OPERATOR_DELETE_BODY_SIZE_ALIGN \
87+ GET_MALLOC_STACK_TRACE; \
88+ if (ptr) \
89+ hwasan_free (ptr, &stack)
90+ # define OPERATOR_DELETE_BODY_SIZE_ALIGN_ARRAY \
91+ GET_MALLOC_STACK_TRACE; \
92+ if (ptr) \
93+ hwasan_free (ptr, &stack)
4294
4395#elif defined(__ANDROID__)
4496
4597// We don't actually want to intercept operator new and delete on Android, but
4698// since we previously released a runtime that intercepted these functions,
4799// removing the interceptors would break ABI. Therefore we simply forward to
48100// malloc and free.
49- # define OPERATOR_NEW_BODY (nothrow ) return malloc(size)
101+ # define OPERATOR_NEW_BODY return malloc(size)
102+ # define OPERATOR_NEW_BODY_NOTHROW return malloc(size)
103+ # define OPERATOR_NEW_BODY_ARRAY return malloc(size)
104+ # define OPERATOR_NEW_BODY_ARRAY_NOTHROW return malloc(size)
50105# define OPERATOR_DELETE_BODY free (ptr)
106+ # define OPERATOR_DELETE_BODY_ARRAY free (ptr)
107+ # define OPERATOR_DELETE_BODY_SIZE free (ptr)
108+ # define OPERATOR_DELETE_BODY_SIZE_ARRAY free (ptr)
51109
52110#endif
53111
@@ -61,19 +119,19 @@ struct nothrow_t {};
61119} // namespace std
62120
63121INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new (size_t size) {
64- OPERATOR_NEW_BODY ( false /* nothrow */ ) ;
122+ OPERATOR_NEW_BODY;
65123}
66124INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new [](
67125 size_t size) {
68- OPERATOR_NEW_BODY ( false /* nothrow */ ) ;
126+ OPERATOR_NEW_BODY_ARRAY ;
69127}
70128INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new (
71129 size_t size, std::nothrow_t const &) {
72- OPERATOR_NEW_BODY ( true /* nothrow */ ) ;
130+ OPERATOR_NEW_BODY_NOTHROW ;
73131}
74132INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new [](
75133 size_t size, std::nothrow_t const &) {
76- OPERATOR_NEW_BODY ( true /* nothrow */ ) ;
134+ OPERATOR_NEW_BODY_ARRAY_NOTHROW ;
77135}
78136
79137INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete (
@@ -82,81 +140,81 @@ INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete(
82140}
83141INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[] (
84142 void *ptr) NOEXCEPT {
85- OPERATOR_DELETE_BODY ;
143+ OPERATOR_DELETE_BODY_ARRAY ;
86144}
87145INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete (
88146 void *ptr, std::nothrow_t const &) {
89147 OPERATOR_DELETE_BODY;
90148}
91149INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[] (
92150 void *ptr, std::nothrow_t const &) {
93- OPERATOR_DELETE_BODY ;
151+ OPERATOR_DELETE_BODY_ARRAY ;
94152}
95153INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete (
96154 void *ptr, size_t ) NOEXCEPT {
97- OPERATOR_DELETE_BODY ;
155+ OPERATOR_DELETE_BODY_SIZE ;
98156}
99157INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[] (
100158 void *ptr, size_t ) NOEXCEPT {
101- OPERATOR_DELETE_BODY ;
159+ OPERATOR_DELETE_BODY_SIZE_ARRAY ;
102160}
103161
104162#endif // OPERATOR_NEW_BODY
105163
106- #ifdef OPERATOR_NEW_ALIGN_BODY
164+ #ifdef OPERATOR_NEW_BODY_ALIGN
107165
108166namespace std {
109167enum class align_val_t : size_t {};
110168} // namespace std
111169
112170INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new (
113171 size_t size, std::align_val_t align) {
114- OPERATOR_NEW_ALIGN_BODY ( false /* nothrow */ ) ;
172+ OPERATOR_NEW_BODY_ALIGN ;
115173}
116174INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new [](
117175 size_t size, std::align_val_t align) {
118- OPERATOR_NEW_ALIGN_BODY ( false /* nothrow */ ) ;
176+ OPERATOR_NEW_BODY_ALIGN_ARRAY ;
119177}
120178INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new (
121179 size_t size, std::align_val_t align, std::nothrow_t const &) {
122- OPERATOR_NEW_ALIGN_BODY ( true /* nothrow */ ) ;
180+ OPERATOR_NEW_BODY_ALIGN_NOTHROW ;
123181}
124182INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new [](
125183 size_t size, std::align_val_t align, std::nothrow_t const &) {
126- OPERATOR_NEW_ALIGN_BODY ( true /* nothrow */ ) ;
184+ OPERATOR_NEW_BODY_ALIGN_ARRAY_NOTHROW ;
127185}
128186
129187INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete (
130188 void *ptr, std::align_val_t align) NOEXCEPT {
131- OPERATOR_DELETE_BODY ;
189+ OPERATOR_DELETE_BODY_ALIGN ;
132190}
133191INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[] (
134192 void *ptr, std::align_val_t ) NOEXCEPT {
135- OPERATOR_DELETE_BODY ;
193+ OPERATOR_DELETE_BODY_ALIGN_ARRAY ;
136194}
137195INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete (
138196 void *ptr, std::align_val_t , std::nothrow_t const &) NOEXCEPT {
139- OPERATOR_DELETE_BODY ;
197+ OPERATOR_DELETE_BODY_ALIGN ;
140198}
141199INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[] (
142200 void *ptr, std::align_val_t , std::nothrow_t const &) NOEXCEPT {
143- OPERATOR_DELETE_BODY ;
201+ OPERATOR_DELETE_BODY_ALIGN_ARRAY ;
144202}
145203INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete (
146204 void *ptr, size_t , std::align_val_t ) NOEXCEPT {
147- OPERATOR_DELETE_BODY ;
205+ OPERATOR_DELETE_BODY_SIZE_ALIGN ;
148206}
149207INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[] (
150208 void *ptr, size_t , std::align_val_t ) NOEXCEPT {
151- OPERATOR_DELETE_BODY ;
209+ OPERATOR_DELETE_BODY_SIZE_ALIGN_ARRAY ;
152210}
153211INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete (
154212 void *ptr, size_t , std::align_val_t , std::nothrow_t const &) NOEXCEPT {
155- OPERATOR_DELETE_BODY ;
213+ OPERATOR_DELETE_BODY_SIZE_ALIGN ;
156214}
157215INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[] (
158216 void *ptr, size_t , std::align_val_t , std::nothrow_t const &) NOEXCEPT {
159- OPERATOR_DELETE_BODY ;
217+ OPERATOR_DELETE_BODY_SIZE_ALIGN_ARRAY ;
160218}
161219
162- #endif // OPERATOR_NEW_ALIGN_BODY
220+ #endif // OPERATOR_NEW_BODY_ALIGN
0 commit comments