[ELF] - Fixed crash on invalid input.

I took the input from https://llvm.org/bugs/show_bug.cgi?id=30540, it was
"id_000000,sig_11,src_000000,op_flip1,pos_98"

File contains invalid symbol name offset (too large) and lld just crashes,
patch fixes the issue.

Differential revision: https://reviews.llvm.org/D24970

llvm-svn: 282709
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index 9ac5135..7774507 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -380,7 +380,7 @@
   if (!Out<ELFT>::SymTab)
     return;
   for (elf::ObjectFile<ELFT> *F : Symtab<ELFT>::X->getObjectFiles()) {
-    const char *StrTab = F->getStringTable().data();
+    StringRef StrTab = F->getStringTable();
     for (SymbolBody *B : F->getLocalSymbols()) {
       auto *DR = dyn_cast<DefinedRegular<ELFT>>(B);
       // No reason to keep local undefined symbol in symtab.
@@ -388,7 +388,9 @@
         continue;
       if (!includeInSymtab<ELFT>(*B))
         continue;
-      StringRef SymName(StrTab + B->getNameOffset());
+      if (B->getNameOffset() >= StrTab.size())
+        fatal(getFilename(F) + ": invalid symbol name offset");
+      StringRef SymName(StrTab.data() + B->getNameOffset());
       InputSectionBase<ELFT> *Sec = DR->Section;
       if (!shouldKeepInSymtab<ELFT>(Sec, SymName, *B))
         continue;
diff --git a/lld/test/ELF/invalid/Inputs/symbol-name-offset.elf b/lld/test/ELF/invalid/Inputs/symbol-name-offset.elf
new file mode 100644
index 0000000..8b8abde
--- /dev/null
+++ b/lld/test/ELF/invalid/Inputs/symbol-name-offset.elf
Binary files differ
diff --git a/lld/test/ELF/invalid/symbol-name.s b/lld/test/ELF/invalid/symbol-name.s
new file mode 100644
index 0000000..8daee1a
--- /dev/null
+++ b/lld/test/ELF/invalid/symbol-name.s
@@ -0,0 +1,7 @@
+# REQUIRES: x86
+
+## symbol-name-offset.elf contains symbol with invalid (too large)
+## st_name value.
+# RUN: not ld.lld %S/Inputs/symbol-name-offset.elf \
+# RUN:   -o %t 2>&1 | FileCheck %s
+# CHECK: invalid symbol name offset