summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp
diff options
context:
space:
mode:
authorJason Molenda <jmolenda@apple.com>2011-12-13 06:00:49 +0000
committerJason Molenda <jmolenda@apple.com>2011-12-13 06:00:49 +0000
commit87698349b3c390d5f1973641586ca48d40ce801c (patch)
treefa8c5b372a0a4d5b6b94cd9af448bcaaadce1cea /lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp
parentcb349ee19c8eccc65829e6739096aceb0ae09135 (diff)
downloadbcm5719-llvm-87698349b3c390d5f1973641586ca48d40ce801c.tar.gz
bcm5719-llvm-87698349b3c390d5f1973641586ca48d40ce801c.zip
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
Diffstat (limited to 'lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp')
-rw-r--r--lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp b/lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp
index fe1426913ab..bd2f70d0306 100644
--- a/lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp
+++ b/lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp
@@ -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
{
OpenPOWER on IntegriCloud