File GraphicsMagick-rgb.c-update.patch of Package GraphicsMagick.9388

--- GraphicsMagick-1.3.25/coders/rgb.c	2018-02-20 13:33:56.150167870 +0100
+++ /home/pgajdos/osc/home:pgajdos:magick/GraphicsMagick/GM/coders/rgb.c	2017-12-05 14:15:21.155011040 +0100
@@ -1,5 +1,5 @@
 /*
-% Copyright (C) 2003 - 2015 GraphicsMagick Group
+% Copyright (C) 2003 - 2017 GraphicsMagick Group
 % Copyright (C) 2002 ImageMagick Studio
 % Copyright 1991-1999 E. I. du Pont de Nemours and Company
 %
@@ -50,6 +50,12 @@
 static unsigned int
   WriteRGBImage(const ImageInfo *,Image *);
 
+#define ThrowRGBReaderException(code_,reason_,image_) \
+{ \
+  MagickFreeMemory(scanline);                 \
+  ThrowReaderException(code_,reason_,image_); \
+}
+
 /*
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %                                                                             %
@@ -90,17 +96,18 @@ static Image *ReadRGBImage(const ImageIn
     y;
 
   register long
-    i,
-    x;
+    i;
 
   register PixelPacket
     *q;
 
   size_t
-    count;
+    count,
+    tile_packets,
+    x;
 
   unsigned char
-    *scanline;
+    *scanline = (unsigned char *) NULL;
 
   unsigned int
     status;
@@ -118,7 +125,28 @@ static Image *ReadRGBImage(const ImageIn
   assert(exception->signature == MagickSignature);
   image=AllocateImage(image_info);
   if ((image->columns == 0) || (image->rows == 0))
-    ThrowReaderException(OptionError,MustSpecifyImageSize,image);
+    ThrowRGBReaderException(OptionError,MustSpecifyImageSize,image);
+  if (image->logging)
+    (void) LogMagickEvent(CoderEvent,GetMagickModule(),
+                          "Tile %lux%lu%+ld%+ld, Offset %lu",
+                          image->tile_info.width,image->tile_info.height,
+                          image->tile_info.x,image->tile_info.y,
+                          image->offset);
+  /*
+    There is the option to either require that the tile be within the
+    image bounds or to return only the portion of the tile which is
+    within the image bounds (returned image is smaller than requested
+    tile size).  For the moment we choose the former.
+  */
+  if ((image->tile_info.width > image->columns) ||
+      (image->tile_info.x < 0) ||
+      (image->tile_info.width+image->tile_info.x > image->columns) ||
+      (image->tile_info.height > image->rows) ||
+      (image->tile_info.y < 0) ||
+      (image->tile_info.height+image->tile_info.y > image->rows)
+      )
+    ThrowReaderException(CorruptImageError,ImproperImageHeader,image);
+
   if (image_info->interlace != PartitionInterlace)
     {
       /*
@@ -126,7 +154,7 @@ static Image *ReadRGBImage(const ImageIn
       */
       status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
       if (status == False)
-        ThrowReaderException(FileOpenError,UnableToOpenFile,image);
+        ThrowRGBReaderException(FileOpenError,UnableToOpenFile,image);
       for (i=0; i < image->offset; i++)
         {
           if (EOF == ReadBlobByte(image))
@@ -137,9 +165,9 @@ static Image *ReadRGBImage(const ImageIn
 
   if (image->logging)
     (void) LogMagickEvent(CoderEvent,GetMagickModule(),
-			  "Tile %lux%lu%+ld%+ld",
-			  image->tile_info.width,image->tile_info.height,
-			  image->tile_info.x,image->tile_info.y);
+                          "Tile %lux%lu%+ld%+ld",
+                          image->tile_info.width,image->tile_info.height,
+                          image->tile_info.x,image->tile_info.y);
 
   /*
     Allocate memory for a scanline.
@@ -159,9 +187,11 @@ static Image *ReadRGBImage(const ImageIn
     }
 
   scanline=MagickAllocateArray(unsigned char *,
-			       packet_size,image->tile_info.width);
+                               packet_size,image->tile_info.width);
   if (scanline == (unsigned char *) NULL)
-    ThrowReaderException(ResourceLimitError,MemoryAllocationFailed,image);
+    ThrowRGBReaderException(ResourceLimitError,MemoryAllocationFailed,image);
+  tile_packets=(size_t) packet_size*image->tile_info.width;
+  x=(size_t) (packet_size*image->tile_info.x);
   /*
     Initialize import options.
   */
@@ -171,10 +201,10 @@ static Image *ReadRGBImage(const ImageIn
 
   if (image->logging)
     (void) LogMagickEvent(CoderEvent,GetMagickModule(),
-			  "Depth %u bits, Endian %s, Interlace %s",
-			  quantum_size,
-			  EndianTypeToString(import_options.endian),
-			  InterlaceTypeToString(image_info->interlace));
+                          "Depth %u bits, Endian %s, Interlace %s",
+                          quantum_size,
+                          EndianTypeToString(import_options.endian),
+                          InterlaceTypeToString(image_info->interlace));
   /*
     Support starting at intermediate image frame.
   */
@@ -186,9 +216,9 @@ static Image *ReadRGBImage(const ImageIn
       */
       image->scene++;
       for (y=0; y < (long) image->rows; y++)
-        (void) ReadBlob(image,packet_size*image->tile_info.width,scanline);
+        if (ReadBlob(image,tile_packets,scanline) != tile_packets)
+          break;
     }
-  x=(long) (packet_size*image->tile_info.x);
   do
   {
     /*
@@ -202,36 +232,39 @@ static Image *ReadRGBImage(const ImageIn
       case NoInterlace:
       default:
       {
-	QuantumType
-	  quantum_type;
+        QuantumType
+          quantum_type;
 
         /*
           No interlacing:  RGBRGBRGBRGBRGBRGB...
         */
-	quantum_type=(image->matte ? RGBAQuantum : RGBQuantum);
+        quantum_type=(image->matte ? RGBAQuantum : RGBQuantum);
         for (y=0; y < image->tile_info.y; y++)
-          (void) ReadBlob(image,packet_size*image->tile_info.width,scanline);
+          if (ReadBlob(image,tile_packets,scanline) != tile_packets)
+            break;
         for (y=0; y < (long) image->rows; y++)
         {
           if ((y > 0) || (image->previous == (Image *) NULL))
-            (void) ReadBlob(image,packet_size*image->tile_info.width,scanline);
+            if (ReadBlob(image,tile_packets,scanline) != tile_packets)
+              break;
           q=SetImagePixels(image,0,y,image->columns,1);
           if (q == (PixelPacket *) NULL)
             break;
-	  (void) ImportImagePixelArea(image,quantum_type,quantum_size,scanline+x,
-				      &import_options,0);
+          (void) ImportImagePixelArea(image,quantum_type,quantum_size,scanline+x,
+                                      &import_options,0);
           if (!SyncImagePixels(image))
             break;
           if (image->previous == (Image *) NULL)
             if (QuantumTick(y,image->rows))
               if (!MagickMonitorFormatted(y,image->rows,exception,
                                           LoadImageText,image->filename,
-					  image->columns,image->rows))
+                                          image->columns,image->rows))
                 break;
         }
         count=image->tile_info.height-image->rows-image->tile_info.y;
         for (i=0; i < (long) count; i++)
-          (void) ReadBlob(image,packet_size*image->tile_info.width,scanline);
+          if (ReadBlob(image,tile_packets,scanline) != tile_packets)
+            break;
         break;
       }
       case LineInterlace:
