From db5f9270207292b62ea847560c5dd4e9873b57f5 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Fri, 19 Apr 2013 11:36:47 +0000 Subject: [PATCH] Don't read one command past the end. Thanks to Evgeniy Stepanov for reporting this. It might be a good idea to add a command iterator abstraction to MachO.h, but this fixes the bug for now. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@179848 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Object/MachOObjectFile.cpp | 8 ++++++-- test/Object/ARM/objdump-thumb.test | 4 ++++ test/Object/Inputs/macho-text.thumb | Bin 0 -> 156 bytes tools/llvm-objdump/MachODump.cpp | 8 ++++++-- 4 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 test/Object/ARM/objdump-thumb.test create mode 100644 test/Object/Inputs/macho-text.thumb diff --git a/lib/Object/MachOObjectFile.cpp b/lib/Object/MachOObjectFile.cpp index f5910dd95d7..d26eb2ce611 100644 --- a/lib/Object/MachOObjectFile.cpp +++ b/lib/Object/MachOObjectFile.cpp @@ -405,7 +405,7 @@ MachOObjectFile::MachOObjectFile(MemoryBuffer *Object, macho::LCT_Segment64 : macho::LCT_Segment; MachOObjectFile::LoadCommandInfo Load = getFirstLoadCommandInfo(); - for (unsigned I = 0; I < LoadCommandCount; ++I) { + for (unsigned I = 0; ; ++I) { if (Load.C.Type == macho::LCT_Symtab) { assert(!SymtabLoadCmd && "Multiple symbol tables"); SymtabLoadCmd = Load.Ptr; @@ -418,7 +418,11 @@ MachOObjectFile::MachOObjectFile(MemoryBuffer *Object, Sections.push_back(reinterpret_cast(Sec)); } } - Load = getNextLoadCommandInfo(Load); + + if (I == LoadCommandCount - 1) + break; + else + Load = getNextLoadCommandInfo(Load); } } diff --git a/test/Object/ARM/objdump-thumb.test b/test/Object/ARM/objdump-thumb.test new file mode 100644 index 00000000000..9c92a27782d --- /dev/null +++ b/test/Object/ARM/objdump-thumb.test @@ -0,0 +1,4 @@ +RUN: llvm-objdump -d -macho -triple=thumbv7-apple-ios \ +RUN: %p/../Inputs/macho-text.thumb | FileCheck %s + +CHECK: 0: 00 bf nop diff --git a/test/Object/Inputs/macho-text.thumb b/test/Object/Inputs/macho-text.thumb new file mode 100644 index 0000000000000000000000000000000000000000..b29428a7878154bf5fca61eef413a1d71b394024 GIT binary patch literal 156 zcmX^2>+L@t1_lOBAZCQ(8XyegetFirstLoadCommandInfo(); - for (unsigned i = 0; i != Header.NumLoadCommands; ++i) { + for (unsigned i = 0; ; ++i) { if (Command.C.Type == macho::LCT_FunctionStarts) { // We found a function starts segment, parse the addresses for later // consumption. @@ -214,7 +214,11 @@ getSectionsAndSymbols(const macho::Header Header, MachOObj->ReadULEB128s(LLC.DataOffset, FoundFns); } - Command = MachOObj->getNextLoadCommandInfo(Command); + + if (i == Header.NumLoadCommands - 1) + break; + else + Command = MachOObj->getNextLoadCommandInfo(Command); } } -- 2.34.1