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,13 @@ size_t NumBefore = Gsym.getNumFunctionInfos(); for (const object::SymbolRef &Sym : Obj.symbols()) { Expected SymType = Sym.getType(); + if (!SymType) { + logAllUnhandledErrors(SymType.takeError(), Log, + "ObjectFileTransformer: "); + 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/DebugInfo/gsym-invalid-section-offset.yaml b/llvm/test/DebugInfo/gsym-invalid-section-offset.yaml new file mode 100644 --- /dev/null +++ b/llvm/test/DebugInfo/gsym-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: llvm-gsymutil --convert %s -o %t.macho 2>&1 | +# RUN: FileCheck %s + +# CHECK: ObjectFileTransformer: truncated or malformed object (bad section index: 3 for symbol at index 0) + +--- !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