From 5000ee16f6eb6177e98570e786e6b4be050399b3 Mon Sep 17 00:00:00 2001 From: Enrico Granata Date: Mon, 27 Jan 2014 21:31:26 +0000 Subject: ValueObjectPrinter could enter an infinite loop while trying to display an aptly formed ValueObject: a reference, with a child of some pointer type, such that the pointees chain ended up pointing back to some part of itself - a pointer to itself being the simplest such case Fixed here by only setting a pointer depth when needed, and ensuring that we won't overflow and wrap the pointer depth when it's zero. llvm-svn: 200247 --- lldb/source/DataFormatters/ValueObjectPrinter.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'lldb/source/DataFormatters/ValueObjectPrinter.cpp') diff --git a/lldb/source/DataFormatters/ValueObjectPrinter.cpp b/lldb/source/DataFormatters/ValueObjectPrinter.cpp index f8a9151b4a6..dca80af812d 100644 --- a/lldb/source/DataFormatters/ValueObjectPrinter.cpp +++ b/lldb/source/DataFormatters/ValueObjectPrinter.cpp @@ -403,7 +403,6 @@ ValueObjectPrinter::ShouldPrintChildren (bool is_failed_description, // Use a new temporary pointer depth in case we override the // current pointer depth below... - uint32_t curr_ptr_depth = m_ptr_depth; if (is_ptr || is_ref) { @@ -413,7 +412,7 @@ ValueObjectPrinter::ShouldPrintChildren (bool is_failed_description, if (m_valobj->GetPointerValue (&ptr_address_type) == 0) return false; - else if (is_ref && m_curr_depth == 0) + else if (is_ref && m_curr_depth == 0 && curr_ptr_depth == 0) { // If this is the root object (depth is zero) that we are showing // and it is a reference, and no pointer depth has been supplied @@ -468,7 +467,7 @@ ValueObjectPrinter::PrintChild (ValueObjectSP child_sp, ValueObjectPrinter child_printer(child_sp.get(), m_stream, child_options, - (IsPtr() || IsRef()) ? curr_ptr_depth - 1 : curr_ptr_depth, + (IsPtr() || IsRef()) && curr_ptr_depth >= 1 ? curr_ptr_depth - 1 : curr_ptr_depth, m_curr_depth + 1); child_printer.PrintValueObject(); } -- cgit v1.2.3