forked from OSchip/llvm-project
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:
parent
cb349ee19c
commit
87698349b3
|
@ -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
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue