diff options
author | Jason Molenda <jmolenda@apple.com> | 2011-12-13 06:00:49 +0000 |
---|---|---|
committer | Jason Molenda <jmolenda@apple.com> | 2011-12-13 06:00:49 +0000 |
commit | 87698349b3c390d5f1973641586ca48d40ce801c (patch) | |
tree | fa8c5b372a0a4d5b6b94cd9af448bcaaadce1cea /lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp | |
parent | cb349ee19c8eccc65829e6739096aceb0ae09135 (diff) | |
download | bcm5719-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.cpp | 20 |
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 { |