summaryrefslogtreecommitdiff
path: root/tools/bmp_logo.c
diff options
context:
space:
mode:
authorJon Smith <jtsmith@pdiarm.com>2017-10-05 08:35:02 -0400
committerTom Rini <trini@konsulko.com>2017-10-16 09:42:51 -0400
commit06d326d3a6e343dd5df992afcd3613ea2188d28a (patch)
treeed09974b4754b8407c5d7020aa6d5701cd55ce00 /tools/bmp_logo.c
parent026d7958ba6dc5ed4cd2c5ff507f55f3897cf41a (diff)
downloadu-boot-06d326d3a6e343dd5df992afcd3613ea2188d28a.tar.gz
tools: bmp_logo: correctly interpret BMP files with larger headers
All BMP files were being treated as though they had a 40 byte header. There are several BMP header formats consisting of additional data. This was causing some of the header to be read as color information, skewing the color palette. Signed-off-by: Jon Smith <jtsmith@pdiarm.com>
Diffstat (limited to 'tools/bmp_logo.c')
-rw-r--r--tools/bmp_logo.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/tools/bmp_logo.c b/tools/bmp_logo.c
index 2247adcc82..55f833fb9b 100644
--- a/tools/bmp_logo.c
+++ b/tools/bmp_logo.c
@@ -76,7 +76,7 @@ int main (int argc, char *argv[])
FILE *fp;
bitmap_t bmp;
bitmap_t *b = &bmp;
- uint16_t data_offset, n_colors;
+ uint16_t data_offset, n_colors, hdr_size;
if (argc < 3) {
usage(argv[0]);
@@ -108,7 +108,12 @@ int main (int argc, char *argv[])
skip_bytes (fp, 8);
if (fread (&data_offset, sizeof (uint16_t), 1, fp) != 1)
error ("Couldn't read bitmap data offset", fp);
- skip_bytes (fp, 6);
+ skip_bytes(fp, 2);
+ if (fread(&hdr_size, sizeof(uint16_t), 1, fp) != 1)
+ error("Couldn't read bitmap header size", fp);
+ if (hdr_size < 40)
+ error("Invalid bitmap header", fp);
+ skip_bytes(fp, 2);
if (fread (&b->width, sizeof (uint16_t), 1, fp) != 1)
error ("Couldn't read bitmap width", fp);
skip_bytes (fp, 2);
@@ -117,7 +122,7 @@ int main (int argc, char *argv[])
skip_bytes (fp, 22);
if (fread (&n_colors, sizeof (uint16_t), 1, fp) != 1)
error ("Couldn't read bitmap colors", fp);
- skip_bytes (fp, 6);
+ skip_bytes(fp, hdr_size - 34);
/*
* Repair endianess.