GraphicsMagick: coders/wpg.c Deallocate palette when image load ...

GraphicsMagick Commits <[email protected]> Thu, 07 Dec 2023 11:32:46 -0600
Newsgroups gmane.comp.video.graphicsmagick.cvs
Message-ID <mailman.10150.1701970374.1716.graphicsmagick-commit@lists.sourceforge.net>
changeset 4b34974286dc in /hg/GraphicsMagick
details: http://hg.GraphicsMagick.org/hg/GraphicsMagick?cmd=changeset;node=4b34974286dc
summary: coders/wpg.c Deallocate palette when image load fails.

diffstat:

 ChangeLog    |   4 ++++
 coders/wpg.c |  50 ++++++++++++++++++++++++++++++++++++++++++--------
 2 files changed, 46 insertions(+), 8 deletions(-)

diffs (159 lines):

diff -r a1b7039803a4 -r 4b34974286dc ChangeLog
--- a/ChangeLog	Tue Dec 05 13:11:16 2023 -0600
+++ b/ChangeLog	Thu Dec 07 18:32:25 2023 +0100
@@ -1,3 +1,7 @@
+2023-11-13  Fojtik Jaroslav  <[email protected]>
+
+	* coders/wpg.c Deallocate palette when image load fails.
+
 2023-12-05  Bob Friesenhahn  <[email protected]>
 
 	* fuzzing/oss-fuzz-build.sh: If doing oss-fuzz CI testing, then
diff -r a1b7039803a4 -r 4b34974286dc coders/wpg.c
--- a/coders/wpg.c	Tue Dec 05 13:11:16 2023 -0600
+++ b/coders/wpg.c	Thu Dec 07 18:32:25 2023 +0100
@@ -1357,7 +1357,10 @@
 
           FilePos += Rd_WP_DWORD(image,&Rec.RecordLength);
           if((magick_off_t)Rec.RecordLength > filesize)
+          {
+            if(pPalette) MagickFreeResourceLimitedMemory(pPalette);     
             ThrowReaderException(CorruptImageError,ImproperImageHeader,image);
+          }
           if(EOFBlob(image)) break;
 
           FilePos += (magick_off_t)Rec.RecordLength;
@@ -1379,7 +1382,10 @@
               BitmapHeader1.Width=ReadBlobLSBShort(image);
               BitmapHeader1.Heigth=ReadBlobLSBShort(image);
               if ((BitmapHeader1.Width == 0) || (BitmapHeader1.Heigth == 0))
+              {
+                if(pPalette) MagickFreeResourceLimitedMemory(pPalette);
                 ThrowReaderException(CorruptImageError,ImproperImageHeader,image);
+              }
               BitmapHeader1.Depth=ReadBlobLSBShort(image);
               BitmapHeader1.HorzRes=ReadBlobLSBShort(image);
               BitmapHeader1.VertRes=ReadBlobLSBShort(image);
@@ -1420,7 +1426,10 @@
               LoadPaletteRec(image,&WPG_Palette,logging);
               PaletteItems = WPG_Palette.NumOfEntries;
               if((magick_uint32_t)PaletteItems + WPG_Palette.StartIndex > 256)
-                  ThrowReaderException(CorruptImageError,ColormapExceedsColorsLimit,image);
+              {
+                if(pPalette) MagickFreeResourceLimitedMemory(pPalette);
+                ThrowReaderException(CorruptImageError,ColormapExceedsColorsLimit,image);
+              }
               if(pPalette==NULL)
               {
                 PaletteAllocBytes = 3*256;
@@ -1435,7 +1444,10 @@
                 }
               }
               if(ReadBlob(image,(size_t) PaletteItems*3,pPalette+((size_t)3*WPG_Palette.StartIndex)) != (size_t) PaletteItems*3)
-                  ThrowReaderException(ResourceLimitError,MemoryAllocationFailed,image);
+              {
+                if(pPalette) MagickFreeResourceLimitedMemory(pPalette);
+                ThrowReaderException(ResourceLimitError,MemoryAllocationFailed,image);
+              }
               break;
 
             case 0x11:  /* Start PS l1 */
@@ -1454,7 +1466,10 @@
               BitmapHeader2.Width=ReadBlobLSBShort(image);
               BitmapHeader2.Heigth=ReadBlobLSBShort(image);
               if ((BitmapHeader2.Width == 0) || (BitmapHeader2.Heigth == 0))
