1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 02:52:53 +02:00

Added phdr upper bound checks to ElfObject.

Ensure the program_headers call will fail correctly if the program
headers are larger than the underlying buffer.

Patch by Parker Thompson!

llvm-svn: 315012
This commit is contained in:
Rafael Espindola 2017-10-05 20:01:32 +00:00
parent 3f704bf697
commit e505531600
3 changed files with 30 additions and 0 deletions

View File

@ -144,6 +144,10 @@ public:
Expected<Elf_Phdr_Range> program_headers() const {
if (getHeader()->e_phnum && getHeader()->e_phentsize != sizeof(Elf_Phdr))
return createError("invalid e_phentsize");
if (getHeader()->e_phoff +
(getHeader()->e_phnum * getHeader()->e_phentsize) >
getBufSize())
return createError("program headers longer than binary");
auto *Begin =
reinterpret_cast<const Elf_Phdr *>(base() + getHeader()->e_phoff);
return makeArrayRef(Begin, Begin + getHeader()->e_phnum);

Binary file not shown.

View File

@ -0,0 +1,26 @@
# invalid-phdr.elf is generated by creating a simple elf file with yaml2obj:
# !ELF
# FileHeader:
# Class: ELFCLASS64
# Data: ELFDATA2LSB
# Type: ET_EXEC
# Machine: EM_X86_64
# Sections:
# - Name: .text
# Type: SHT_PROGBITS
# Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
# AddressAlign: 0x0000000000001000
# Content: "00000000"
# ProgramHeaders:
# - Type: PT_LOAD
# Flags: [ PF_X, PF_R ]
# VAddr: 0xAAAA1000
# PAddr: 0xFFFF1000
# Sections:
# - Section: .text
#
# Then editing the e_phoff in with a hexeditor to set it to 0xffffff
RUN: not llvm-objdump -private-headers %p/Inputs/invalid-phdr.elf 2>&1 \
RUN: | FileCheck %s
CHECK: LLVM ERROR: Invalid data was encountered while parsing the file