summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/InputFiles.cpp5
-rw-r--r--lld/test/elf2/Inputs/invalid-symtab-sh_info.elfbin0 -> 512 bytes
-rw-r--r--lld/test/elf2/Inputs/local.s1
-rw-r--r--lld/test/elf2/invalid-elf.test4
-rw-r--r--lld/test/elf2/local.s10
5 files changed, 19 insertions, 1 deletions
diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp
index ef4333ff9d8..9dcd2faede8 100644
--- a/lld/ELF/InputFiles.cpp
+++ b/lld/ELF/InputFiles.cpp
@@ -59,8 +59,11 @@ template <class ELFT> void elf2::ObjectFile<ELFT>::initializeSymbols() {
StringRef StringTable = *StringTableOrErr;
Elf_Sym_Range Syms = ELFObj->symbols(Symtab);
- Syms = Elf_Sym_Range(Syms.begin() + 1, Syms.end());
auto NumSymbols = std::distance(Syms.begin(), Syms.end());
+ uint32_t FirstNonLocal = Symtab->sh_info;
+ if (FirstNonLocal > NumSymbols)
+ error("Invalid sh_info in symbol table");
+ Syms = llvm::make_range(Syms.begin() + FirstNonLocal, Syms.end());
SymbolBodies.reserve(NumSymbols);
for (const Elf_Sym &Sym : Syms)
SymbolBodies.push_back(createSymbolBody(StringTable, &Sym));
diff --git a/lld/test/elf2/Inputs/invalid-symtab-sh_info.elf b/lld/test/elf2/Inputs/invalid-symtab-sh_info.elf
new file mode 100644
index 00000000000..aa63d582d75
--- /dev/null
+++ b/lld/test/elf2/Inputs/invalid-symtab-sh_info.elf
Binary files differ
diff --git a/lld/test/elf2/Inputs/local.s b/lld/test/elf2/Inputs/local.s
new file mode 100644
index 00000000000..a5c4ffc9952
--- /dev/null
+++ b/lld/test/elf2/Inputs/local.s
@@ -0,0 +1 @@
+local:
diff --git a/lld/test/elf2/invalid-elf.test b/lld/test/elf2/invalid-elf.test
index 11e76375d98..95fd67164d5 100644
--- a/lld/test/elf2/invalid-elf.test
+++ b/lld/test/elf2/invalid-elf.test
@@ -5,3 +5,7 @@ INVALID-DATA-ENC: Invalid data encoding
RUN: not lld -flavor gnu2 %p/Inputs/invalid-file-class.elf -o %t2 2>&1 | \
RUN: FileCheck --check-prefix=INVALID-FILE-CLASS %s
INVALID-FILE-CLASS: Invalid file class
+
+RUN: not lld -flavor gnu2 %p/Inputs/invalid-symtab-sh_info.elf -o %t2 2>&1 | \
+RUN: FileCheck --check-prefix=INVALID-SYMTAB-SHINFO %s
+INVALID-SYMTAB-SHINFO: Invalid sh_info in symbol table
diff --git a/lld/test/elf2/local.s b/lld/test/elf2/local.s
new file mode 100644
index 00000000000..295ff614547
--- /dev/null
+++ b/lld/test/elf2/local.s
@@ -0,0 +1,10 @@
+// RUN: llvm-mc -filetype=obj -triple=i686-unknown-linux %s -o %t
+// RUN: llvm-mc -filetype=obj -triple=i686-unknown-linux %p/Inputs/local.s -o %t2
+// RUN: lld -flavor gnu2 %t %t2 -o %t3
+// REQUIRES: x86
+
+.globl _start
+_start:
+ nop
+
+local:
OpenPOWER on IntegriCloud