@@ -104,7 +104,7 @@ FakeFrame *FakeStack::Allocate(uptr stack_size_log, uptr class_id,
104
104
return 0 ; // We are out of fake stack.
105
105
}
106
106
107
- uptr FakeStack::AddrIsInFakeStack (uptr ptr) {
107
+ uptr FakeStack::AddrIsInFakeStack (uptr ptr, uptr *frame_beg, uptr *frame_end ) {
108
108
uptr stack_size_log = this ->stack_size_log ();
109
109
uptr beg = reinterpret_cast <uptr>(GetFrame (stack_size_log, 0 , 0 ));
110
110
uptr end = reinterpret_cast <uptr>(this ) + RequiredSize (stack_size_log);
@@ -114,7 +114,10 @@ uptr FakeStack::AddrIsInFakeStack(uptr ptr) {
114
114
CHECK_LE (base, ptr);
115
115
CHECK_LT (ptr, base + (1UL << stack_size_log));
116
116
uptr pos = (ptr - base) >> (kMinStackFrameSizeLog + class_id);
117
- return base + pos * BytesInSizeClass (class_id);
117
+ uptr res = base + pos * BytesInSizeClass (class_id);
118
+ *frame_end = res + BytesInSizeClass (class_id);
119
+ *frame_beg = res + sizeof (FakeFrame);
120
+ return res;
118
121
}
119
122
120
123
void FakeStack::HandleNoReturn () {
@@ -208,14 +211,15 @@ ALWAYS_INLINE void OnFree(uptr ptr, uptr class_id, uptr size, uptr real_stack) {
208
211
} // namespace __asan
209
212
210
213
// ---------------------- Interface ---------------- {{{1
214
+ using namespace __asan ;
211
215
#define DEFINE_STACK_MALLOC_FREE_WITH_CLASS_ID (class_id ) \
212
216
extern " C" SANITIZER_INTERFACE_ATTRIBUTE uptr \
213
217
__asan_stack_malloc_##class_id(uptr size, uptr real_stack) { \
214
- return __asan:: OnMalloc (class_id, size, real_stack); \
218
+ return OnMalloc (class_id, size, real_stack); \
215
219
} \
216
220
extern " C" SANITIZER_INTERFACE_ATTRIBUTE void __asan_stack_free_##class_id( \
217
221
uptr ptr, uptr size, uptr real_stack) { \
218
- __asan:: OnFree (ptr, class_id, size, real_stack); \
222
+ OnFree (ptr, class_id, size, real_stack); \
219
223
}
220
224
221
225
DEFINE_STACK_MALLOC_FREE_WITH_CLASS_ID (0 )
@@ -229,3 +233,23 @@ DEFINE_STACK_MALLOC_FREE_WITH_CLASS_ID(7)
229
233
DEFINE_STACK_MALLOC_FREE_WITH_CLASS_ID(8 )
230
234
DEFINE_STACK_MALLOC_FREE_WITH_CLASS_ID(9 )
231
235
DEFINE_STACK_MALLOC_FREE_WITH_CLASS_ID(10 )
236
+ extern "C" {
237
+ SANITIZER_INTERFACE_ATTRIBUTE
238
+ void *__asan_get_current_fake_stack () { return GetFakeStackFast (); }
239
+
240
+ SANITIZER_INTERFACE_ATTRIBUTE
241
+ void *__asan_addr_is_in_fake_stack (void *fake_stack, void *addr, void **beg,
242
+ void **end) {
243
+ FakeStack *fs = reinterpret_cast <FakeStack*>(fake_stack);
244
+ if (!fs) return 0 ;
245
+ uptr frame_beg, frame_end;
246
+ FakeFrame *frame = reinterpret_cast <FakeFrame *>(fs->AddrIsInFakeStack (
247
+ reinterpret_cast <uptr>(addr), &frame_beg, &frame_end));
248
+ if (!frame) return 0 ;
249
+ if (frame->magic != kCurrentStackFrameMagic )
250
+ return 0 ;
251
+ if (beg) *beg = reinterpret_cast <void *>(frame_beg);
252
+ if (end) *end = reinterpret_cast <void *>(frame_end);
253
+ return reinterpret_cast <void *>(frame->real_stack );
254
+ }
255
+ } // extern "C"
0 commit comments