mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-03 01:12:59 +00:00
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
This commit is contained in:
parent
fedf66703c
commit
9ba45e98f4
Binary file not shown.
@ -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_
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user