forked from OSchip/llvm-project
[ASan] Revert r168040 and r168043 and take a cleaner solution suggested by Kostya: return the known frame name for fake stack instead of looking it up.
llvm-svn: 168046
This commit is contained in:
parent
671f4c0ce1
commit
bcc00a4174
|
@ -998,10 +998,6 @@ void FakeStack::OnFree(uptr ptr, uptr size, uptr real_stack) {
|
|||
CHECK(fake_frame->descr != 0);
|
||||
CHECK(fake_frame->size_minus_one == size - 1);
|
||||
PoisonShadow(ptr, size, kAsanStackAfterReturnMagic);
|
||||
CHECK(size >= SHADOW_GRANULARITY);
|
||||
// Poison the leftmost shadow byte with a special value so that we can find
|
||||
// the beginning of the fake frame when reporting an error.
|
||||
PoisonShadow(ptr, SHADOW_GRANULARITY, kAsanStackAfterReturnLeftMagic);
|
||||
}
|
||||
|
||||
} // namespace __asan
|
||||
|
|
|
@ -160,7 +160,6 @@ const int kAsanStackPartialRedzoneMagic = 0xf4;
|
|||
const int kAsanStackAfterReturnMagic = 0xf5;
|
||||
const int kAsanInitializationOrderMagic = 0xf6;
|
||||
const int kAsanUserPoisonedMemoryMagic = 0xf7;
|
||||
const int kAsanStackAfterReturnLeftMagic = 0xf8;
|
||||
const int kAsanGlobalRedzoneMagic = 0xf9;
|
||||
const int kAsanInternalHeapMagic = 0xfe;
|
||||
|
||||
|
|
|
@ -450,7 +450,6 @@ void __asan_report_error(uptr pc, uptr bp, uptr sp,
|
|||
bug_descr = "stack-buffer-overflow";
|
||||
break;
|
||||
case kAsanStackAfterReturnMagic:
|
||||
case kAsanStackAfterReturnLeftMagic:
|
||||
bug_descr = "stack-use-after-return";
|
||||
break;
|
||||
case kAsanUserPoisonedMemoryMagic:
|
||||
|
|
|
@ -118,41 +118,35 @@ void AsanThread::ClearShadowForThreadStack() {
|
|||
|
||||
const char *AsanThread::GetFrameNameByAddr(uptr addr, uptr *offset) {
|
||||
uptr bottom = 0;
|
||||
bool is_fake_stack = false;
|
||||
if (AddrIsInStack(addr)) {
|
||||
bottom = stack_bottom();
|
||||
} else {
|
||||
bottom = fake_stack().AddrIsInFakeStack(addr);
|
||||
CHECK(bottom);
|
||||
is_fake_stack = true;
|
||||
*offset = addr - bottom;
|
||||
return (const char *)((uptr*)bottom)[1];
|
||||
}
|
||||
uptr aligned_addr = addr & ~(__WORDSIZE/8 - 1); // align addr.
|
||||
u8 *shadow_ptr = (u8*)MemToShadow(aligned_addr);
|
||||
u8 *shadow_bottom = (u8*)MemToShadow(bottom);
|
||||
|
||||
while (shadow_ptr >= shadow_bottom &&
|
||||
*shadow_ptr != kAsanStackLeftRedzoneMagic &&
|
||||
*shadow_ptr != kAsanStackAfterReturnLeftMagic) {
|
||||
*shadow_ptr != kAsanStackLeftRedzoneMagic) {
|
||||
shadow_ptr--;
|
||||
}
|
||||
|
||||
while (shadow_ptr >= shadow_bottom &&
|
||||
(*shadow_ptr == kAsanStackLeftRedzoneMagic ||
|
||||
*shadow_ptr == kAsanStackAfterReturnLeftMagic)) {
|
||||
*shadow_ptr == kAsanStackLeftRedzoneMagic) {
|
||||
shadow_ptr--;
|
||||
}
|
||||
|
||||
if (shadow_ptr < shadow_bottom) {
|
||||
// If we're one byte below the fake stack bottom, we've found the frame.
|
||||
if (!is_fake_stack || (*shadow_bottom != kAsanStackAfterReturnLeftMagic)) {
|
||||
*offset = 0;
|
||||
return "UNKNOWN";
|
||||
}
|
||||
*offset = 0;
|
||||
return "UNKNOWN";
|
||||
}
|
||||
|
||||
uptr* ptr = (uptr*)SHADOW_TO_MEM((uptr)(shadow_ptr + 1));
|
||||
CHECK((ptr[0] == kCurrentStackFrameMagic) ||
|
||||
(is_fake_stack && ptr[0] == kRetiredStackFrameMagic));
|
||||
CHECK(ptr[0] == kCurrentStackFrameMagic);
|
||||
*offset = addr - (uptr)ptr;
|
||||
return (const char*)ptr[1];
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue