diff options
Diffstat (limited to 'llvm/include/llvm/Object/ELF.h')
-rw-r--r-- | llvm/include/llvm/Object/ELF.h | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/llvm/include/llvm/Object/ELF.h b/llvm/include/llvm/Object/ELF.h index 28b00c8413de..42c5b67ac3fa 100644 --- a/llvm/include/llvm/Object/ELF.h +++ b/llvm/include/llvm/Object/ELF.h @@ -402,12 +402,17 @@ ELFFile<ELFT>::getSectionContentsAsArray(const Elf_Shdr *Sec) const { " has an invalid sh_size (" + Twine(Size) + ") which is not a multiple of its sh_entsize (" + Twine(Sec->sh_entsize) + ")"); - if ((std::numeric_limits<uintX_t>::max() - Offset < Size) || - Offset + Size > Buf.size()) + if (std::numeric_limits<uintX_t>::max() - Offset < Size) return createError("section " + getSecIndexForError(this, Sec) + " has a sh_offset (0x" + Twine::utohexstr(Offset) + - ") + sh_size (0x" + Twine(Size) + + ") + sh_size (0x" + Twine::utohexstr(Size) + ") that cannot be represented"); + if (Offset + Size > Buf.size()) + return createError("section " + getSecIndexForError(this, Sec) + + " has a sh_offset (0x" + Twine::utohexstr(Offset) + + ") + sh_size (0x" + Twine::utohexstr(Size) + + ") that is greater than the file size (0x" + + Twine::utohexstr(Buf.size()) + ")"); if (Offset % alignof(T)) // TODO: this error is untested. @@ -641,11 +646,12 @@ ELFFile<ELFT>::getSHNDXTable(const Elf_Shdr &Section, SymTable.sh_type) + " section (expected SHT_SYMTAB/SHT_DYNSYM)"); - if (V.size() != (SymTable.sh_size / sizeof(Elf_Sym))) - return createError("SHT_SYMTAB_SHNDX section has sh_size (" + - Twine(SymTable.sh_size) + - ") which is not equal to the number of symbols (" + - Twine(V.size()) + ")"); + uint64_t Syms = SymTable.sh_size / sizeof(Elf_Sym); + if (V.size() != Syms) + return createError("SHT_SYMTAB_SHNDX has " + Twine(V.size()) + + " entries, but the symbol table associated has " + + Twine(Syms)); + return V; } |