summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-04-19 11:36:47 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-04-19 11:36:47 +0000
commitfeef8c246966bcf8f3e21e74155812c98d48bda2 (patch)
tree36c00e091e9363d76bdb562cfecabc6132da1f2f
parenta155ab2dd2290f3571853038c8495026160659cd (diff)
downloadbcm5719-llvm-feef8c246966bcf8f3e21e74155812c98d48bda2.tar.gz
bcm5719-llvm-feef8c246966bcf8f3e21e74155812c98d48bda2.zip
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. llvm-svn: 179848
-rw-r--r--llvm/lib/Object/MachOObjectFile.cpp8
-rw-r--r--llvm/test/Object/ARM/objdump-thumb.test4
-rw-r--r--llvm/test/Object/Inputs/macho-text.thumbbin0 -> 156 bytes
-rw-r--r--llvm/tools/llvm-objdump/MachODump.cpp8
4 files changed, 16 insertions, 4 deletions
diff --git a/llvm/lib/Object/MachOObjectFile.cpp b/llvm/lib/Object/MachOObjectFile.cpp
index f5910dd95d7..d26eb2ce611 100644
--- a/llvm/lib/Object/MachOObjectFile.cpp
+++ b/llvm/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<const char*>(Sec));
}
}
- Load = getNextLoadCommandInfo(Load);
+
+ if (I == LoadCommandCount - 1)
+ break;
+ else
+ Load = getNextLoadCommandInfo(Load);
}
}
diff --git a/llvm/test/Object/ARM/objdump-thumb.test b/llvm/test/Object/ARM/objdump-thumb.test
new file mode 100644
index 00000000000..9c92a27782d
--- /dev/null
+++ b/llvm/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/llvm/test/Object/Inputs/macho-text.thumb b/llvm/test/Object/Inputs/macho-text.thumb
new file mode 100644
index 00000000000..b29428a7878
--- /dev/null
+++ b/llvm/test/Object/Inputs/macho-text.thumb
Binary files differ
diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp
index e4d9ce24985..d78d7f31a6c 100644
--- a/llvm/tools/llvm-objdump/MachODump.cpp
+++ b/llvm/tools/llvm-objdump/MachODump.cpp
@@ -205,7 +205,7 @@ getSectionsAndSymbols(const macho::Header Header,
MachOObjectFile::LoadCommandInfo Command =
MachOObj->getFirstLoadCommandInfo();
- 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);
}
}
OpenPOWER on IntegriCloud