@@ -241,28 +274,32 @@ static Image *ReadRGBImage(const ImageIn
         */
         packet_size=(quantum_size)/8;
         for (y=0; y < image->tile_info.y; y++)
-          (void) ReadBlob(image,packet_size*image->tile_info.width,scanline);
+          if (ReadBlob(image,tile_packets,scanline) != tile_packets)
+            break;
         for (y=0; y < (long) image->rows; y++)
         {
           if ((y > 0) || (image->previous == (Image *) NULL))
-            (void) ReadBlob(image,packet_size*image->tile_info.width,scanline);
+            if (ReadBlob(image,tile_packets,scanline) != tile_packets)
+              break;
           q=SetImagePixels(image,0,y,image->columns,1);
           if (q == (PixelPacket *) NULL)
             break;
           (void) ImportImagePixelArea(image,RedQuantum,quantum_size,scanline+x,
-				      &import_options,0);
-          (void) ReadBlob(image,packet_size*image->tile_info.width,scanline);
+                                      &import_options,0);
+          if (ReadBlob(image,tile_packets,scanline) != tile_packets)
+            break;
           (void) ImportImagePixelArea(image,GreenQuantum,quantum_size,scanline+x,
-				      &import_options,0);
-          (void) ReadBlob(image,packet_size*image->tile_info.width,scanline);
+                                      &import_options,0);
+          if (ReadBlob(image,tile_packets,scanline) != tile_packets)
+            break;
           (void) ImportImagePixelArea(image,BlueQuantum,quantum_size,scanline+x,
-				      &import_options,0);
+                                      &import_options,0);
           if (image->matte)
             {
-              (void) ReadBlob(image,packet_size*image->tile_info.width,
-                scanline);
+              if (ReadBlob(image,tile_packets,scanline) != tile_packets)
+                break;
               (void) ImportImagePixelArea(image,AlphaQuantum,quantum_size,scanline+x,
-					  &import_options,0);
+                                          &import_options,0);
             }
           if (!SyncImagePixels(image))
             break;
