diff options
author | Enrico Granata <egranata@apple.com> | 2012-08-02 17:34:05 +0000 |
---|---|---|
committer | Enrico Granata <egranata@apple.com> | 2012-08-02 17:34:05 +0000 |
commit | b87efc9a5a9e3c6716f20da8669a6931a7662732 (patch) | |
tree | 411f42650b384ceb5d9bd698c54272f9ede664fb | |
parent | 894eab4759a32d152a7a9d9d8e614e82e2452929 (diff) | |
download | lldb-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.cpp | 24 |
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); |