Index: include/llvm/Object/ELF.h =================================================================== --- include/llvm/Object/ELF.h +++ include/llvm/Object/ELF.h @@ -137,8 +137,6 @@ const Elf_Rela *rela_begin(const Elf_Shdr *sec) const { if (sec->sh_entsize != sizeof(Elf_Rela)) report_fatal_error("Invalid relocation entry size"); - if (sec->sh_offset >= Buf.size()) - report_fatal_error("Invalid relocation entry offset"); return reinterpret_cast(base() + sec->sh_offset); } @@ -156,8 +154,6 @@ const Elf_Rel *rel_begin(const Elf_Shdr *sec) const { if (sec->sh_entsize != sizeof(Elf_Rel)) report_fatal_error("Invalid relocation entry size"); - if (sec->sh_offset >= Buf.size()) - report_fatal_error("Invalid relocation entry offset"); return reinterpret_cast(base() + sec->sh_offset); } @@ -385,6 +381,14 @@ DotShstrtab = *StringTableOrErr; } + for (const Elf_Shdr &Sec : sections()) { + if ((Sec.sh_offset > getBufSize()) || + (Sec.sh_offset + Sec.sh_size > getBufSize())) { + EC = object_error::parse_failed; + return; + } + } + EC = std::error_code(); } Index: test/Object/invalid.test =================================================================== --- test/Object/invalid.test +++ test/Object/invalid.test @@ -63,4 +63,10 @@ RUN: FileCheck --check-prefix=INVALID-RELOC-SH-OFFSET %s RUN: not llvm-readobj -r %p/Inputs/invalid-relocation-sec-sh_offset.elf-x86-64 2>&1 | \ RUN: FileCheck --check-prefix=INVALID-RELOC-SH-OFFSET %s -INVALID-RELOC-SH-OFFSET: Invalid relocation entry offset +INVALID-RELOC-SH-OFFSET: Invalid data was encountered while parsing the file + +RUN: not llvm-readobj -r %p/Inputs/invalid-relocation-sec-sh_size.elf-i386 2>&1 | \ +RUN: FileCheck --check-prefix=INVALID-RELOC-SH-SIZE %s +RUN: not llvm-readobj -r %p/Inputs/invalid-relocation-sec-sh_size.elf-x86-64 2>&1 | \ +RUN: FileCheck --check-prefix=INVALID-RELOC-SH-SIZE %s +INVALID-RELOC-SH-SIZE: Invalid data was encountered while parsing the file