From d682839830b44ee9296abbe06ff5106c82c09e0a Mon Sep 17 00:00:00 2001 From: Filipe Cabecinhas Date: Tue, 6 Jan 2015 17:08:26 +0000 Subject: [PATCH] Don't loop endlessly for MachO files with 0 ncmds git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@225271 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Object/MachOObjectFile.cpp | 3 +++ test/Object/Inputs/macho-zero-ncmds | Bin 0 -> 32 bytes test/Object/objdump-macho-quirks.test | 9 +++++++++ tools/llvm-objdump/MachODump.cpp | 2 ++ 4 files changed, 14 insertions(+) create mode 100644 test/Object/Inputs/macho-zero-ncmds create mode 100644 test/Object/objdump-macho-quirks.test diff --git a/lib/Object/MachOObjectFile.cpp b/lib/Object/MachOObjectFile.cpp index 1373dbab410..e4769762be4 100644 --- a/lib/Object/MachOObjectFile.cpp +++ b/lib/Object/MachOObjectFile.cpp @@ -236,6 +236,9 @@ MachOObjectFile::MachOObjectFile(MemoryBufferRef Object, bool IsLittleEndian, DataInCodeLoadCmd(nullptr), DyldInfoLoadCmd(nullptr), UuidLoadCmd(nullptr), HasPageZeroSegment(false) { uint32_t LoadCommandCount = this->getHeader().ncmds; + if (LoadCommandCount == 0) + return; + MachO::LoadCommandType SegmentLoadType = is64Bit() ? MachO::LC_SEGMENT_64 : MachO::LC_SEGMENT; diff --git a/test/Object/Inputs/macho-zero-ncmds b/test/Object/Inputs/macho-zero-ncmds new file mode 100644 index 0000000000000000000000000000000000000000..0505419195e9cf2da12c1dc083babc195810dd80 GIT binary patch literal 32 ScmX^A>+L@VC}4y!kZ1sK<^#3> literal 0 HcmV?d00001 diff --git a/test/Object/objdump-macho-quirks.test b/test/Object/objdump-macho-quirks.test new file mode 100644 index 00000000000..eeee1537def --- /dev/null +++ b/test/Object/objdump-macho-quirks.test @@ -0,0 +1,9 @@ +RUN: llvm-objdump -private-headers %p/Inputs/macho-zero-ncmds \ +RUN: | FileCheck %s -check-prefix A + +// Check that we don't get an infinite loop if ncmds = 0 +A: file format Mach-O 64-bit unknown +A: Mach header +A: magic cputype cpusubtype caps filetype ncmds sizeofcmds flags +A: MH_MAGIC_64 0x00 OBJECT 0 0 0x00000000 + diff --git a/tools/llvm-objdump/MachODump.cpp b/tools/llvm-objdump/MachODump.cpp index 36db9ad5366..935696be04c 100644 --- a/tools/llvm-objdump/MachODump.cpp +++ b/tools/llvm-objdump/MachODump.cpp @@ -4204,6 +4204,8 @@ static void PrintLinkEditDataCommand(MachO::linkedit_data_command ld, static void PrintLoadCommands(const MachOObjectFile *Obj, uint32_t ncmds, uint32_t filetype, uint32_t cputype, bool verbose) { + if (ncmds == 0) + return; StringRef Buf = Obj->getData(); MachOObjectFile::LoadCommandInfo Command = Obj->getFirstLoadCommandInfo(); for (unsigned i = 0;; ++i) {