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);
}
}