diff options
author | George Rimar <grimar@accesssoftek.com> | 2016-10-04 10:23:07 +0000 |
---|---|---|
committer | George Rimar <grimar@accesssoftek.com> | 2016-10-04 10:23:07 +0000 |
commit | 422e47a9f50841a2a7c192ad9566bcbb19e16ccc (patch) | |
tree | e4e916c02d70649fd6b2e704c0344ab4babd9f95 | |
parent | 06b7a87298d2be1597b2c36ca3cd9ce2a381a140 (diff) | |
download | bcm5719-llvm-422e47a9f50841a2a7c192ad9566bcbb19e16ccc.tar.gz bcm5719-llvm-422e47a9f50841a2a7c192ad9566bcbb19e16ccc.zip |
[ELF] - Do not hang if broken object has option descriptor in .MIPS.options with size of zero.
Previously lld would hang in infinite loop in this case,
patch fixes the issue. Object was found during AFL run.
Differential revision: https://reviews.llvm.org/D25229
llvm-svn: 283208
-rw-r--r-- | lld/ELF/InputSection.cpp | 2 | ||||
-rw-r--r-- | lld/test/ELF/invalid/Inputs/mips-invalid-options-descriptor.elf | bin | 0 -> 480 bytes | |||
-rw-r--r-- | lld/test/ELF/invalid/mips-invalid-options-descriptor.s | 5 |
3 files changed, 7 insertions, 0 deletions
diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp index 3341a799f6e..8137b16035d 100644 --- a/lld/ELF/InputSection.cpp +++ b/lld/ELF/InputSection.cpp @@ -694,6 +694,8 @@ MipsOptionsInputSection<ELFT>::MipsOptionsInputSection(elf::ObjectFile<ELFT> *F, error(getName(this) + ": unsupported non-zero ri_gp_value"); break; } + if (!O->size) + fatal(getName(this) + ": zero option descriptor size"); D = D.slice(O->size); } } diff --git a/lld/test/ELF/invalid/Inputs/mips-invalid-options-descriptor.elf b/lld/test/ELF/invalid/Inputs/mips-invalid-options-descriptor.elf Binary files differnew file mode 100644 index 00000000000..85feeebc619 --- /dev/null +++ b/lld/test/ELF/invalid/Inputs/mips-invalid-options-descriptor.elf diff --git a/lld/test/ELF/invalid/mips-invalid-options-descriptor.s b/lld/test/ELF/invalid/mips-invalid-options-descriptor.s new file mode 100644 index 00000000000..2fd5bf5a513 --- /dev/null +++ b/lld/test/ELF/invalid/mips-invalid-options-descriptor.s @@ -0,0 +1,5 @@ +## mips-invalid-options-descriptor.elf has option descriptor in +## .MIPS.options with size of zero. +# RUN: not ld.lld %p/Inputs/mips-invalid-options-descriptor.elf -o %t2 2>&1 | \ +# RUN: FileCheck %s +# CHECK: zero option descriptor size |