+              {
+                if(pPalette) MagickFreeResourceLimitedMemory(pPalette);
                 ThrowReaderException(CorruptImageError,ImproperImageHeader,image);
+              }
               BitmapHeader2.Depth=ReadBlobLSBShort(image);
               BitmapHeader2.HorzRes=ReadBlobLSBShort(image);
               BitmapHeader2.VertRes=ReadBlobLSBShort(image);
@@ -1487,7 +1502,10 @@
 
 UnpackRaster:
               if(bpp>24)
-                {ThrowReaderException(CoderError,ColorTypeNotSupported,image)}
+              {
+                if(pPalette) MagickFreeResourceLimitedMemory(pPalette);
+                ThrowReaderException(CoderError,ColorTypeNotSupported,image);
+              }
 
               if(pPalette!=NULL && PaletteItems>0)
               {
@@ -1516,8 +1534,8 @@
                   if (!AllocateImageColormap(image,image->colors))
                     {
                     NoMemory:
-                      ThrowReaderException(ResourceLimitError,MemoryAllocationFailed,
-                                           image)
+                      if(pPalette) MagickFreeResourceLimitedMemory(pPalette);
+                      ThrowReaderException(ResourceLimitError,MemoryAllocationFailed,image)
                     }
                   image->storage_class = PseudoClass;
                   /* printf("Load default colormap \n"); */
@@ -1561,6 +1579,7 @@
                 if(UnpackWPGRaster(image,bpp) < 0)
                 {               /* The raster cannot be unpacked */
                 DecompressionFailed:
+                  if(pPalette) MagickFreeResourceLimitedMemory(pPalette);
                   ThrowReaderException(CoderError,UnableToDecompressImage,image)
                 }
 
@@ -1664,15 +1683,23 @@
 
               /* Sanity check for amount of palette entries. */
               if (WPG_Palette.NumOfEntries == 0)
+              {
+                if(pPalette) MagickFreeResourceLimitedMemory(pPalette);
                 ThrowReaderException(CorruptImageError,UnrecognizedNumberOfColors,image);
-
+              }
               if ((unsigned) (WPG_Palette.NumOfEntries-1) > MaxMap)
+              {
+                if(pPalette) MagickFreeResourceLimitedMemory(pPalette);
                 ThrowReaderException(CorruptImageError,ColormapExceedsColorsLimit,image);
+              }
 
               if ( (WPG_Palette.StartIndex > WPG_Palette.NumOfEntries) ||
                    ((((unsigned long)WPG_Palette.NumOfEntries-(unsigned long)WPG_Palette.StartIndex) >
                      ((Rec2.RecordLength-2-2) / 3))) )
-                 ThrowReaderException(CorruptImageError,InvalidColormapIndex,image);
+              {
+                if(pPalette) MagickFreeResourceLimitedMemory(pPalette);
+                ThrowReaderException(CorruptImageError,InvalidColormapIndex,image);
+              }
 
               if(pPalette!=NULL &&
                  PaletteAllocBytes < 4*(WPG_Palette.StartIndex+WPG_Palette.NumOfEntries))
@@ -1697,7 +1724,10 @@
                 }
               }
               if(ReadBlob(image,(size_t) PaletteItems*4,pPalette+((size_t)4*WPG_Palette.StartIndex)) != (size_t) PaletteItems*4)
-                  ThrowReaderException(ResourceLimitError,MemoryAllocationFailed,image);
+              {
+                if(pPalette) MagickFreeResourceLimitedMemory(pPalette);
+                ThrowReaderException(ResourceLimitError,MemoryAllocationFailed,image);
+              }
               break;
 
             case 0x0E:
@@ -1707,7 +1737,10 @@
               Bitmap2Header1.Compression=ReadBlobByte(image);
 
               if ((Bitmap2Header1.Width == 0) || (Bitmap2Header1.Heigth == 0))
+              {
+                if(pPalette) MagickFreeResourceLimitedMemory(pPalette);
                 ThrowReaderException(CorruptImageError,ImproperImageHeader,image);
+              }
 
               if(image->rows!=0 && image->columns!=0)
               {                       /* Allocate next image structure. */
@@ -1867,6 +1900,7 @@
 
     default:
       {
+        if(pPalette) MagickFreeResourceLimitedMemory(pPalette);
         ThrowReaderException(CoderError,DataEncodingSchemeIsNotSupported,image);
       }
     }