From 45cd3ec49e72c5474c695dedd83f6fc0638159bf Mon Sep 17 00:00:00 2001
From: Sergiusz Bazanski <q3k@q3k.org>
Date: Sat, 27 Jul 2019 01:45:29 +0200
Subject: [PATCH] l0der: fix relocation check

---
 epicardium/l0der/l0der.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/epicardium/l0der/l0der.c b/epicardium/l0der/l0der.c
index 0051988c..b10d4d51 100644
--- a/epicardium/l0der/l0der.c
+++ b/epicardium/l0der/l0der.c
@@ -273,6 +273,9 @@ static int _run_relocations(FIL *fp, void *load_addr, uint32_t image_start, uint
 	Elf32_Shdr shdr;
 	Elf32_Rel rel;
 
+	uint32_t load_start = image_start + (uint32_t)load_addr;
+	uint32_t load_limit = image_limit + (uint32_t)load_addr;
+
 	// Go through all relocation sections.
 	for (int i = 0; i < hdr->e_shnum; i++) {
 		uint32_t shdr_addr = hdr->e_shoff + (i * hdr->e_shentsize);
@@ -321,8 +324,9 @@ static int _run_relocations(FIL *fp, void *load_addr, uint32_t image_start, uint
 						return -ENOEXEC;
 					}
 					volatile uint32_t *addr = (uint32_t *)(rel.r_offset + load_addr);
-					if ((uint32_t)addr < image_start || (uint32_t)addr >= image_limit) {
-						LOG_ERR("l0der", "_run_relocations: R_ARM_RELATIVE address is outside image boundaries");
+					if ((uint32_t)addr < load_start || (uint32_t)addr >= load_limit) {
+						LOG_ERR("l0der", "_run_relocations: R_ARM_RELATIVE address (%08lx) is outside image boundaries",
+								(uint32_t)addr);
 						return -ENOEXEC;
 					}
 
-- 
GitLab