From: Kevin Enderby Date: Thu, 8 Oct 2015 16:56:35 +0000 (+0000) Subject: Fix a bug in llvm-objdump’s printing of Objective-C meta data X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=9ba45e98f4e3aa40c0d38643e1387fddb4004cc0;p=oota-llvm.git Fix a bug in llvm-objdump’s printing of Objective-C meta data from malformed Mach-O files that caused a crash because of loops in the class meta data. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@249700 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/tools/llvm-objdump/Inputs/malformed-machos/mem-crup-0010.macho b/test/tools/llvm-objdump/Inputs/malformed-machos/mem-crup-0010.macho new file mode 100644 index 00000000000..4c7e78d93b6 Binary files /dev/null and b/test/tools/llvm-objdump/Inputs/malformed-machos/mem-crup-0010.macho differ diff --git a/test/tools/llvm-objdump/malformed-machos.test b/test/tools/llvm-objdump/malformed-machos.test index 4e1765f7f42..e836239a250 100644 --- a/test/tools/llvm-objdump/malformed-machos.test +++ b/test/tools/llvm-objdump/malformed-machos.test @@ -12,3 +12,9 @@ # RUN: | FileCheck -check-prefix=m0006 %s # m0006: ivarLayout 0x8 + +# RUN: llvm-objdump -macho -objc-meta-data \ +# RUN: %p/Inputs/malformed-machos/mem-crup-0006.macho \ +# RUN: | FileCheck -check-prefix=m0010 %s + +# m0010: 00000000000010e0 0x10e8 _OBJC_CLASS_ diff --git a/tools/llvm-objdump/MachODump.cpp b/tools/llvm-objdump/MachODump.cpp index 0e9bf3695d8..b6b910f55dc 100644 --- a/tools/llvm-objdump/MachODump.cpp +++ b/tools/llvm-objdump/MachODump.cpp @@ -1667,6 +1667,7 @@ struct DisassembleInfo { uint64_t adrp_addr; uint32_t adrp_inst; BindTable *bindtable; + uint32_t depth; }; // SymbolizerGetOpInfo() is the operand information call back function. @@ -4463,9 +4464,13 @@ static void print_class64_t(uint64_t p, struct DisassembleInfo *info) { bool is_meta_class; print_class_ro64_t((c.data + n_value) & ~0x7, info, is_meta_class); - if (!is_meta_class) { - outs() << "Meta Class\n"; - print_class64_t(c.isa + isa_n_value, info); + if (!is_meta_class && + c.isa + isa_n_value != p && + c.isa + isa_n_value != 0 && + info->depth < 100) { + info->depth++; + outs() << "Meta Class\n"; + print_class64_t(c.isa + isa_n_value, info); } } @@ -5113,6 +5118,7 @@ static void printObjc2_64bit_MetaData(MachOObjectFile *O, bool verbose) { info.adrp_addr = 0; info.adrp_inst = 0; + info.depth = 0; const SectionRef CL = get_section(O, "__OBJC2", "__class_list"); if (CL != SectionRef()) { info.S = CL;