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