[PATCH] D25365: [ELF] - Do not crash on invalid local symbol.
George Rimar via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 7 05:28:16 PDT 2016
grimar created this revision.
grimar added reviewers: ruiu, rafael, davide.
grimar added subscribers: llvm-commits, grimar, evgeny777.
I had a bunch of crashes during last AFL runs.
Problem is next. Object contains local symbol of type STT_NOTYPE
(it just should not be STT_FILE or STT_SECTION to crash).
Has section index greater than SHN_LORESERVE, so next code returns 0
template <class ELFT>
uint32_t ELFFileBase<ELFT>::getSectionIndex(const Elf_Sym &Sym) const {
...
if (I >= ELF::SHN_LORESERVE)
return 0;
return I;
}
Then DefinedRegular is created:
if (Sym->st_shndx == SHN_UNDEF)
return new (this->Alloc)
Undefined(Sym->st_name, Sym->st_other, Sym->getType(), this);
return new (this->Alloc) DefinedRegular<ELFT>(*Sym, Sec);
}
And finally code is crashes in shouldKeepInSymtab() because Sec is null there.
Patch fixes that. Since it is a crash issue and we did not had reports about that, I think fix is fine.
https://reviews.llvm.org/D25365
Files:
ELF/Writer.cpp
test/ELF/invalid/Inputs/local-symbols.elf
test/ELF/invalid/local-symbols.s
Index: test/ELF/invalid/local-symbols.s
===================================================================
--- test/ELF/invalid/local-symbols.s
+++ test/ELF/invalid/local-symbols.s
@@ -0,0 +1,3 @@
+## local-symbols.elf has invalid local symbol.
+# RUN: not ld.lld %p/Inputs/local-symbols.elf -o %t2 2>&1 | FileCheck %s
+# CHECK: object contains invalid symbols
Index: ELF/Writer.cpp
===================================================================
--- ELF/Writer.cpp
+++ ELF/Writer.cpp
@@ -308,7 +308,8 @@
}
template <class ELFT>
-static bool shouldKeepInSymtab(InputSectionBase<ELFT> *Sec, StringRef SymName,
+static bool shouldKeepInSymtab(elf::ObjectFile<ELFT> *F,
+ InputSectionBase<ELFT> *Sec, StringRef SymName,
const SymbolBody &B) {
if (B.isFile())
return false;
@@ -335,6 +336,9 @@
if (Config->Discard == DiscardPolicy::Locals)
return false;
+ if (!Sec)
+ fatal(getFilename(F) + ": object contains invalid symbols");
+
return !(Sec->getSectionHdr()->sh_flags & SHF_MERGE);
}
@@ -374,7 +378,7 @@
fatal(getFilename(F) + ": invalid symbol name offset");
StringRef SymName(StrTab.data() + B->getNameOffset());
InputSectionBase<ELFT> *Sec = DR->Section;
- if (!shouldKeepInSymtab<ELFT>(Sec, SymName, *B))
+ if (!shouldKeepInSymtab<ELFT>(F, Sec, SymName, *B))
continue;
++Out<ELFT>::SymTab->NumLocals;
if (Config->Relocatable)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D25365.73920.patch
Type: text/x-patch
Size: 1513 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161007/7d06dfd9/attachment.bin>
More information about the llvm-commits
mailing list