summaryrefslogtreecommitdiff
path: root/lib_ppc/ppc_linux.c
diff options
context:
space:
mode:
authorMarian Balakowicz <m8@semihalf.com>2008-01-31 13:20:06 +0100
committerWolfgang Denk <wd@denx.de>2008-02-07 01:12:57 +0100
commit7582438c285bf0cef82909d0f232de64ec567a8a (patch)
tree7f4b2b137dd500e005d14f3594fefefe58ec64fd /lib_ppc/ppc_linux.c
parentf13e7b2e993c61fed1f607962501e051940d6e80 (diff)
downloadu-boot-imx-7582438c285bf0cef82909d0f232de64ec567a8a.zip
u-boot-imx-7582438c285bf0cef82909d0f232de64ec567a8a.tar.gz
u-boot-imx-7582438c285bf0cef82909d0f232de64ec567a8a.tar.bz2
[new uImage] Return error on image move/uncompress overwrites
Check for overwrites during image move/uncompress, return with error when the original image gets corrupted. Report clear message to the user and prevent further troubles when pointer to the corrupted images is passed to do_bootm_linux routine. Signed-off-by: Marian Balakowicz <m8@semihalf.com>
Diffstat (limited to 'lib_ppc/ppc_linux.c')
-rw-r--r--lib_ppc/ppc_linux.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/lib_ppc/ppc_linux.c b/lib_ppc/ppc_linux.c
index 0a625fc..3911687 100644
--- a/lib_ppc/ppc_linux.c
+++ b/lib_ppc/ppc_linux.c
@@ -23,6 +23,8 @@
* MA 02111-1307 USA
*/
+#define DEBUG
+
#include <common.h>
#include <watchdog.h>
#include <command.h>
@@ -259,11 +261,19 @@ do_bootm_linux(cmd_tbl_t *cmdtp, int flag,
of_data = (ulong)of_flat_tree;
#endif
} else if (image_check_magic (fdt_hdr)) {
+ ulong image_start, image_end;
+ ulong load_start, load_end;
+
printf ("## Flat Device Tree at %08lX\n", fdt_hdr);
print_image_hdr (fdt_hdr);
- if ((image_get_load (fdt_hdr) < image_get_image_end (fdt_hdr)) &&
- ((image_get_load (fdt_hdr) + image_get_data_size (fdt_hdr)) > (unsigned long)fdt_hdr)) {
+ image_start = (ulong)fdt_hdr;
+ image_end = image_get_image_end (fdt_hdr);
+
+ load_start = image_get_load (fdt_hdr);
+ load_end = load_start + image_get_data_size (fdt_hdr);
+
+ if ((load_start < image_end) && (load_end > image_start)) {
puts ("ERROR: fdt overwritten - "
"must RESET the board to recover.\n");
do_reset (cmdtp, flag, argc, argv);