DebugNamesDWARFIndex: fix handling of compressed sections
authorPavel Labath <labath@google.com>
Thu, 14 Jun 2018 14:41:30 +0000 (14:41 +0000)
committerPavel Labath <labath@google.com>
Thu, 14 Jun 2018 14:41:30 +0000 (14:41 +0000)
This fixes a silly bug where we were accidentally freeing the memory
used to store the decompressed .debug_names data. I had actually
considered this scenario when writing the class and put appropriate
precautions in place -- I just failed to wire it all up correctly.

This was only an issue for compressed sections because in case of
uncompressed ones we would access the data straight out of the mmapped
object file.

llvm-svn: 334717

lldb/lit/SymbolFile/DWARF/debug-names-compressed.cpp [new file with mode: 0644]
lldb/source/Plugins/SymbolFile/DWARF/DebugNamesDWARFIndex.h

diff --git a/lldb/lit/SymbolFile/DWARF/debug-names-compressed.cpp b/lldb/lit/SymbolFile/DWARF/debug-names-compressed.cpp
new file mode 100644 (file)
index 0000000..076cac1
--- /dev/null
@@ -0,0 +1,14 @@
+// Test for a bug where we crashed while processing a compressed debug_names
+// section (use after free).
+
+// REQUIRES: lld, zlib
+
+// RUN: clang -g -c -o %t.o --target=x86_64-pc-linux -mllvm -accel-tables=Dwarf %s
+// RUN: ld.lld %t.o -o %t --compress-debug-sections=zlib
+// RUN: lldb-test symbols --find=variable --name=foo %t | FileCheck %s
+
+// CHECK: Found 1 variables:
+int foo;
+// ONE-DAG: name = "foo", type = {{.*}} (int), {{.*}} decl = debug-names-compressed.cpp:[[@LINE-1]]
+
+extern "C" void _start() {}
index 4f0b1ce..ad964e5 100644 (file)
@@ -53,6 +53,7 @@ private:
                        DWARFDataExtractor debug_str_data,
                        DWARFDebugInfo &debug_info)
       : DWARFIndex(module), m_debug_info(debug_info),
+        m_debug_names_data(debug_names_data), m_debug_str_data(debug_str_data),
         m_debug_names_up(std::move(debug_names_up)),
         m_fallback(module, &debug_info, GetUnits(*m_debug_names_up)) {}