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 00000000000..0505419195e Binary files /dev/null and b/test/Object/Inputs/macho-zero-ncmds differ 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) {