From: Kevin Enderby Date: Wed, 13 Sep 2017 21:01:49 +0000 (+0000) Subject: Fix a crash in llvm-nm for a bad Mach-O file that has an N_SECT type symbol and a... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0833191bf839734e643197b6fce8949c8b7d6473;p=llvm Fix a crash in llvm-nm for a bad Mach-O file that has an N_SECT type symbol and a zero n_sect value. The code in llvm-nm for Mach-O files to determine the section type for an N_SECT type symbol it will call getSymbolSection() and check for the error, but in the case the n_sect value is zero it will return section_end() (aka nullptr). And the code was using that and crashing instead of just returning a ā€™sā€™ for a section or printing (?,?) as it would if getSymbolSection() returned an error. rdar://33136604 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@313193 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/tools/llvm-nm/X86/Inputs/macho-bad-zero-nsect-for-N_SECT b/test/tools/llvm-nm/X86/Inputs/macho-bad-zero-nsect-for-N_SECT new file mode 100755 index 00000000000..dff31880a37 Binary files /dev/null and b/test/tools/llvm-nm/X86/Inputs/macho-bad-zero-nsect-for-N_SECT differ diff --git a/test/tools/llvm-nm/X86/macho-bad-zero-nsect-for-N_SECT.test b/test/tools/llvm-nm/X86/macho-bad-zero-nsect-for-N_SECT.test new file mode 100644 index 00000000000..86c1cb82e92 --- /dev/null +++ b/test/tools/llvm-nm/X86/macho-bad-zero-nsect-for-N_SECT.test @@ -0,0 +1,8 @@ +RUN: llvm-nm %p/Inputs/macho-bad-zero-nsect-for-N_SECT | FileCheck -check-prefix DEFAULT %s +DEFAULT: 0000000000000000 S dyld_stub_binder + +RUN: llvm-nm -m %p/Inputs/macho-bad-zero-nsect-for-N_SECT | FileCheck -check-prefix MACHO %s +MACHO: 0000000000000000 (?,?) private external dyld_stub_binder + +RUN: llvm-nm -x %p/Inputs/macho-bad-zero-nsect-for-N_SECT | FileCheck -check-prefix HEX %s +HEX: 0000000000000000 1f 00 0000 00000024 dyld_stub_binder diff --git a/tools/llvm-nm/llvm-nm.cpp b/tools/llvm-nm/llvm-nm.cpp index 1934051c65d..4ad0d95d67f 100644 --- a/tools/llvm-nm/llvm-nm.cpp +++ b/tools/llvm-nm/llvm-nm.cpp @@ -486,6 +486,10 @@ static void darwinPrintSymbol(SymbolicFile &Obj, SymbolListT::iterator I, break; } Sec = *SecOrErr; + if (Sec == MachO->section_end()) { + outs() << "(?,?) "; + break; + } } else { Sec = I->Section; } @@ -997,6 +1001,8 @@ static char getSymbolNMTypeChar(MachOObjectFile &Obj, basic_symbol_iterator I) { return 's'; } section_iterator Sec = *SecOrErr; + if (Sec == Obj.section_end()) + return 's'; DataRefImpl Ref = Sec->getRawDataRefImpl(); StringRef SectionName; Obj.getSectionName(Ref, SectionName);