OSDN Git Service

Report errors an invalid virtual addresses.
authorRafael Espindola <rafael.espindola@gmail.com>
Mon, 20 Jul 2015 14:45:03 +0000 (14:45 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Mon, 20 Jul 2015 14:45:03 +0000 (14:45 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@242676 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Object/ELF.h
test/Object/Inputs/corrupt-invalid-virtual-addr.elf.x86-64 [new file with mode: 0755]
test/Object/corrupt.test

index 085595e..509355b 100644 (file)
@@ -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/test/Object/Inputs/corrupt-invalid-virtual-addr.elf.x86-64 b/test/Object/Inputs/corrupt-invalid-virtual-addr.elf.x86-64
new file mode 100755 (executable)
index 0000000..58d9959
Binary files /dev/null and b/test/Object/Inputs/corrupt-invalid-virtual-addr.elf.x86-64 differ
index 7c4b1c7..9b3daf7 100644 (file)
@@ -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