@@ -270,12 +307,13 @@ static Image *ReadRGBImage(const ImageIn
             if (QuantumTick(y,image->rows))
               if (!MagickMonitorFormatted(y,image->rows,exception,
                                           LoadImageText,image->filename,
-					  image->columns,image->rows))
+                                          image->columns,image->rows))
                 break;
         }
         count=image->tile_info.height-image->rows-image->tile_info.y;
         for (i=0; i < (long) count; i++)
-          (void) ReadBlob(image,packet_size*image->tile_info.width,scanline);
+          if (ReadBlob(image,tile_packets,scanline) != tile_packets)
+            break;
         break;
       }
       case PlaneInterlace:
@@ -292,97 +330,106 @@ static Image *ReadRGBImage(const ImageIn
             AppendImageFormat("R",image->filename);
             status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
             if (status == False)
-              ThrowReaderException(FileOpenError,UnableToOpenFile,image);
+              ThrowRGBReaderException(FileOpenError,UnableToOpenFile,image);
           }
         packet_size=(quantum_size)/8;
         for (y=0; y < image->tile_info.y; y++)
-          (void) ReadBlob(image,packet_size*image->tile_info.width,scanline);
+          if (ReadBlob(image,tile_packets,scanline) != tile_packets)
+            break;
         i=0;
         span=image->rows*(image->matte ? 4 : 3);
         for (y=0; y < (long) image->rows; y++)
         {
           if ((y > 0) || (image->previous == (Image *) NULL))
-            (void) ReadBlob(image,packet_size*image->tile_info.width,scanline);
+            if (ReadBlob(image,tile_packets,scanline) != tile_packets)
+              break;
           q=SetImagePixels(image,0,y,image->columns,1);
           if (q == (PixelPacket *) NULL)
             break;
           (void) ImportImagePixelArea(image,RedQuantum,quantum_size,scanline+x,
-				      &import_options,0);
+                                      &import_options,0);
           if (!SyncImagePixels(image))
             break;
           if (image->previous == (Image *) NULL)
             if (QuantumTick(i,span))
               if (!MagickMonitorFormatted(i,span,&image->exception,
                                           LoadImageText,image->filename,
-					  image->columns,image->rows))
+                                          image->columns,image->rows))
                 break;
           i++;
         }
         count=image->tile_info.height-image->rows-image->tile_info.y;
         for (i=0; i < (long) count; i++)
