Index: lld/trunk/ELF/Writer.cpp =================================================================== --- lld/trunk/ELF/Writer.cpp +++ lld/trunk/ELF/Writer.cpp @@ -380,7 +380,7 @@ if (!Out::SymTab) return; for (elf::ObjectFile *F : Symtab::X->getObjectFiles()) { - const char *StrTab = F->getStringTable().data(); + StringRef StrTab = F->getStringTable(); for (SymbolBody *B : F->getLocalSymbols()) { auto *DR = dyn_cast>(B); // No reason to keep local undefined symbol in symtab. @@ -388,7 +388,9 @@ continue; if (!includeInSymtab(*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 *Sec = DR->Section; if (!shouldKeepInSymtab(Sec, SymName, *B)) continue; Index: lld/trunk/test/ELF/invalid/symbol-name.s =================================================================== --- lld/trunk/test/ELF/invalid/symbol-name.s +++ lld/trunk/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