aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEnrico Granata <egranata@apple.com>2012-08-02 17:34:05 +0000
committerEnrico Granata <egranata@apple.com>2012-08-02 17:34:05 +0000
commitb87efc9a5a9e3c6716f20da8669a6931a7662732 (patch)
tree411f42650b384ceb5d9bd698c54272f9ede664fb
parent894eab4759a32d152a7a9d9d8e614e82e2452929 (diff)
downloadlldb-b87efc9a5a9e3c6716f20da8669a6931a7662732.tar.gz
<rdar://problem/11846023> Fixing a bug where malformed DWARF could lead to an endless recursion with synthetic children
git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@161185 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--source/Core/ValueObject.cpp24
1 files changed, 19 insertions, 5 deletions
diff --git a/source/Core/ValueObject.cpp b/source/Core/ValueObject.cpp
index 9fc3a0f7f..87f72551f 100644
--- a/source/Core/ValueObject.cpp
+++ b/source/Core/ValueObject.cpp
@@ -2020,7 +2020,9 @@ ValueObject::GetSyntheticExpressionPathChild(const char* expression, bool can_cr
{
// We haven't made a synthetic array member for expression yet, so
// lets make one and cache it for any future reference.
- synthetic_child_sp = GetValueForExpressionPath(expression);
+ synthetic_child_sp = GetValueForExpressionPath(expression,
+ NULL, NULL, NULL,
+ GetValueForExpressionPathOptions().DontAllowSyntheticChildren());
// Cache the value if we got one back...
if (synthetic_child_sp.get())
@@ -2486,10 +2488,14 @@ ValueObject::GetValueForExpressionPath_Impl(const char* expression_cstr,
else if (options.m_no_synthetic_children == false) // let's try with synthetic children
{
if (root->IsSynthetic())
- child_valobj_sp = root;
- else
- child_valobj_sp = root->GetSyntheticValue();
-
+ {
+ *first_unparsed = expression_cstr;
+ *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
+ *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
+ return ValueObjectSP();
+ }
+
+ child_valobj_sp = root->GetSyntheticValue();
if (child_valobj_sp.get())
child_valobj_sp = child_valobj_sp->GetChildMemberWithName(child_name, true);
}
@@ -2524,6 +2530,14 @@ ValueObject::GetValueForExpressionPath_Impl(const char* expression_cstr,
}
else if (options.m_no_synthetic_children == false) // let's try with synthetic children
{
+ if (root->IsSynthetic())
+ {
+ *first_unparsed = expression_cstr;
+ *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
+ *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
+ return ValueObjectSP();
+ }
+
child_valobj_sp = root->GetSyntheticValue(true);
if (child_valobj_sp)
child_valobj_sp = child_valobj_sp->GetChildMemberWithName(child_name, true);