[PATCH] D62898: [llvm-objcopy] - Emit error and don't crash if program header reaches past end of file.
George Rimar via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 7 01:31:55 PDT 2019
This revision was automatically updated to reflect the committed changes.
Closed by commit rL362778: [llvm-objcopy] - Emit error and don't crash if program header reaches past end… (authored by grimar, committed by ).
Herald added a project: LLVM.
Changed prior to commit:
https://reviews.llvm.org/D62898?vs=203300&id=203510#toc
Repository:
rL LLVM
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D62898/new/
https://reviews.llvm.org/D62898
Files:
llvm/trunk/test/tools/llvm-objcopy/ELF/invalid-p_filesz-p_offset.test
llvm/trunk/tools/llvm-objcopy/ELF/Object.cpp
Index: llvm/trunk/test/tools/llvm-objcopy/ELF/invalid-p_filesz-p_offset.test
===================================================================
--- llvm/trunk/test/tools/llvm-objcopy/ELF/invalid-p_filesz-p_offset.test
+++ llvm/trunk/test/tools/llvm-objcopy/ELF/invalid-p_filesz-p_offset.test
@@ -0,0 +1,45 @@
+## In this case, we have a program header with a file size that
+## overflows the binary size. Check llvm-objcopy doesn't crash
+## and report this error properly.
+
+# RUN: yaml2obj --docnum=1 %s -o %t1.o
+# RUN: not llvm-objcopy %t1.o 2>&1 | FileCheck %s --check-prefix=ERR1
+# ERR1: error: program header with offset 0x1b8 and file size 0x100000 goes past the end of the file
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .foo
+ Type: SHT_PROGBITS
+ProgramHeaders:
+ - Type: PT_LOAD
+ FileSize: 0x100000
+ Sections:
+ - Section: .foo
+
+## A similar case, but now the p_offset property of the program header is too large.
+
+# RUN: yaml2obj --docnum=2 %s -o %t2.o
+# RUN: not llvm-objcopy %t2.o 2>&1 | FileCheck %s --check-prefix=ERR2
+# ERR2: error: program header with offset 0x100000 and file size 0x1 goes past the end of the file
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .foo
+ Type: SHT_PROGBITS
+ Size: 1
+ProgramHeaders:
+ - Type: PT_LOAD
+ Offset: 0x100000
+ FileSize: 1
+ Sections:
+ - Section: .foo
Index: llvm/trunk/tools/llvm-objcopy/ELF/Object.cpp
===================================================================
--- llvm/trunk/tools/llvm-objcopy/ELF/Object.cpp
+++ llvm/trunk/tools/llvm-objcopy/ELF/Object.cpp
@@ -1104,6 +1104,11 @@
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);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D62898.203510.patch
Type: text/x-patch
Size: 2395 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190607/2d6a4037/attachment.bin>
More information about the llvm-commits
mailing list