summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorge Rimar <grimar@accesssoftek.com>2016-10-07 15:16:27 +0000
committerGeorge Rimar <grimar@accesssoftek.com>2016-10-07 15:16:27 +0000
commit9397cf953cd02ede85e84b37360ad87748fcefe0 (patch)
treef408df3e7490578f7e0726ee02a20d0c83855f29
parente513e17b238298b79c1ea055d37ab91bdcef6dd9 (diff)
downloadbcm5719-llvm-9397cf953cd02ede85e84b37360ad87748fcefe0.tar.gz
bcm5719-llvm-9397cf953cd02ede85e84b37360ad87748fcefe0.zip
[ELF] - Fixed assert fail when symbol table has zero sh_info value.
When sh_info of sumbol table value was set to zero, lld was asserting. Patch fixes the issue. Differential revision: https://reviews.llvm.org/D25016 llvm-svn: 283562
-rw-r--r--lld/ELF/InputFiles.cpp2
-rw-r--r--lld/test/ELF/invalid/Inputs/symtab-sh_info2.elfbin0 -> 470 bytes
-rw-r--r--lld/test/ELF/invalid/symtab-sh-info.s4
3 files changed, 5 insertions, 1 deletions
diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp
index dda18aa8a4c..d9630790e2c 100644
--- a/lld/ELF/InputFiles.cpp
+++ b/lld/ELF/InputFiles.cpp
@@ -81,7 +81,7 @@ typename ELFT::SymRange ELFFileBase<ELFT>::getElfSymbols(bool OnlyGlobals) {
Elf_Sym_Range Syms = ELFObj.symbols(Symtab);
uint32_t NumSymbols = std::distance(Syms.begin(), Syms.end());
uint32_t FirstNonLocal = Symtab->sh_info;
- if (FirstNonLocal > NumSymbols)
+ if (FirstNonLocal == 0 || FirstNonLocal > NumSymbols)
fatal(getFilename(this) + ": invalid sh_info in symbol table");
if (OnlyGlobals)
diff --git a/lld/test/ELF/invalid/Inputs/symtab-sh_info2.elf b/lld/test/ELF/invalid/Inputs/symtab-sh_info2.elf
new file mode 100644
index 00000000000..4fea12cf203
--- /dev/null
+++ b/lld/test/ELF/invalid/Inputs/symtab-sh_info2.elf
Binary files differ
diff --git a/lld/test/ELF/invalid/symtab-sh-info.s b/lld/test/ELF/invalid/symtab-sh-info.s
new file mode 100644
index 00000000000..727639f4910
--- /dev/null
+++ b/lld/test/ELF/invalid/symtab-sh-info.s
@@ -0,0 +1,4 @@
+## sh_info contains zero value. First entry in a symbol table is always completely zeroed,
+## so sh_info should be at least 1 in a valid ELF.
+# RUN: not ld.lld %p/Inputs/symtab-sh_info2.elf -o %t2 2>&1 | FileCheck %s
+# CHECK: invalid sh_info in symbol table
OpenPOWER on IntegriCloud