summaryrefslogtreecommitdiff
path: root/common/spl
diff options
context:
space:
mode:
authorMarek Vasut <marex@denx.de>2023-05-29 15:04:06 +0300
committerTom Rini <trini@konsulko.com>2023-06-24 20:47:00 +0300
commit77aed22b48ab789491cf96cd2ba3128124e51eee (patch)
treeff2409d6742312abfeb818ac0b81b582d012bca8 /common/spl
parent68dcbdd594d4172632ca6b122c56ec87ca551cf4 (diff)
downloadu-boot-77aed22b48ab789491cf96cd2ba3128124e51eee.tar.xz
spl: spl_legacy: Add extra address checks
Check whether the loaded image or entry point does not overlap SPL. Signed-off-by: Marek Vasut <marex@denx.de>
Diffstat (limited to 'common/spl')
-rw-r--r--common/spl/spl_legacy.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/common/spl/spl_legacy.c b/common/spl/spl_legacy.c
index 16851c55eb..d34bc5492e 100644
--- a/common/spl/spl_legacy.c
+++ b/common/spl/spl_legacy.c
@@ -7,6 +7,7 @@
#include <image.h>
#include <log.h>
#include <malloc.h>
+#include <asm/sections.h>
#include <spl.h>
#include <lzma/LzmaTypes.h>
@@ -15,6 +16,22 @@
#define LZMA_LEN (1 << 20)
+static void spl_parse_legacy_validate(uintptr_t start, uintptr_t size)
+{
+ uintptr_t spl_start = (uintptr_t)_start;
+ uintptr_t spl_end = (uintptr_t)__bss_end;
+ uintptr_t end = start + size;
+
+ if ((start >= spl_start && start < spl_end) ||
+ (end > spl_start && end <= spl_end) ||
+ (start < spl_start && end >= spl_end) ||
+ (start > end && end > spl_start))
+ panic("SPL: Image overlaps SPL\n");
+
+ if (size > CONFIG_SYS_BOOTM_LEN)
+ panic("SPL: Image too large\n");
+}
+
int spl_parse_legacy_header(struct spl_image_info *spl_image,
const struct legacy_img_hdr *header)
{
@@ -58,6 +75,9 @@ int spl_parse_legacy_header(struct spl_image_info *spl_image,
"payload image: %32s load addr: 0x%lx size: %d\n",
spl_image->name, spl_image->load_addr, spl_image->size);
+ spl_parse_legacy_validate(spl_image->load_addr, spl_image->size);
+ spl_parse_legacy_validate(spl_image->entry_point, 0);
+
return 0;
}