<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>