summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/Object/ELF.h8
-rwxr-xr-xllvm/test/Object/Inputs/corrupt-invalid-virtual-addr.elf.x86-64bin0 -> 1720 bytes
-rw-r--r--llvm/test/Object/corrupt.test6
3 files changed, 12 insertions, 2 deletions
diff --git a/llvm/include/llvm/Object/ELF.h b/llvm/include/llvm/Object/ELF.h
index 085595ed621..509355b105d 100644
--- a/llvm/include/llvm/Object/ELF.h
+++ b/llvm/include/llvm/Object/ELF.h
@@ -738,9 +738,13 @@ template <class ELFT> void ELFFile<ELFT>::scanDynamicTable() {
const Elf_Phdr **I = std::upper_bound(
LoadSegments.begin(), LoadSegments.end(), VAddr, compareAddr<ELFT>);
if (I == LoadSegments.begin())
- return nullptr;
+ report_fatal_error("Virtual address is not in any segment");
--I;
- return this->base() + (*I)->p_offset + (VAddr - (*I)->p_vaddr);
+ const Elf_Phdr &Phdr = **I;
+ uint64_t Delta = VAddr - Phdr.p_vaddr;
+ if (Delta >= Phdr.p_filesz)
+ report_fatal_error("Virtual address is not in any segment");
+ return this->base() + Phdr.p_offset + Delta;
};
for (Elf_Dyn_Iter DynI = dynamic_table_begin(), DynE = dynamic_table_end();
diff --git a/llvm/test/Object/Inputs/corrupt-invalid-virtual-addr.elf.x86-64 b/llvm/test/Object/Inputs/corrupt-invalid-virtual-addr.elf.x86-64
new file mode 100755
index 00000000000..58d995933ec
--- /dev/null
+++ b/llvm/test/Object/Inputs/corrupt-invalid-virtual-addr.elf.x86-64
Binary files differ
diff --git a/llvm/test/Object/corrupt.test b/llvm/test/Object/corrupt.test
index 7c4b1c775ec..9b3daf7b4cf 100644
--- a/llvm/test/Object/corrupt.test
+++ b/llvm/test/Object/corrupt.test
@@ -37,3 +37,9 @@ RUN: %p/Inputs/corrupt-invalid-phentsize.elf.x86-64 2>&1 | \
RUN: FileCheck --check-prefix=PHENTSIZE %s
PHENTSIZE: Invalid program header size
+
+RUN: not llvm-readobj -dynamic-table \
+RUN: %p/Inputs/corrupt-invalid-virtual-addr.elf.x86-64 2>&1 | \
+RUN: FileCheck --check-prefix=VIRTADDR %s
+
+VIRTADDR: Virtual address is not in any segment
OpenPOWER on IntegriCloud