diff options
-rw-r--r-- | llvm/lib/Object/MachOObjectFile.cpp | 2 | ||||
-rw-r--r-- | llvm/test/Object/macho-invalid.test | 10 | ||||
-rw-r--r-- | llvm/tools/llvm-nm/llvm-nm.cpp | 13 |
3 files changed, 20 insertions, 5 deletions
diff --git a/llvm/lib/Object/MachOObjectFile.cpp b/llvm/lib/Object/MachOObjectFile.cpp index d1f79b225ee..4ba6523a528 100644 --- a/llvm/lib/Object/MachOObjectFile.cpp +++ b/llvm/lib/Object/MachOObjectFile.cpp @@ -458,7 +458,7 @@ MachOObjectFile::getSymbolSection(DataRefImpl Symb) const { DataRefImpl DRI; DRI.d.a = index - 1; if (DRI.d.a >= Sections.size()) - report_fatal_error("getSymbolSection: Invalid section index."); + return object_error::parse_failed; return section_iterator(SectionRef(DRI, this)); } diff --git a/llvm/test/Object/macho-invalid.test b/llvm/test/Object/macho-invalid.test index f4aa1e0c298..686e516f5e9 100644 --- a/llvm/test/Object/macho-invalid.test +++ b/llvm/test/Object/macho-invalid.test @@ -31,9 +31,15 @@ RUN: not llvm-objdump -t %p/Inputs/macho-invalid-symbol-name-past-eof 2>&1 \ RUN: | FileCheck -check-prefix NAME-PAST-EOF %s NAME-PAST-EOF: Symbol name entry points before beginning or past end of file -RUN: not llvm-nm %p/Inputs/macho-invalid-section-index-getSectionRawName 2>&1 \ +RUN: llvm-nm %p/Inputs/macho-invalid-section-index-getSectionRawName 2>&1 \ RUN: | FileCheck -check-prefix INVALID-SECTION-IDX-SYMBOL-SEC %s -INVALID-SECTION-IDX-SYMBOL-SEC: getSymbolSection: Invalid section index +INVALID-SECTION-IDX-SYMBOL-SEC: 0000000100000000 S __mh_execute_header +RUN: llvm-nm -m %p/Inputs/macho-invalid-section-index-getSectionRawName 2>&1 \ +RUN: | FileCheck -check-prefix INVALID-SECTION-IDX-SYMBOL-SEC-m %s +INVALID-SECTION-IDX-SYMBOL-SEC-m: 0000000100000000 (?,?) [referenced dynamically] external __mh_execute_header +RUN: llvm-nm -pax %p/Inputs/macho-invalid-section-index-getSectionRawName 2>&1 \ +RUN: | FileCheck -check-prefix INVALID-SECTION-IDX-SYMBOL-SEC-pax %s +INVALID-SECTION-IDX-SYMBOL-SEC-pax: 0000000100000000 0f 42 0010 00000065 __mh_execute_header RUN: not llvm-objdump -private-headers %p/Inputs/macho-invalid-header 2>&1 | FileCheck -check-prefix INVALID-HEADER %s INVALID-HEADER: Invalid data was encountered while parsing the file diff --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp index 50960653f75..b70a79c334c 100644 --- a/llvm/tools/llvm-nm/llvm-nm.cpp +++ b/llvm/tools/llvm-nm/llvm-nm.cpp @@ -367,7 +367,13 @@ static void darwinPrintSymbol(SymbolicFile &Obj, SymbolListT::iterator I, outs() << "(?,?) "; break; } - section_iterator Sec = *MachO->getSymbolSection(I->Sym.getRawDataRefImpl()); + ErrorOr<section_iterator> SecOrErr = + MachO->getSymbolSection(I->Sym.getRawDataRefImpl()); + if (SecOrErr.getError()) { + outs() << "(?,?) "; + break; + } + section_iterator Sec = *SecOrErr; DataRefImpl Ref = Sec->getRawDataRefImpl(); StringRef SectionName; MachO->getSectionName(Ref, SectionName); @@ -772,7 +778,10 @@ static char getSymbolNMTypeChar(MachOObjectFile &Obj, basic_symbol_iterator I) { case MachO::N_INDR: return 'i'; case MachO::N_SECT: { - section_iterator Sec = *Obj.getSymbolSection(Symb); + ErrorOr<section_iterator> SecOrErr = Obj.getSymbolSection(Symb); + if (SecOrErr.getError()) + return 's'; + section_iterator Sec = *SecOrErr; DataRefImpl Ref = Sec->getRawDataRefImpl(); StringRef SectionName; Obj.getSectionName(Ref, SectionName); |