From 8994b14e8b1eb326571411f12dab21909918abe8 Mon Sep 17 00:00:00 2001 From: Xing GUO Date: Tue, 28 Apr 2020 21:38:50 +0800 Subject: [PATCH] [DebugInfo] Fix crash caused by unhandled error. Summary: This patch helps fix LLVM crash caused by unhandled error. Reviewers: clayborg, aprantl Reviewed By: clayborg Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D78924 --- llvm/lib/DebugInfo/GSYM/ObjectFileTransformer.cpp | 6 +++- .../X86/macho-invalid-section-offset.yaml | 36 ++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 llvm/test/tools/llvm-gsymutil/X86/macho-invalid-section-offset.yaml diff --git a/llvm/lib/DebugInfo/GSYM/ObjectFileTransformer.cpp b/llvm/lib/DebugInfo/GSYM/ObjectFileTransformer.cpp index eb392dd..c21083d 100644 --- a/llvm/lib/DebugInfo/GSYM/ObjectFileTransformer.cpp +++ b/llvm/lib/DebugInfo/GSYM/ObjectFileTransformer.cpp @@ -82,8 +82,12 @@ llvm::Error ObjectFileTransformer::convert(const object::ObjectFile &Obj, 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 index 0000000..e9afbb6 --- /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 -- 2.7.4