22
22
#if HWASAN_REPLACE_OPERATORS_NEW_AND_DELETE
23
23
24
24
// TODO(alekseys): throw std::bad_alloc instead of dying on OOM.
25
- # define OPERATOR_NEW_BODY ( nothrow ) \
25
+ # define OPERATOR_NEW_BODY \
26
26
GET_MALLOC_STACK_TRACE; \
27
27
void *res = hwasan_malloc(size, &stack); \
28
- if (!nothrow && UNLIKELY(!res)) \
28
+ if (UNLIKELY(!res)) \
29
29
ReportOutOfMemory (size, &stack); \
30
30
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 \
32
53
GET_MALLOC_STACK_TRACE; \
33
54
void *res = hwasan_memalign(static_cast <uptr>(align), size, &stack); \
34
- if (!nothrow && UNLIKELY(!res)) \
55
+ if (UNLIKELY(!res)) \
35
56
ReportOutOfMemory (size, &stack); \
36
57
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)
37
61
38
62
# define OPERATOR_DELETE_BODY \
39
63
GET_MALLOC_STACK_TRACE; \
40
64
if (ptr) \
41
65
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)
42
94
43
95
#elif defined(__ANDROID__)
44
96
45
97
// We don't actually want to intercept operator new and delete on Android, but
46
98
// since we previously released a runtime that intercepted these functions,
47
99
// removing the interceptors would break ABI. Therefore we simply forward to
48
100
// 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)
50
105
# 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)
51
109
52
110
#endif
53
111
@@ -61,19 +119,19 @@ struct nothrow_t {};
61
119
} // namespace std
62
120
63
121
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new (size_t size) {
64
- OPERATOR_NEW_BODY ( false /* nothrow */ ) ;
122
+ OPERATOR_NEW_BODY;
65
123
}
66
124
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new [](
67
125
size_t size) {
68
- OPERATOR_NEW_BODY ( false /* nothrow */ ) ;
126
+ OPERATOR_NEW_BODY_ARRAY ;
69
127
}
70
128
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new (
71
129
size_t size, std::nothrow_t const &) {
72
- OPERATOR_NEW_BODY ( true /* nothrow */ ) ;
130
+ OPERATOR_NEW_BODY_NOTHROW ;
73
131
}
74
132
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new [](
75
133
size_t size, std::nothrow_t const &) {
76
- OPERATOR_NEW_BODY ( true /* nothrow */ ) ;
134
+ OPERATOR_NEW_BODY_ARRAY_NOTHROW ;
77
135
}
78
136
79
137
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete (
@@ -82,81 +140,81 @@ INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete(
82
140
}
83
141
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[] (
84
142
void *ptr) NOEXCEPT {
85
- OPERATOR_DELETE_BODY ;
143
+ OPERATOR_DELETE_BODY_ARRAY ;
86
144
}
87
145
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete (
88
146
void *ptr, std::nothrow_t const &) {
89
147
OPERATOR_DELETE_BODY;
90
148
}
91
149
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[] (
92
150
void *ptr, std::nothrow_t const &) {
93
- OPERATOR_DELETE_BODY ;
151
+ OPERATOR_DELETE_BODY_ARRAY ;
94
152
}
95
153
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete (
96
154
void *ptr, size_t ) NOEXCEPT {
97
- OPERATOR_DELETE_BODY ;
155
+ OPERATOR_DELETE_BODY_SIZE ;
98
156
}
99
157
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[] (
100
158
void *ptr, size_t ) NOEXCEPT {
101
- OPERATOR_DELETE_BODY ;
159
+ OPERATOR_DELETE_BODY_SIZE_ARRAY ;
102
160
}
103
161
104
162
#endif // OPERATOR_NEW_BODY
105
163
106
- #ifdef OPERATOR_NEW_ALIGN_BODY
164
+ #ifdef OPERATOR_NEW_BODY_ALIGN
107
165
108
166
namespace std {
109
167
enum class align_val_t : size_t {};
110
168
} // namespace std
111
169
112
170
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new (
113
171
size_t size, std::align_val_t align) {
114
- OPERATOR_NEW_ALIGN_BODY ( false /* nothrow */ ) ;
172
+ OPERATOR_NEW_BODY_ALIGN ;
115
173
}
116
174
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new [](
117
175
size_t size, std::align_val_t align) {
118
- OPERATOR_NEW_ALIGN_BODY ( false /* nothrow */ ) ;
176
+ OPERATOR_NEW_BODY_ALIGN_ARRAY ;
119
177
}
120
178
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new (
121
179
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 ;
123
181
}
124
182
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void *operator new [](
125
183
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 ;
127
185
}
128
186
129
187
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete (
130
188
void *ptr, std::align_val_t align) NOEXCEPT {
131
- OPERATOR_DELETE_BODY ;
189
+ OPERATOR_DELETE_BODY_ALIGN ;
132
190
}
133
191
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[] (
134
192
void *ptr, std::align_val_t ) NOEXCEPT {
135
- OPERATOR_DELETE_BODY ;
193
+ OPERATOR_DELETE_BODY_ALIGN_ARRAY ;
136
194
}
137
195
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete (
138
196
void *ptr, std::align_val_t , std::nothrow_t const &) NOEXCEPT {
139
- OPERATOR_DELETE_BODY ;
197
+ OPERATOR_DELETE_BODY_ALIGN ;
140
198
}
141
199
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[] (
142
200
void *ptr, std::align_val_t , std::nothrow_t const &) NOEXCEPT {
143
- OPERATOR_DELETE_BODY ;
201
+ OPERATOR_DELETE_BODY_ALIGN_ARRAY ;
144
202
}
145
203
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete (
146
204
void *ptr, size_t , std::align_val_t ) NOEXCEPT {
147
- OPERATOR_DELETE_BODY ;
205
+ OPERATOR_DELETE_BODY_SIZE_ALIGN ;
148
206
}
149
207
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[] (
150
208
void *ptr, size_t , std::align_val_t ) NOEXCEPT {
151
- OPERATOR_DELETE_BODY ;
209
+ OPERATOR_DELETE_BODY_SIZE_ALIGN_ARRAY ;
152
210
}
153
211
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete (
154
212
void *ptr, size_t , std::align_val_t , std::nothrow_t const &) NOEXCEPT {
155
- OPERATOR_DELETE_BODY ;
213
+ OPERATOR_DELETE_BODY_SIZE_ALIGN ;
156
214
}
157
215
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void operator delete[] (
158
216
void *ptr, size_t , std::align_val_t , std::nothrow_t const &) NOEXCEPT {
159
- OPERATOR_DELETE_BODY ;
217
+ OPERATOR_DELETE_BODY_SIZE_ALIGN_ARRAY ;
160
218
}
161
219
162
- #endif // OPERATOR_NEW_ALIGN_BODY
220
+ #endif // OPERATOR_NEW_BODY_ALIGN
0 commit comments