[ELF] - Do not crash on invalid size of dynamic section.
Previously if sh_size of dynamic section was broken, lld may crash. Or even may not crash if used 32 bits host. (then value may be truncated to 32 bits when doing pointer arithmetic and could be just zero). Patch fixes the issue. Differential revision: https://reviews.llvm.org/D25327 llvm-svn: 283533
This commit is contained in:
parent
b7aec33125
commit
53cf2a8112
|
@ -523,11 +523,11 @@ template <class ELFT> void SharedFile<ELFT>::parseSoName() {
|
|||
|
||||
if (!DynamicSec)
|
||||
return;
|
||||
auto *Begin =
|
||||
reinterpret_cast<const Elf_Dyn *>(Obj.base() + DynamicSec->sh_offset);
|
||||
const Elf_Dyn *End = Begin + DynamicSec->sh_size / sizeof(Elf_Dyn);
|
||||
|
||||
for (const Elf_Dyn &Dyn : make_range(Begin, End)) {
|
||||
ArrayRef<Elf_Dyn> Arr =
|
||||
check(Obj.template getSectionContentsAsArray<Elf_Dyn>(DynamicSec),
|
||||
getFilename(this) + ": getSectionContentsAsArray failed");
|
||||
for (const Elf_Dyn &Dyn : Arr) {
|
||||
if (Dyn.d_tag == DT_SONAME) {
|
||||
uintX_t Val = Dyn.getVal();
|
||||
if (Val >= this->StringTable.size())
|
||||
|
|
Binary file not shown.
|
@ -0,0 +1,4 @@
|
|||
## dynamic-section-sh_size.elf has incorrect sh_size of dynamic section.
|
||||
# RUN: not ld.lld %p/Inputs/dynamic-section-sh_size.elf -o %t2 2>&1 | \
|
||||
# RUN: FileCheck %s
|
||||
# CHECK: getSectionContentsAsArray failed: Invalid data was encountered while parsing the file
|
Loading…
Reference in New Issue