[lld] r283533 - [ELF] - Do not crash on invalid size of dynamic section.
George Rimar via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 7 02:01:04 PDT 2016
Author: grimar
Date: Fri Oct 7 04:01:04 2016
New Revision: 283533
URL: http://llvm.org/viewvc/llvm-project?rev=283533&view=rev
Log:
[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
Added:
lld/trunk/test/ELF/invalid/Inputs/dynamic-section-sh_size.elf (with props)
lld/trunk/test/ELF/invalid/dynamic-section-size.s
Modified:
lld/trunk/ELF/InputFiles.cpp
Modified: lld/trunk/ELF/InputFiles.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=283533&r1=283532&r2=283533&view=diff
==============================================================================
--- lld/trunk/ELF/InputFiles.cpp (original)
+++ lld/trunk/ELF/InputFiles.cpp Fri Oct 7 04:01:04 2016
@@ -523,11 +523,11 @@ template <class ELFT> void SharedFile<EL
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())
Added: lld/trunk/test/ELF/invalid/Inputs/dynamic-section-sh_size.elf
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/invalid/Inputs/dynamic-section-sh_size.elf?rev=283533&view=auto
==============================================================================
Binary file - no diff available.
Propchange: lld/trunk/test/ELF/invalid/Inputs/dynamic-section-sh_size.elf
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: lld/trunk/test/ELF/invalid/dynamic-section-size.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/invalid/dynamic-section-size.s?rev=283533&view=auto
==============================================================================
--- lld/trunk/test/ELF/invalid/dynamic-section-size.s (added)
+++ lld/trunk/test/ELF/invalid/dynamic-section-size.s Fri Oct 7 04:01:04 2016
@@ -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
More information about the llvm-commits
mailing list