summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorge Rimar <grimar@accesssoftek.com>2016-10-04 10:23:07 +0000
committerGeorge Rimar <grimar@accesssoftek.com>2016-10-04 10:23:07 +0000
commit422e47a9f50841a2a7c192ad9566bcbb19e16ccc (patch)
treee4e916c02d70649fd6b2e704c0344ab4babd9f95
parent06b7a87298d2be1597b2c36ca3cd9ce2a381a140 (diff)
downloadbcm5719-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.cpp2
-rw-r--r--lld/test/ELF/invalid/Inputs/mips-invalid-options-descriptor.elfbin0 -> 480 bytes
-rw-r--r--lld/test/ELF/invalid/mips-invalid-options-descriptor.s5
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
new file mode 100644
index 00000000000..85feeebc619
--- /dev/null
+++ b/lld/test/ELF/invalid/Inputs/mips-invalid-options-descriptor.elf
Binary files differ
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
OpenPOWER on IntegriCloud