Add two new memory region based checks to the Unwinder:

Check that the pc value for frames up the stack is in a
mapped+executable region of memory.

Check that the stack pointer for frames up the stack is
in a mapped+readable region of memory.

If the unwinder ever makes a mistake walking the stack,
these checks will help to keep it from going too far into
the weeds.

These aren't fixing any bugs that I know of, but they
add extra robustness to a complicated task.

llvm-svn: 146478
This commit is contained in:
Jason Molenda 2011-12-13 06:00:49 +00:00
parent cb349ee19c
commit 87698349b3
1 changed files with 20 additions and 0 deletions

View File

@ -236,6 +236,17 @@ RegisterContextLLDB::InitializeNonZerothFrame()
m_frame_type = eNotAValidFrame;
return;
}
// Test the pc value to see if we know it's in an unmapped/non-executable region of memory.
// If so, our unwind has made a mistake somewhere and we should stop.
uint32_t permissions;
if (m_thread.GetProcess().GetLoadAddressPermissions(pc, permissions)
&& (permissions & ePermissionsExecutable) == 0)
{
m_frame_type = eNotAValidFrame;
return;
}
m_thread.GetProcess().GetTarget().GetSectionLoadList().ResolveLoadAddress (pc, m_current_pc);
// If we don't have a Module for some reason, we're not going to find symbol/function information - just
@ -287,6 +298,15 @@ RegisterContextLLDB::InitializeNonZerothFrame()
m_frame_type = eNotAValidFrame;
return;
}
// cfa_regval should point into the stack memory; if we can query memory region permissions,
// see if the memory is allocated & readable.
if (m_thread.GetProcess().GetLoadAddressPermissions(cfa_regval, permissions)
&& (permissions & ePermissionsReadable) == 0)
{
m_frame_type = eNotAValidFrame;
return;
}
}
else
{