diff options
| author | Marian Balakowicz <m8@semihalf.com> | 2008-01-31 13:20:06 +0100 | 
|---|---|---|
| committer | Wolfgang Denk <wd@denx.de> | 2008-02-07 01:12:57 +0100 | 
| commit | 7582438c285bf0cef82909d0f232de64ec567a8a (patch) | |
| tree | 7f4b2b137dd500e005d14f3594fefefe58ec64fd /common/cmd_bootm.c | |
| parent | f13e7b2e993c61fed1f607962501e051940d6e80 (diff) | |
| download | olio-uboot-2014.01-7582438c285bf0cef82909d0f232de64ec567a8a.tar.xz olio-uboot-2014.01-7582438c285bf0cef82909d0f232de64ec567a8a.zip | |
[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 'common/cmd_bootm.c')
| -rw-r--r-- | common/cmd_bootm.c | 22 | 
1 files changed, 22 insertions, 0 deletions
| diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index 2d17bdd4f..f441e0e01 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -133,6 +133,10 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  	ulong		img_addr;  	ulong		os_data, os_len; +	ulong		image_start, image_end; +	ulong		load_start, load_end; + +  	if (argc < 2) {  		img_addr = load_addr;  	} else { @@ -234,6 +238,11 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  	dcache_disable();  #endif +	image_start = (ulong)hdr; +	image_end = image_get_image_end (hdr); +	load_start = image_get_load (hdr); +	load_end = 0; +  	switch (image_get_comp (hdr)) {  	case IH_COMP_NONE:  		if (image_get_load (hdr) == img_addr) { @@ -244,6 +253,7 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  			memmove_wd ((void *)image_get_load (hdr),  				   (void *)os_data, os_len, CHUNKSZ); +			load_end = load_start + os_len;  			puts("OK\n");  		}  		break; @@ -255,6 +265,8 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  			show_boot_progress (-6);  			do_reset (cmdtp, flag, argc, argv);  		} + +		load_end = load_start + os_len;  		break;  #ifdef CONFIG_BZIP2  	case IH_COMP_BZIP2: @@ -272,6 +284,8 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  			show_boot_progress (-6);  			do_reset (cmdtp, flag, argc, argv);  		} + +		load_end = load_start + unc_len;  		break;  #endif /* CONFIG_BZIP2 */  	default: @@ -284,6 +298,14 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  	puts ("OK\n");  	show_boot_progress (7); +	if ((load_start < image_end) && (load_end > image_start)) { +		debug ("image_start = 0x%lX, image_end = 0x%lx\n", image_start, image_end); +		debug ("load_start = 0x%lx, load_end = 0x%lx\n", load_start, load_end); + +		puts ("ERROR: image overwritten - must RESET the board to recover.\n"); +		do_reset (cmdtp, flag, argc, argv); +	} +  	switch (image_get_type (hdr)) {  	case IH_TYPE_STANDALONE:  		if (iflag) |