aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-objcopy/ELF/Object.cpp
diff options
context:
space:
mode:
authorGeorge Rimar <grimar@accesssoftek.com>2019-06-07 08:34:18 +0000
committerGeorge Rimar <grimar@accesssoftek.com>2019-06-07 08:34:18 +0000
commit33044a7ae21350954e3523a70f2e4422a4e165ea (patch)
tree853a652ba1d534b803f9cad80bb86df94e499eb1 /llvm/tools/llvm-objcopy/ELF/Object.cpp
parenteb394e93d2d39cf18d0b6c992f948b17d99b1c69 (diff)
downloadllvm-33044a7ae21350954e3523a70f2e4422a4e165ea.zip
llvm-33044a7ae21350954e3523a70f2e4422a4e165ea.tar.gz
llvm-33044a7ae21350954e3523a70f2e4422a4e165ea.tar.bz2
[llvm-objcopy] - Emit error and don't crash if program header reaches past end of file.
This is https://bugs.llvm.org/show_bug.cgi?id=42122. If an object file has a size less than program header's file [offset + size] (i.e. if we have overflow), llvm-objcopy crashes instead of reporting a error. The patch fixes this issue. Differential revision: https://reviews.llvm.org/D62898 llvm-svn: 362778
Diffstat (limited to 'llvm/tools/llvm-objcopy/ELF/Object.cpp')
-rw-r--r--llvm/tools/llvm-objcopy/ELF/Object.cpp5
1 files changed, 5 insertions, 0 deletions
diff --git a/llvm/tools/llvm-objcopy/ELF/Object.cpp b/llvm/tools/llvm-objcopy/ELF/Object.cpp
index e70a3b1..b654305 100644
--- a/llvm/tools/llvm-objcopy/ELF/Object.cpp
+++ b/llvm/tools/llvm-objcopy/ELF/Object.cpp
@@ -1104,6 +1104,11 @@ template <class ELFT> void ELFBuilder<ELFT>::setParentSegment(Segment &Child) {
template <class ELFT> void ELFBuilder<ELFT>::readProgramHeaders() {
uint32_t Index = 0;
for (const auto &Phdr : unwrapOrError(ElfFile.program_headers())) {
+ if (Phdr.p_offset + Phdr.p_filesz > ElfFile.getBufSize())
+ error("program header with offset 0x" + Twine::utohexstr(Phdr.p_offset) +
+ " and file size 0x" + Twine::utohexstr(Phdr.p_filesz) +
+ " goes past the end of the file");
+
ArrayRef<uint8_t> Data{ElfFile.base() + Phdr.p_offset,
(size_t)Phdr.p_filesz};
Segment &Seg = Obj.addSegment(Data);