Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE
GraphicsMagick.8039
GraphicsMagick-rgb.c-update.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File GraphicsMagick-rgb.c-update.patch of Package GraphicsMagick.8039
--- 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); } }
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor