<div dir="ltr">LGTM</div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Apr 7, 2015 at 7:40 AM, Adhemerval Zanella <span dir="ltr"><<a href="mailto:adhemerval.zanella@linaro.org" target="_blank">adhemerval.zanella@linaro.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi ruiu, shankar.easwaran,<br>
<br>
Hi ruiu, shankarke,<br>
<br>
This is re-post of a previous attempt.  This patch adds R_AARCH64_ADR_GOT_PAGE overflow and R_AARCH64_LD64_GOT_LO12_NC unaligned value checks.<br>
<br>
<a href="http://reviews.llvm.org/D8867" target="_blank">http://reviews.llvm.org/D8867</a><br>
<br>
Files:<br>
  lib/ReaderWriter/ELF/AArch64/AArch64RelocationHandler.cpp<br>
  lib/ReaderWriter/ELF/TargetHandler.h<br>
<br>
Index: lib/ReaderWriter/ELF/AArch64/AArch64RelocationHandler.cpp<br>
===================================================================<br>
--- lib/ReaderWriter/ELF/AArch64/AArch64RelocationHandler.cpp<br>
+++ lib/ReaderWriter/ELF/AArch64/AArch64RelocationHandler.cpp<br>
@@ -247,10 +247,12 @@<br>
   write32le(location, result | read32le(location));<br>
 }<br>
<br>
-static void relocR_AARCH64_ADR_GOT_PAGE(uint8_t *location, uint64_t P,<br>
+static std::error_code relocR_AARCH64_ADR_GOT_PAGE(uint8_t *location, uint64_t P,<br>
                                         uint64_t S, int64_t A) {<br>
   uint64_t result = PAGE(S + A) - PAGE(P);<br>
-  result >>= 12;<br>
+  if (!isInt<32>(result))<br>
+    return make_out_of_range_reloc_error();<br>
+  result = (result >> 12) & 0x3FFFF;<br>
   uint32_t immlo = result & 0x3;<br>
   uint32_t immhi = result & 0x1FFFFC;<br>
   immlo = immlo << 29;<br>
@@ -263,20 +265,23 @@<br>
         llvm::dbgs() << " immlo: " << Twine::utohexstr(immlo);<br>
         llvm::dbgs() << " result: " << Twine::utohexstr(result) << "\n");<br>
   write32le(location, immlo | immhi | read32le(location));<br>
+  return std::error_code();<br>
 }<br>
<br>
 // R_AARCH64_LD64_GOT_LO12_NC<br>
-static void relocR_AARCH64_LD64_GOT_LO12_NC(uint8_t *location, uint64_t P,<br>
+static std::error_code relocR_AARCH64_LD64_GOT_LO12_NC(uint8_t *location, uint64_t P,<br>
                                             uint64_t S, int64_t A) {<br>
   int32_t result = S + A;<br>
-  DEBUG(llvm::dbgs() << "\t\tHandle " << LLVM_FUNCTION_NAME << " -";<br>
-        llvm::dbgs() << " S: " << Twine::utohexstr(S);<br>
+  DEBUG(llvm::dbgs() << " S: " << Twine::utohexstr(S);<br>
         llvm::dbgs() << " A: " << Twine::utohexstr(A);<br>
         llvm::dbgs() << " P: " << Twine::utohexstr(P);<br>
         llvm::dbgs() << " result: " << Twine::utohexstr(result) << "\n");<br>
+  if ((result & 0x7) != 0)<br>
+    return make_unaligned_range_reloc_error();<br>
   result &= 0xFF8;<br>
   result <<= 7;<br>
   write32le(location, result | read32le(location));<br>
+  return std::error_code();<br>
 }<br>
<br>
 // ADD_AARCH64_GOTRELINDEX<br>
@@ -408,11 +413,9 @@<br>
     relocR_AARCH64_CONDBR19(loc, reloc, target, addend);<br>
     break;<br>
   case R_AARCH64_ADR_GOT_PAGE:<br>
-    relocR_AARCH64_ADR_GOT_PAGE(loc, reloc, target, addend);<br>
-    break;<br>
+    return relocR_AARCH64_ADR_GOT_PAGE(loc, reloc, target, addend);<br>
   case R_AARCH64_LD64_GOT_LO12_NC:<br>
-    relocR_AARCH64_LD64_GOT_LO12_NC(loc, reloc, target, addend);<br>
-    break;<br>
+    return relocR_AARCH64_LD64_GOT_LO12_NC(loc, reloc, target, addend);<br>
   case R_AARCH64_LDST8_ABS_LO12_NC:<br>
     relocR_AARCH64_LDST8_ABS_LO12_NC(loc, reloc, target, addend);<br>
     break;<br>
Index: lib/ReaderWriter/ELF/TargetHandler.h<br>
===================================================================<br>
--- lib/ReaderWriter/ELF/TargetHandler.h<br>
+++ lib/ReaderWriter/ELF/TargetHandler.h<br>
@@ -25,6 +25,10 @@<br>
   return make_dynamic_error_code(Twine("Relocation out of range"));<br>
 }<br>
<br>
+inline std::error_code make_unaligned_range_reloc_error() {<br>
+  return make_dynamic_error_code(Twine("Relocation not aligned"));<br>
+}<br>
+<br>
 } // end namespace elf<br>
 } // end namespace lld<br>
<br>
EMAIL PREFERENCES<br>
  <a href="http://reviews.llvm.org/settings/panel/emailpreferences/" target="_blank">http://reviews.llvm.org/settings/panel/emailpreferences/</a><br>
</blockquote></div><br></div>