-          (void) ReadBlob(image,packet_size*image->tile_info.width,scanline);
+          if (ReadBlob(image,tile_packets,scanline) != tile_packets)
+            break;
         if (image_info->interlace == PartitionInterlace)
           {
             CloseBlob(image);
             AppendImageFormat("G",image->filename);
             status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
             if (status == False)
-              ThrowReaderException(FileOpenError,UnableToOpenFile,image);
+              ThrowRGBReaderException(FileOpenError,UnableToOpenFile,image);
           }
         for (y=0; y < image->tile_info.y; y++)
-          (void) ReadBlob(image,packet_size*image->tile_info.width,scanline);
+          if (ReadBlob(image,tile_packets,scanline) != tile_packets)
+            break;
         for (y=0; y < (long) image->rows; y++)
         {
-          (void) ReadBlob(image,packet_size*image->tile_info.width,scanline);
+          if (ReadBlob(image,tile_packets,scanline) != tile_packets)
+            break;
           q=GetImagePixels(image,0,y,image->columns,1);
           if (q == (PixelPacket *) NULL)
             break;
           (void) ImportImagePixelArea(image,GreenQuantum,quantum_size,scanline+x,
-				      &import_options,0);
+                                      &import_options,0);
           if (!SyncImagePixels(image))
             break;
           if (image->previous == (Image *) NULL)
             if (QuantumTick(i,span))
               if (!MagickMonitorFormatted(i,span,&image->exception,
                                           LoadImageText,image->filename,
-					  image->columns,image->rows))
+                                          image->columns,image->rows))
                 break;
           i++;
         }
         count=image->tile_info.height-image->rows-image->tile_info.y;
         for (i=0; i < (long) count; i++)
-          (void) ReadBlob(image,packet_size*image->tile_info.width,scanline);
+          if (ReadBlob(image,tile_packets,scanline) != tile_packets)
+            break;
         if (image_info->interlace == PartitionInterlace)
           {
             CloseBlob(image);
             AppendImageFormat("B",image->filename);
             status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
             if (status == False)
-              ThrowReaderException(FileOpenError,UnableToOpenFile,image);
+              ThrowRGBReaderException(FileOpenError,UnableToOpenFile,image);
           }
         for (y=0; y < image->tile_info.y; y++)
-          (void) ReadBlob(image,packet_size*image->tile_info.width,scanline);
+          if (ReadBlob(image,tile_packets,scanline) != tile_packets)
+            break;
         for (y=0; y < (long) image->rows; y++)
         {
-          (void) ReadBlob(image,packet_size*image->tile_info.width,scanline);
+          if (ReadBlob(image,tile_packets,scanline) != tile_packets)
+            break;
           q=GetImagePixels(image,0,y,image->columns,1);
           if (q == (PixelPacket *) NULL)
             break;
           (void) ImportImagePixelArea(image,BlueQuantum,quantum_size,scanline+x,
-				      &import_options,0);
+                                      &import_options,0);
           if (!SyncImagePixels(image))
             break;
           if (image->previous == (Image *) NULL)
             if (QuantumTick(i,span))
               if (!MagickMonitorFormatted(i,span,&image->exception,
                                           LoadImageText,image->filename,
-					  image->columns,image->rows))
+                                          image->columns,image->rows))
                 break;
           i++;
         }
         count=image->tile_info.height-image->rows-image->tile_info.y;
         for (i=0; i < (long) count; i++)
