diff options
| author | Stefan Roese <sr@denx.de> | 2005-10-08 10:19:07 +0200 | 
|---|---|---|
| committer | Stefan Roese <sr@denx.de> | 2005-10-08 10:19:07 +0200 | 
| commit | c29ab9d71d229ee94e8263845ea54222005e3880 (patch) | |
| tree | 60bf999c52c3e7bce7320d4ac82a7a0d27c3096c /common/cmd_bmp.c | |
| parent | bccae9039e59ac09a776429119389a6a4e679fd7 (diff) | |
| download | olio-uboot-2014.01-c29ab9d71d229ee94e8263845ea54222005e3880.tar.xz olio-uboot-2014.01-c29ab9d71d229ee94e8263845ea54222005e3880.zip | |
Fix gzip bmp support (test if malloc fails, warning when truncated).
Increase CFG_VIDEO_LOGO_MAX_SIZE on HH405 board.
Patch by Stefan Roese, 08 Oct 2005
Diffstat (limited to 'common/cmd_bmp.c')
| -rw-r--r-- | common/cmd_bmp.c | 52 | 
1 files changed, 52 insertions, 0 deletions
| diff --git a/common/cmd_bmp.c b/common/cmd_bmp.c index daa54e776..ad412c81e 100644 --- a/common/cmd_bmp.c +++ b/common/cmd_bmp.c @@ -29,12 +29,15 @@  #include <bmp_layout.h>  #include <command.h>  #include <asm/byteorder.h> +#include <malloc.h>  #if (CONFIG_COMMANDS & CFG_CMD_BMP)  static int bmp_info (ulong addr);  static int bmp_display (ulong addr, int x, int y); +int gunzip(void *, int, unsigned char *, unsigned long *); +  /*   * Subroutine:  do_bmp   * @@ -100,15 +103,64 @@ U_BOOT_CMD(  static int bmp_info(ulong addr)  {  	bmp_image_t *bmp=(bmp_image_t *)addr; +#ifdef CONFIG_VIDEO_BMP_GZIP +	unsigned char *dst = NULL; +	ulong len; +#endif /* CONFIG_VIDEO_BMP_GZIP */ +  	if (!((bmp->header.signature[0]=='B') &&  	      (bmp->header.signature[1]=='M'))) { + +#ifdef CONFIG_VIDEO_BMP_GZIP +		/* +		 * Decompress bmp image +		 */ +		len = CFG_VIDEO_LOGO_MAX_SIZE; +		dst = malloc(CFG_VIDEO_LOGO_MAX_SIZE); +		if (dst == NULL) { +			printf("Error: malloc in gunzip failed!\n"); +			return(1); +		} +		if (gunzip(dst, CFG_VIDEO_LOGO_MAX_SIZE, (uchar *)addr, &len) != 0) { +			printf("There is no valid bmp file at the given address\n"); +			return(1); +		} +		if (len == CFG_VIDEO_LOGO_MAX_SIZE) { +			printf("Image could be truncated (increase CFG_VIDEO_LOGO_MAX_SIZE)!\n"); +		} + +		/* +		 * Set addr to decompressed image +		 */ +		bmp = (bmp_image_t *)dst; + +		/* +		 * Check for bmp mark 'BM' +		 */ +		if (!((bmp->header.signature[0] == 'B') && +		      (bmp->header.signature[1] == 'M'))) { +			printf("There is no valid bmp file at the given address\n"); +			free(dst); +			return(1); +		} + +		printf("Gzipped BMP image detected!\n"); +#else /* CONFIG_VIDEO_BMP_GZIP */  		printf("There is no valid bmp file at the given address\n");  		return(1); +#endif /* CONFIG_VIDEO_BMP_GZIP */  	}  	printf("Image size    : %d x %d\n", le32_to_cpu(bmp->header.width),  	       le32_to_cpu(bmp->header.height));  	printf("Bits per pixel: %d\n", le16_to_cpu(bmp->header.bit_count));  	printf("Compression   : %d\n", le32_to_cpu(bmp->header.compression)); + +#ifdef CONFIG_VIDEO_BMP_GZIP +	if (dst) { +		free(dst); +	} +#endif /* CONFIG_VIDEO_BMP_GZIP */ +  	return(0);  } |