File GraphicsMagick-gray.c-update.patch of Package GraphicsMagick.7893
--- a/coders/gray.c 2015-10-04 21:35:31.000000000 +0200
+++ b/coders/gray.c 2017-12-05 14:15:21.143010849 +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
%
@@ -147,19 +147,22 @@ static Image *ReadGRAYImage(const ImageI
Image
*image;
+ unsigned long
+ j;
+
long
- j,
y;
register long
- i,
- x;
+ i;
register PixelPacket
*q;
size_t
- count;
+ count,
+ tile_packets,
+ x;
unsigned char
*scanline;
@@ -192,6 +195,27 @@ static Image *ReadGRAYImage(const ImageI
image=AllocateImage(image_info);
if ((image->columns == 0) || (image->rows == 0))
ThrowReaderException(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);
+
status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
if (status == False)
ThrowReaderException(FileOpenError,UnableToOpenFile,image);
@@ -227,6 +251,8 @@ static Image *ReadGRAYImage(const ImageI
scanline=MagickAllocateArray(unsigned char *,packet_size,image->tile_info.width);
if (scanline == (unsigned char *) NULL)
ThrowReaderException(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.
*/
@@ -259,9 +278,9 @@ static Image *ReadGRAYImage(const ImageI
*/
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
{
/*
@@ -271,7 +290,8 @@ static Image *ReadGRAYImage(const ImageI
if (image->scene >= (image_info->subimage+image_info->subrange-1))
break;
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;
/*
Support GRAYA with matte channel
*/
@@ -280,27 +300,29 @@ static Image *ReadGRAYImage(const ImageI
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=SetImagePixelsEx(image,0,y,image->columns,1,exception);
if (q == (PixelPacket *) NULL)
break;
if (!is_grayscale)
(void) memset(q,0,sizeof(PixelPacket)*image->columns);
(void) ImportImagePixelArea(image,quantum_type,quantum_size,scanline+x,
- &import_options,0);
+ &import_options,0);
if (!SyncImagePixelsEx(image,exception))
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;
}
image->is_grayscale=is_grayscale;
count=image->tile_info.height-image->rows-image->tile_info.y;
- for (j=0; j < (long) count; j++)
- (void) ReadBlob(image,packet_size*image->tile_info.width,scanline);
+ for (j=0; j < count; j++)
+ if (ReadBlob(image,tile_packets,scanline) != tile_packets)
+ break;
if (EOFBlob(image))
{
ThrowException(exception,CorruptImageError,UnexpectedEndOfFile,
@@ -313,8 +335,8 @@ static Image *ReadGRAYImage(const ImageI
if (image_info->subrange != 0)
if (image->scene >= (image_info->subimage+image_info->subrange-1))
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.
@@ -526,14 +548,14 @@ ModuleExport void UnregisterGRAYImage(vo
static unsigned int WriteGRAYImage(const ImageInfo *image_info,Image *image)
{
- int
+ long
y;
register const PixelPacket
*p;
unsigned char
- *scanline=0;
+ *scanline= (unsigned char *) NULL;
unsigned int
depth,
@@ -564,7 +586,7 @@ static unsigned int WriteGRAYImage(const
ThrowWriterException(FileOpenError,UnableToOpenFile,image);
quantum_type=MagickToQuantumType(image_info->magick,MagickFalse);
-
+
/*
Support depth in multiples of 8 bits.
*/
@@ -574,6 +596,17 @@ static unsigned int WriteGRAYImage(const
depth=16;
else
depth=8;
+
+ if (depth <= 8)
+ quantum_size=8;
+ else if (depth <= 16)
+ quantum_size=16;
+ else
+ quantum_size=32;
+
+ samples_per_pixel=MagickGetQuantumSamplesPerPixel(quantum_type);
+ packet_size=(quantum_size*samples_per_pixel)/8;
+
/*
Convert image to gray scale PseudoColor class.
*/
@@ -581,17 +614,6 @@ static unsigned int WriteGRAYImage(const
do
{
/*
- Allocate memory for scanline.
- */
- if (depth <= 8)
- quantum_size=8;
- else if (depth <= 16)
- quantum_size=16;
- else
- quantum_size=32;
- samples_per_pixel=MagickGetQuantumSamplesPerPixel(quantum_type);
- packet_size=(quantum_size*samples_per_pixel)/8;
- /*
Allocate scanline
*/
scanline=MagickAllocateArray(unsigned char *,packet_size,image->columns);