-          (void) ReadBlob(image,packet_size*image->tile_info.width,scanline);
+          if (ReadBlob(image,tile_packets,scanline) != tile_packets)
+            break;
         if (image->matte)
           {
             /*
@@ -394,34 +441,34 @@ static Image *ReadRGBImage(const ImageIn
                 AppendImageFormat("A",image->filename);
                 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
                 if (status == False)
-                  ThrowReaderException(FileOpenError,UnableToOpenFile,image);
+                  ThrowRGBReaderException(FileOpenError,UnableToOpenFile,image);
               }
             for (y=0; y < image->tile_info.y; y++)
-              (void) ReadBlob(image,packet_size*image->tile_info.width,
-                scanline);
+              if (ReadBlob(image,tile_packets,scanline) != tile_packets)
+                break;
             for (y=0; y < (long) image->rows; y++)
             {
-              (void) ReadBlob(image,packet_size*image->tile_info.width,
-                scanline);
+              if (ReadBlob(image,tile_packets,scanline) != tile_packets)
+                break;
               q=GetImagePixels(image,0,y,image->columns,1);
               if (q == (PixelPacket *) NULL)
                 break;
               (void) ImportImagePixelArea(image,AlphaQuantum,quantum_size,scanline+x,
-					  &import_options,0);
+                                          &import_options,0);
               if (!SyncImagePixels(image))
                 break;
               if (image->previous == (Image *) NULL)
                 if (QuantumTick(i,span))
                   if (!MagickMonitorFormatted(i,span,&image->exception,
                                               LoadImageText,image->filename,
-					      image->columns,image->rows))
+                                              image->columns,image->rows))
                     break;
               i++;
             }
             count=image->tile_info.height-image->rows-image->tile_info.y;
             for (i=0; i < (long) count; i++)
-              (void) ReadBlob(image,packet_size*image->tile_info.width,
-                scanline);
+              if (ReadBlob(image,tile_packets,scanline) != tile_packets)
+                break;
           }
         if (image_info->interlace == PartitionInterlace)
           (void) strlcpy(image->filename,image_info->filename,MaxTextExtent);
@@ -442,8 +489,8 @@ static Image *ReadRGBImage(const ImageIn
         break;
     if (image_info->interlace == PartitionInterlace)
       break;
-    count=ReadBlob(image,packet_size*image->tile_info.width,scanline);
-    if (count != 0)
+    count=ReadBlob(image,tile_packets,scanline);
+    if (count == tile_packets)
       {
         /*
           Allocate next image structure.
@@ -677,28 +724,28 @@ static unsigned int WriteRGBImage(const
       case NoInterlace:
       default:
       {
-	QuantumType
-	  quantum_type;
+        QuantumType
+          quantum_type;
 
         /*
           No interlacing:  RGBRGBRGBRGBRGBRGB...
         */
-	quantum_type=RGBQuantum;
-	if (LocaleCompare(image_info->magick,"RGBA") == 0)
-	  quantum_type=RGBAQuantum;
+        quantum_type=RGBQuantum;
+        if (LocaleCompare(image_info->magick,"RGBA") == 0)
+          quantum_type=RGBAQuantum;
         for (y=0; y < (long) image->rows; y++)
         {
           p=AcquireImagePixels(image,0,y,image->columns,1,&image->exception);
           if (p == (const PixelPacket *) NULL)
             break;
-	  (void) ExportImagePixelArea(image,quantum_type,quantum_size,pixels,
-				      &export_options,&export_info);
-	  (void) WriteBlob(image,export_info.bytes_exported,pixels);
+          (void) ExportImagePixelArea(image,quantum_type,quantum_size,pixels,
+                                      &export_options,&export_info);
+          (void) WriteBlob(image,export_info.bytes_exported,pixels);
           if (image->previous == (Image *) NULL)
             if (QuantumTick(y,image->rows))
               if (!MagickMonitorFormatted(y,image->rows,&image->exception,
                                           SaveImageText,image->filename,
-					  image->columns,image->rows))
+                                          image->columns,image->rows))
                 break;
         }
         break;
