Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE
GraphicsMagick.8039
GraphicsMagick-cmyk.c-update.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File GraphicsMagick-cmyk.c-update.patch of Package GraphicsMagick.8039
Index: GraphicsMagick-1.3.25/coders/cmyk.c =================================================================== --- GraphicsMagick-1.3.25.orig/coders/cmyk.c 2018-02-09 10:46:52.418499588 +0100 +++ GraphicsMagick-1.3.25/coders/cmyk.c 2018-02-09 10:47:40.595267528 +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 % @@ -82,6 +82,11 @@ static unsigned int % % */ +#define ThrowCMYKReaderException(code_,reason_,image_) \ +{ \ + MagickFreeMemory(scanline); \ + ThrowReaderException(code_,reason_,image_); \ +} static Image *ReadCMYKImage(const ImageInfo *image_info, ExceptionInfo *exception) { @@ -92,17 +97,18 @@ static Image *ReadCMYKImage(const ImageI 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; @@ -119,8 +125,33 @@ static Image *ReadCMYKImage(const ImageI assert(exception != (ExceptionInfo *) NULL); assert(exception->signature == MagickSignature); image=AllocateImage(image_info); + if (image->logging) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Size %lux%lu", image->columns, image->rows); 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); + if (image_info->interlace != PartitionInterlace) { /* @@ -128,7 +159,7 @@ static Image *ReadCMYKImage(const ImageI */ status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); if (status == False) - ThrowReaderException(FileOpenError,UnableToOpenFile,image); + ThrowCMYKReaderException(FileOpenError,UnableToOpenFile,image); for (i=0; i < image->offset; i++) { if (EOF == ReadBlobByte(image)) @@ -137,22 +168,16 @@ static Image *ReadCMYKImage(const ImageI } } - 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); - /* Allocate memory for a scanline. */ if (image->depth <= 8) - quantum_size=8; + quantum_size=8U; else if (image->depth <= 16) - quantum_size=16; + quantum_size=16U; else - quantum_size=32; + quantum_size=32U; packet_size=(quantum_size*4)/8; if (LocaleCompare(image_info->magick,"CMYKA") == 0) @@ -161,9 +186,17 @@ static Image *ReadCMYKImage(const ImageI packet_size=(quantum_size*5)/8; } scanline=MagickAllocateArray(unsigned char *, - packet_size,image->tile_info.width); + packet_size,image->columns); if (scanline == (unsigned char *) NULL) - ThrowReaderException(ResourceLimitError,MemoryAllocationFailed,image); + ThrowCMYKReaderException(ResourceLimitError,MemoryAllocationFailed,image); + tile_packets=(size_t) packet_size*image->tile_info.width; + x=(size_t) (packet_size*image->tile_info.x); + if (image->logging) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "image->tile_info.x=%lu, packet_size=%u, " + "x=%" MAGICK_SIZE_T_F "u", + image->tile_info.x, packet_size, + (MAGICK_SIZE_T) x); /* Initialize import options. */ @@ -173,10 +206,10 @@ static Image *ReadCMYKImage(const ImageI 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. */ @@ -188,9 +221,9 @@ static Image *ReadCMYKImage(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 { /* @@ -209,32 +242,35 @@ static Image *ReadCMYKImage(const ImageI No interlacing: CMYKCMYKCMYKCMYKCMYKCMYK... */ 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; if (!image->matte) (void) ImportImagePixelArea(image,CMYKQuantum,quantum_size,scanline+x, - &import_options,0); + &import_options,0); else (void) ImportImagePixelArea(image,CMYKAQuantum,quantum_size,scanline+x, - &import_options,0); + &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: @@ -244,31 +280,36 @@ static Image *ReadCMYKImage(const ImageI */ 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,CyanQuantum,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,MagentaQuantum,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,YellowQuantum,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,BlackQuantum,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; @@ -276,12 +317,13 @@ static Image *ReadCMYKImage(const ImageI 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: @@ -298,128 +340,140 @@ static Image *ReadCMYKImage(const ImageI AppendImageFormat("C",image->filename); status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); if (status == False) - ThrowReaderException(FileOpenError,UnableToOpenFile,image); + ThrowCMYKReaderException(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 ? 5 : 4); 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,CyanQuantum,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("M",image->filename); status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); if (status == False) - ThrowReaderException(FileOpenError,UnableToOpenFile,image); + ThrowCMYKReaderException(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,MagentaQuantum,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("Y",image->filename); status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); if (status == False) - ThrowReaderException(FileOpenError,UnableToOpenFile,image); + ThrowCMYKReaderException(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,YellowQuantum,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("K",image->filename); status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); if (status == False) - ThrowReaderException(FileOpenError,UnableToOpenFile,image); + ThrowCMYKReaderException(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,BlackQuantum,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) { /* @@ -431,34 +485,34 @@ static Image *ReadCMYKImage(const ImageI AppendImageFormat("A",image->filename); status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); if (status == False) - ThrowReaderException(FileOpenError,UnableToOpenFile,image); + ThrowCMYKReaderException(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); @@ -479,8 +533,8 @@ static Image *ReadCMYKImage(const ImageI 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. @@ -715,28 +769,22 @@ static unsigned int WriteCMYKImage(const /* No interlacing: CMYKCMYKCMYKCMYKCMYKCMYK... */ + const QuantumType quantum_type = + (LocaleCompare(image_info->magick,"CMYKA") == 0) ? CMYKAQuantum : + CMYKQuantum; for (y=0; y < (long) image->rows; y++) { p=AcquireImagePixels(image,0,y,image->columns,1,&image->exception); if (p == (const PixelPacket *) NULL) break; - if (LocaleCompare(image_info->magick,"CMYKA") != 0) - { - (void) ExportImagePixelArea(image,CMYKQuantum,quantum_size,pixels, - &export_options,&export_info); - (void) WriteBlob(image,export_info.bytes_exported,pixels); - } - else - { - (void) ExportImagePixelArea(image,CMYKAQuantum,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; @@ -752,27 +800,27 @@ static unsigned int WriteCMYKImage(const if (p == (const PixelPacket *) NULL) break; (void) ExportImagePixelArea(image,CyanQuantum,quantum_size,pixels, - &export_options,&export_info); + &export_options,&export_info); (void) WriteBlob(image,export_info.bytes_exported,pixels); (void) ExportImagePixelArea(image,MagentaQuantum,quantum_size,pixels, - &export_options,&export_info); + &export_options,&export_info); (void) WriteBlob(image,export_info.bytes_exported,pixels); (void) ExportImagePixelArea(image,YellowQuantum,quantum_size,pixels, - &export_options,&export_info); + &export_options,&export_info); (void) WriteBlob(image,export_info.bytes_exported,pixels); (void) ExportImagePixelArea(image,BlackQuantum,quantum_size,pixels, - &export_options,&export_info); + &export_options,&export_info); (void) WriteBlob(image,export_info.bytes_exported,pixels); if (LocaleCompare(image_info->magick,"CMYKA") == 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; @@ -797,7 +845,7 @@ static unsigned int WriteCMYKImage(const if (p == (const PixelPacket *) NULL) break; (void) ExportImagePixelArea(image,CyanQuantum,quantum_size,pixels, - &export_options,&export_info); + &export_options,&export_info); (void) WriteBlob(image,export_info.bytes_exported,pixels); } if (image_info->interlace == PartitionInterlace) @@ -811,7 +859,7 @@ static unsigned int WriteCMYKImage(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++) { @@ -819,7 +867,7 @@ static unsigned int WriteCMYKImage(const if (p == (const PixelPacket *) NULL) break; (void) ExportImagePixelArea(image,MagentaQuantum,quantum_size,pixels, - &export_options,&export_info); + &export_options,&export_info); (void) WriteBlob(image,export_info.bytes_exported,pixels); } if (image_info->interlace == PartitionInterlace) @@ -833,7 +881,7 @@ static unsigned int WriteCMYKImage(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++) { @@ -841,7 +889,7 @@ static unsigned int WriteCMYKImage(const if (p == (const PixelPacket *) NULL) break; (void) ExportImagePixelArea(image,YellowQuantum,quantum_size,pixels, - &export_options,&export_info); + &export_options,&export_info); (void) WriteBlob(image,export_info.bytes_exported,pixels); } if (image_info->interlace == PartitionInterlace) @@ -855,7 +903,7 @@ static unsigned int WriteCMYKImage(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++) { @@ -863,14 +911,14 @@ static unsigned int WriteCMYKImage(const if (p == (const PixelPacket *) NULL) break; (void) ExportImagePixelArea(image,BlackQuantum,quantum_size,pixels, - &export_options,&export_info); + &export_options,&export_info); (void) WriteBlob(image,export_info.bytes_exported,pixels); } if (LocaleCompare(image_info->magick,"CMYKA") == 0) { if (!MagickMonitorFormatted(300,400,&image->exception, SaveImageText,image->filename, - image->columns,image->rows)) + image->columns,image->rows)) break; if (image_info->interlace == PartitionInterlace) { @@ -888,7 +936,7 @@ static unsigned int WriteCMYKImage(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