diff --git a/llvm/lib/DebugInfo/GSYM/ObjectFileTransformer.cpp b/llvm/lib/DebugInfo/GSYM/ObjectFileTransformer.cpp --- a/llvm/lib/DebugInfo/GSYM/ObjectFileTransformer.cpp +++ b/llvm/lib/DebugInfo/GSYM/ObjectFileTransformer.cpp @@ -82,8 +82,12 @@ size_t NumBefore = Gsym.getNumFunctionInfos(); for (const object::SymbolRef &Sym : Obj.symbols()) { Expected SymType = Sym.getType(); + if (!SymType) { + consumeError(SymType.takeError()); + continue; + } const uint64_t Addr = Sym.getValue(); - if (!SymType || SymType.get() != SymbolRef::Type::ST_Function || + if (SymType.get() != SymbolRef::Type::ST_Function || !Gsym.IsValidTextAddress(Addr) || Gsym.hasFunctionInfoForAddress(Addr)) continue; // Function size for MachO files will be 0 diff --git a/llvm/test/tools/llvm-gsymutil/X86/macho-invalid-section-offset.yaml b/llvm/test/tools/llvm-gsymutil/X86/macho-invalid-section-offset.yaml new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-gsymutil/X86/macho-invalid-section-offset.yaml @@ -0,0 +1,36 @@ +## This test ensures that LLVM will not crash when converting a Mach-O object +## file with a malformed symbol whose n_sect points to an invalid offset. + +# RUN: yaml2obj %s -o %t +# RUN: not llvm-gsymutil --convert %t -o %t.o 2>&1 | FileCheck %s + +# CHECK: Loaded 0 functions from symbol table. + +--- !mach-o +FileHeader: + magic: 0xFEEDFACF + cputype: 0x01000007 + cpusubtype: 0x00000003 + filetype: 0x0000000A + ncmds: 1 + sizeofcmds: 100 + flags: 0x00000000 + reserved: 0x00000000 +LoadCommands: + - cmd: LC_SYMTAB + cmdsize: 24 + symoff: 4096 + nsyms: 1 + stroff: 4144 + strsize: 6 +LinkEditData: + NameList: + - n_strx: 2 # _foo + n_type: 0x0e + n_sect: 3 # Points to an invalid offset. + n_desc: 0 + n_value: 1234 + StringTable: + - '' + - '' + - _foo