On Fri, Nov 15, 2013 at 06:12:07PM +0400, Konstantin Serebryany wrote:
> I afraid it actually wants the header (magic, descr, pc) to be in the
> first 3 words in the
> memory returned by __asan_stack_malloc_*
> FakeStack::AddrIsInFakeStack(addr) returns the beginning of the allocated
> chunk
> and then AsanThread::GetFrameNameByAddr expects the header to be there.
Can it be changed? I mean, adding potentially very large first red zone
would be quite expensive, and would have to be done unconditionally, even
when not using fake stacks.
I mean, in AsanThread::GetFrameNameByAddr do (pseudo patch):
+ u8 *shadow_bottom;
if (AddrIsInStack(addr)) {
bottom = stack_bottom();
+ shadow_bottom = (u8*)MemToShadow(bottom);
} else if (has_fake_stack()) {
bottom = fake_stack()->AddrIsInFakeStack(addr);
CHECK(bottom);
- *offset = addr - bottom;
- *frame_pc = ((uptr*)bottom)[2];
- return (const char *)((uptr*)bottom)[1];
+ shadow_bottom = (u8*)MemToShadow(bottom);
+ if (*shadow_bottom == kAsanStackLeftRedzoneMagic) {
+ *offset = addr - bottom;
+ *frame_pc = ((uptr*)bottom)[2];
+ return (const char *)((uptr*)bottom)[1];
+ }
}
uptr aligned_addr = addr & ~(SANITIZER_WORDSIZE/8 - 1); // align addr.
u8 *shadow_ptr = (u8*)MemToShadow(aligned_addr);
- u8 *shadow_bottom = (u8*)MemToShadow(bottom);
Jakub