handle odd-width BI_RLE4 width overflow
authorTony Cook <tony@develop-help.com>
Tue, 24 Apr 2012 07:12:46 +0000 (17:12 +1000)
committerTony Cook <tony@develop-help.com>
Tue, 24 Apr 2012 07:12:46 +0000 (17:12 +1000)
Some BMP BI_RLE4 writers compress scanlines as if they were an extra
pixel in width, eg. GIMP.

Imager would fail to read these images, I now allow one pixel of
overflow.

bmp.c

diff --git a/bmp.c b/bmp.c
index 58556fd..6f82f2f 100644 (file)
--- a/bmp.c
+++ b/bmp.c
@@ -940,6 +940,7 @@ read_4bit_bmp(io_glue *ig, int xsize, int ysize, int clr_used,
   else if (compression == BI_RLE4) {
     int read_size;
     int count;
+    i_img_dim xlimit = (xsize + 1) / 2 * 2; /* rounded up */
 
     i_tags_add(&im->tags, "bmp_compression_name", 0, "BI_RLE4", -1, 0);
     x = 0;
@@ -961,7 +962,7 @@ read_4bit_bmp(io_glue *ig, int xsize, int ysize, int clr_used,
       }
       else if (packed[0]) {
        int count = packed[0];
-       if (x + count > xsize) {
+       if (x + count > xlimit) {
          /* this file is corrupt */
          myfree(packed);
          myfree(line);
@@ -1013,7 +1014,7 @@ read_4bit_bmp(io_glue *ig, int xsize, int ysize, int clr_used,
 
         default:
           count = packed[1];
-         if (x + count > xsize) {
+         if (x + count > xlimit) {
            /* this file is corrupt */
            myfree(packed);
            myfree(line);