GraphicsMagick: "bmp_info.size" must be checked after it is read...

GraphicsMagick Commits <[email protected]>
Newsgroups gmane.comp.video.graphicsmagick.cvs
Message-ID <mailman.7241.1691432114.1761.graphicsmagick-commit@lists.sourceforge.net>
changeset 92e8d008ed6c in /hg/GraphicsMagick
details: http://hg.GraphicsMagick.org/hg/GraphicsMagick?cmd=changeset;node=92e8d008ed6c
summary: "bmp_info.size" must be checked after it is read from a file.

diffstat:

 coders/bmp.c |  37 +++++++++++++++++++++----------------
 1 files changed, 21 insertions(+), 16 deletions(-)

diffs (66 lines):

diff -r 1c5f6e7f6af6 -r 92e8d008ed6c coders/bmp.c
--- a/coders/bmp.c	Mon Aug 07 18:48:49 2023 +0200
+++ b/coders/bmp.c	Mon Aug 07 20:14:28 2023 +0200
@@ -649,18 +649,13 @@
       if ((count=ReadBlob(image,2,(char *) magick)) != 2)
         break;
     }
-    if (logging && count == 2)
-      (void) LogMagickEvent(CoderEvent,GetMagickModule(),"  Magick: %c%c",
-        magick[0],magick[1]);
 
     if (count != 2)		/* Found "BA" header from above above */
       ThrowBMPReaderException(CorruptImageError,ImproperImageHeader,image);
-     if(LocaleNCompare((char *) magick,"BM",2) != 0)	/* "BM" is Windows or OS/2 file. */
-     {
-       if((LocaleNCompare((char *) magick,"CI",2) != 0) ||  /* "CI" is OS/2 Color Icon */
-          (bmp_info.size!=12 && bmp_info.size!=40))	/* CI chunk must have biSize only 12 or 40 */
-             ThrowBMPReaderException(CorruptImageError,ImproperImageHeader,image);
-     }
+
+    if (logging )
+      (void) LogMagickEvent(CoderEvent,GetMagickModule(),"  Magick: %c%c",
+        magick[0],magick[1]);
 
     bmp_info.file_size=ReadBlobLSBLong(image); /* File size in bytes */
     if (logging)
@@ -680,12 +675,15 @@
                             bmp_info.offset_bits,
                             bmp_info.ba_offset);
 
+    if(LocaleNCompare((char *) magick,"BM",2) != 0)	/* "BM" is Windows or OS/2 file. */
+    {
+      if((LocaleNCompare((char *) magick,"CI",2) != 0) ||  /* "CI" is OS/2 Color Icon */
+         (bmp_info.size!=12 && bmp_info.size!=40))	/* CI chunk must have biSize only 12 or 40 */
+             ThrowBMPReaderException(CorruptImageError,ImproperImageHeader,image);
+     }
+
     if ((bmp_info.file_size != 0) && ((magick_off_t) bmp_info.file_size > file_size))
       ThrowBMPReaderException(CorruptImageError,ImproperImageHeader,image);
-    if ((bmp_info.size != 12) && (bmp_info.size != 40) && (bmp_info.size != 108)
-        && (bmp_info.size != 124) &&
-        (!(bmp_info.size >= 12 && bmp_info.size <= 64)))
-      ThrowBMPReaderException(CorruptImageError,ImproperImageHeader,image);
     if (bmp_info.offset_bits < bmp_info.size)
       ThrowBMPReaderException(CorruptImageError,ImproperImageHeader,image);
 
@@ -721,9 +719,16 @@
         /*
           Microsoft Windows 3.X or later BMP image file.
         */
-        if (bmp_info.size < 40)
-          ThrowBMPReaderException(CorruptImageError,NonOS2HeaderSizeError,
-            image);
+        switch(bmp_info.size)
+        {
+          case 40:
+          case 56:
+          case 78:
+          case 108: break;
+          default: if(bmp_info.size <= 64)
+                     ThrowBMPReaderException(CorruptImageError, NonOS2HeaderSizeError, image);
+               break;
+        }
 
         /*
           BMP v3 defines width and hight as signed LONG (32 bit) values.  If
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.