@@ -714,24 +761,24 @@ static unsigned int WriteRGBImage(const
           if (p == (const PixelPacket *) NULL)
             break;
           (void) ExportImagePixelArea(image,RedQuantum,quantum_size,pixels,
-				      &export_options,&export_info);
+                                      &export_options,&export_info);
           (void) WriteBlob(image,export_info.bytes_exported,pixels);
           (void) ExportImagePixelArea(image,GreenQuantum,quantum_size,pixels,
-				      &export_options,&export_info);
+                                      &export_options,&export_info);
           (void) WriteBlob(image,export_info.bytes_exported,pixels);
           (void) ExportImagePixelArea(image,BlueQuantum,quantum_size,pixels,
-				      &export_options,&export_info);
+                                      &export_options,&export_info);
           (void) WriteBlob(image,export_info.bytes_exported,pixels);
           if (LocaleCompare(image_info->magick,"RGBA") == 0)
             {
               (void) ExportImagePixelArea(image,AlphaQuantum,quantum_size,pixels,
-					  &export_options,&export_info);
+                                          &export_options,&export_info);
               (void) WriteBlob(image,export_info.bytes_exported,pixels);
             }
           if (QuantumTick(y,image->rows))
             if (!MagickMonitorFormatted(y,image->rows,&image->exception,
                                         SaveImageText,image->filename,
-					image->columns,image->rows))
+                                        image->columns,image->rows))
               break;
         }
         break;
@@ -755,7 +802,7 @@ static unsigned int WriteRGBImage(const
           if (p == (const PixelPacket *) NULL)
             break;
           (void) ExportImagePixelArea(image,RedQuantum,quantum_size,pixels,
-				      &export_options,&export_info);
+                                      &export_options,&export_info);
           (void) WriteBlob(image,export_info.bytes_exported,pixels);
         }
         if (image_info->interlace == PartitionInterlace)
@@ -768,7 +815,7 @@ static unsigned int WriteRGBImage(const
           }
         if (!MagickMonitorFormatted(100,400,&image->exception,SaveImageText,
                                     image->filename,
-				    image->columns,image->rows))
+                                    image->columns,image->rows))
           break;
         for (y=0; y < (long) image->rows; y++)
         {
@@ -776,7 +823,7 @@ static unsigned int WriteRGBImage(const
           if (p == (const PixelPacket *) NULL)
             break;
           (void) ExportImagePixelArea(image,GreenQuantum,quantum_size,pixels,
-				      &export_options,&export_info);
+                                      &export_options,&export_info);
           (void) WriteBlob(image,export_info.bytes_exported,pixels);
         }
         if (image_info->interlace == PartitionInterlace)
@@ -789,7 +836,7 @@ static unsigned int WriteRGBImage(const
           }
         if (!MagickMonitorFormatted(200,400,&image->exception,SaveImageText,
                                     image->filename,
-				    image->columns,image->rows))
+                                    image->columns,image->rows))
           break;
         for (y=0; y < (long) image->rows; y++)
         {
@@ -797,14 +844,14 @@ static unsigned int WriteRGBImage(const
           if (p == (const PixelPacket *) NULL)
             break;
           (void) ExportImagePixelArea(image,BlueQuantum,quantum_size,pixels,
-				      &export_options,&export_info);
+                                      &export_options,&export_info);
           (void) WriteBlob(image,export_info.bytes_exported,pixels);
         }
         if (LocaleCompare(image_info->magick,"RGBA") == 0)
           {
             if (!MagickMonitorFormatted(300,400,&image->exception,
                                         SaveImageText,image->filename,
-					image->columns,image->rows))
+                                        image->columns,image->rows))
               break;
             if (image_info->interlace == PartitionInterlace)
               {
@@ -822,7 +869,7 @@ static unsigned int WriteRGBImage(const
               if (p == (const PixelPacket *) NULL)
                 break;
               (void) ExportImagePixelArea(image,AlphaQuantum,quantum_size,pixels,
-					  &export_options,&export_info);
+                                          &export_options,&export_info);
               (void) WriteBlob(image,export_info.bytes_exported,pixels);
             }
           }
openSUSE Build Service is sponsored by