]> git.sur5r.net Git - u-boot/commitdiff
tools: bmp_logo: correctly interpret BMP files with larger headers
authorJon Smith <jtsmith@pdiarm.com>
Thu, 5 Oct 2017 12:35:02 +0000 (08:35 -0400)
committerTom Rini <trini@konsulko.com>
Mon, 16 Oct 2017 13:42:51 +0000 (09:42 -0400)
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>
tools/bmp_logo.c

index 2247adcc82ec1ebad5070eab61fb559991a731c3..55f833fb9b8bbcb11c58e29430b193ff327e7ab8 100644 (file)
@@ -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.