summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorTero Kristo <t-kristo@ti.com>2020-06-12 15:41:20 +0300
committerTom Rini <trini@konsulko.com>2020-07-17 15:51:01 +0300
commitfbde7589ce3049318a0e9495db72472af03704af (patch)
tree21643da4348e8bc037e1cefe973400d8e3733c63 /common
parent19c6808d87de3a9d8889a5881efc9467d3b50826 (diff)
downloadu-boot-fbde7589ce3049318a0e9495db72472af03704af.tar.xz
common: bootm: add checks to verify if ramdisk / fdtimage overlaps OS image
These cases are typically fatal and are difficult to debug for random users. Add checks for detecting overlapping images and abort if overlap is detected. Signed-off-by: Tero Kristo <t-kristo@ti.com>
Diffstat (limited to 'common')
-rw-r--r--common/bootm.c29
-rw-r--r--common/bootm_os.c4
2 files changed, 29 insertions, 4 deletions
diff --git a/common/bootm.c b/common/bootm.c
index 2ed7521520..247b600d9c 100644
--- a/common/bootm.c
+++ b/common/bootm.c
@@ -228,6 +228,8 @@ static int bootm_find_os(struct cmd_tbl *cmdtp, int flag, int argc,
* @flag: Ignored Argument
* @argc: command argument count
* @argv: command argument list
+ * @start: OS image start address
+ * @size: OS image size
*
* boot_find_images() will attempt to load an available ramdisk,
* flattened device tree, as well as specifically marked
@@ -239,7 +241,8 @@ static int bootm_find_os(struct cmd_tbl *cmdtp, int flag, int argc,
* 0, if all existing images were loaded correctly
* 1, if an image is found but corrupted, or invalid
*/
-int bootm_find_images(int flag, int argc, char *const argv[])
+int bootm_find_images(int flag, int argc, char *const argv[], ulong start,
+ ulong size)
{
int ret;
@@ -251,6 +254,16 @@ int bootm_find_images(int flag, int argc, char *const argv[])
return 1;
}
+ /* check if ramdisk overlaps OS image */
+ if (images.rd_start && (((ulong)images.rd_start >= start &&
+ (ulong)images.rd_start <= start + size) ||
+ ((ulong)images.rd_end >= start &&
+ (ulong)images.rd_end <= start + size))) {
+ printf("ERROR: RD image overlaps OS image (OS=0x%lx..0x%lx)\n",
+ start, start + size);
+ return 1;
+ }
+
#if IMAGE_ENABLE_OF_LIBFDT
/* find flattened device tree */
ret = boot_get_fdt(flag, argc, argv, IH_ARCH_DEFAULT, &images,
@@ -259,6 +272,18 @@ int bootm_find_images(int flag, int argc, char *const argv[])
puts("Could not find a valid device tree\n");
return 1;
}
+
+ /* check if FDT overlaps OS image */
+ if (images.ft_addr &&
+ (((ulong)images.ft_addr >= start &&
+ (ulong)images.ft_addr <= start + size) ||
+ ((ulong)images.ft_addr + images.ft_len >= start &&
+ (ulong)images.ft_addr + images.ft_len <= start + size))) {
+ printf("ERROR: FDT image overlaps OS image (OS=0x%lx..0x%lx)\n",
+ start, start + size);
+ return 1;
+ }
+
if (CONFIG_IS_ENABLED(CMD_FDT))
set_working_fdt_addr(map_to_sysmem(images.ft_addr));
#endif
@@ -294,7 +319,7 @@ static int bootm_find_other(struct cmd_tbl *cmdtp, int flag, int argc,
(images.os.type == IH_TYPE_MULTI)) &&
(images.os.os == IH_OS_LINUX ||
images.os.os == IH_OS_VXWORKS))
- return bootm_find_images(flag, argc, argv);
+ return bootm_find_images(flag, argc, argv, 0, 0);
return 0;
}
diff --git a/common/bootm_os.c b/common/bootm_os.c
index 55296483f7..a3c360e80a 100644
--- a/common/bootm_os.c
+++ b/common/bootm_os.c
@@ -495,7 +495,7 @@ static int do_bootm_tee(int flag, int argc, char *const argv[],
return ret;
/* Locate FDT etc */
- ret = bootm_find_images(flag, argc, argv);
+ ret = bootm_find_images(flag, argc, argv, 0, 0);
if (ret)
return ret;
@@ -516,7 +516,7 @@ static int do_bootm_efi(int flag, int argc, char *const argv[],
return 0;
/* Locate FDT, if provided */
- ret = bootm_find_images(flag, argc, argv);
+ ret = bootm_find_images(flag, argc, argv, 0, 0);
if (ret)
return ret;