Skip to content

Commit 361e895

Browse files
author
git apple-llvm automerger
committed
Merge commit '327c44503533' from llvm.org/master into apple/master
2 parents d4abec6 + 327c445 commit 361e895

File tree

2 files changed

+36
-7
lines changed

2 files changed

+36
-7
lines changed

llvm/include/llvm/Object/ELF.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -205,16 +205,18 @@ class ELFFile {
205205
if (getHeader()->e_phnum && getHeader()->e_phentsize != sizeof(Elf_Phdr))
206206
return createError("invalid e_phentsize: " +
207207
Twine(getHeader()->e_phentsize));
208-
if (getHeader()->e_phoff +
209-
(getHeader()->e_phnum * getHeader()->e_phentsize) >
210-
getBufSize())
208+
209+
uint64_t HeadersSize =
210+
(uint64_t)getHeader()->e_phnum * getHeader()->e_phentsize;
211+
uint64_t PhOff = getHeader()->e_phoff;
212+
if (PhOff + HeadersSize < PhOff || PhOff + HeadersSize > getBufSize())
211213
return createError("program headers are longer than binary of size " +
212214
Twine(getBufSize()) + ": e_phoff = 0x" +
213215
Twine::utohexstr(getHeader()->e_phoff) +
214216
", e_phnum = " + Twine(getHeader()->e_phnum) +
215217
", e_phentsize = " + Twine(getHeader()->e_phentsize));
216-
auto *Begin =
217-
reinterpret_cast<const Elf_Phdr *>(base() + getHeader()->e_phoff);
218+
219+
auto *Begin = reinterpret_cast<const Elf_Phdr *>(base() + PhOff);
218220
return makeArrayRef(Begin, Begin + getHeader()->e_phnum);
219221
}
220222

llvm/test/tools/llvm-readobj/ELF/gnu-phdrs.test

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,8 @@ ProgramHeaders:
356356
Offset: 0xAABBCCDDEEFF1122
357357

358358
## Check we report a warning when we are unable to read program headers.
359-
# RUN: yaml2obj --docnum=3 %s -o %t.phdr.err
359+
## Case A: the e_phentsize field is invalid.
360+
# RUN: yaml2obj --docnum=3 -DPHENTSIZE=1 %s -o %t.phdr.err
360361
# RUN: llvm-readelf --program-headers %t.phdr.err 2>&1 | \
361362
# RUN: FileCheck %s -DFILE=%t.phdr.err --check-prefix=WARN-PHENTSIZE
362363

@@ -373,11 +374,37 @@ FileHeader:
373374
Data: ELFDATA2LSB
374375
Type: ET_EXEC
375376
Machine: EM_X86_64
376-
EPhEntSize: 1
377+
EPhEntSize: [[PHENTSIZE=56]]
378+
EPhOff: [[PHOFF=64]]
377379
Sections:
378380
- Name: .foo
379381
Type: SHT_PROGBITS
380382
ProgramHeaders:
381383
- Type: PT_PHDR
382384
Sections:
383385
- Section: .foo
386+
387+
## Case B: the value of the e_phoff field is invalid.
388+
389+
## Check that we do not report a warning when the program header table ends right before the end of the file.
390+
## 0x160 + size of headers (56) == file size.
391+
# RUN: yaml2obj --docnum=3 -DPHOFF=0x160 %s -o %t.phdr.no.err2
392+
# RUN: llvm-readelf %t.phdr.no.err2 --program-headers 2>&1 | FileCheck %s --implicit-check-not=warning:
393+
394+
## Check we report a warning when e_phoff goes 1 byte past the end of the file.
395+
# RUN: yaml2obj --docnum=3 -DPHOFF=0x161 %s -o %t.phdr.err2
396+
# RUN: llvm-readelf --program-headers %t.phdr.err2 2>&1 | \
397+
# RUN: FileCheck %s -DFILE=%t.phdr.err2 --check-prefix=WARN-PHOFF -DOFF=0x161
398+
399+
# WARN-PHOFF: Program Headers:
400+
# WARN-PHOFF-NEXT: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
401+
# WARN-PHOFF-NEXT: warning: '[[FILE]]': unable to dump program headers: program headers are longer than binary of size 408: e_phoff = [[OFF]], e_phnum = 1, e_phentsize = 56
402+
# WARN-PHOFF: Section to Segment mapping:
403+
# WARN-PHOFF-NEXT: Segment Sections...
404+
# WARN-PHOFF-NEXT: warning: '[[FILE]]': can't read program headers to build section to segment mapping: program headers are longer than binary of size 408: e_phoff = [[OFF]], e_phnum = 1, e_phentsize = 56
405+
406+
## Check we report a warning when the value of e_phoff is so large that
407+
## e_phoff + e_phnum * e_phentsize > UINT64_MAX.
408+
# RUN: yaml2obj --docnum=3 -DPHOFF=0xffffffffffffffff %s -o %t.phdr.err3
409+
# RUN: llvm-readelf --program-headers %t.phdr.err3 2>&1 | \
410+
# RUN: FileCheck %s -DFILE=%t.phdr.err3 --check-prefix=WARN-PHOFF -DOFF=0xffffffffffffffff

0 commit comments

Comments
 (0)