From c1af14f737ae451feaec2a8eb0be98e04a55eee5 Mon Sep 17 00:00:00 2001 From: cristy Date: Thu, 16 Sep 2010 20:01:21 +0000 Subject: [PATCH] --- coders/psd.c | 34 +++++---- magick/blob-private.h | 1 + magick/blob.c | 163 +++++++++++++++++++++--------------------- magick/blob.h | 3 +- 4 files changed, 104 insertions(+), 97 deletions(-) diff --git a/coders/psd.c b/coders/psd.c index 43a2165d2..28771092a 100644 --- a/coders/psd.c +++ b/coders/psd.c @@ -932,13 +932,9 @@ static Image *ReadPSDImage(const ImageInfo *image_info,ExceptionInfo *exception) length=ReadBlobMSBLong(image); } if ((image_info->number_scenes == 1) && (image_info->scene == 0)) - for ( ; length != 0; length--) - if (ReadBlobByte(image) == EOF) - { - ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", - image->filename); - break; - } + if (DiscardBlobBytes(image,length) == MagickFalse) + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); if (length == 0) { if (image->debug != MagickFalse) @@ -958,8 +954,9 @@ static Image *ReadPSDImage(const ImageInfo *image_info,ExceptionInfo *exception) Skip layers & masks. */ quantum=psd_info.version == 1 ? 4UL : 8UL; - for (j=0; j < (ssize_t) (length-quantum); j++) - (void) ReadBlobByte(image); + if (DiscardBlobBytes(image,length-quantum) == MagickFalse) + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); } else { @@ -1068,14 +1065,19 @@ static Image *ReadPSDImage(const ImageInfo *image_info,ExceptionInfo *exception) if (image->debug != MagickFalse) (void) LogMagickEvent(CoderEvent,GetMagickModule(), " layer mask: offset(%.20g,%.20g), size(%.20g,%.20g), length=%.20g", - (double) layer_info[i].mask.x,(double) layer_info[i].mask.y, + (double) layer_info[i].mask.x, + (double) layer_info[i].mask.y, (double) layer_info[i].mask.width,(double) layer_info[i].mask.height,(double) length-16); /* Skip over the rest of the layer mask information. */ - for (j=0; j < (ssize_t) (length-16); j++) - (void) ReadBlobByte(image); + if (DiscardBlobBytes(image,length-16) == MagickFalse) + { + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } } combinedlength+=length+4; /* +4 for length */ length=ReadBlobMSBLong(image); @@ -1157,8 +1159,12 @@ static Image *ReadPSDImage(const ImageInfo *image_info,ExceptionInfo *exception) (void) LogMagickEvent(CoderEvent,GetMagickModule(), " unsupported data: length=%.20g",(double) (size-combinedlength)); - for (j=0; j < (ssize_t) (size-combinedlength); j++) - (void) ReadBlobByte(image); + if (DiscardBlobBytes(image,size-combinedlength) == MagickFalse) + { + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } } /* Allocate layered image. diff --git a/magick/blob-private.h b/magick/blob-private.h index b6459786f..2aa99187d 100644 --- a/magick/blob-private.h +++ b/magick/blob-private.h @@ -75,6 +75,7 @@ extern MagickExport int extern MagickExport MagickBooleanType CloseBlob(Image *), + DiscardBlobBytes(Image *,const size_t), OpenBlob(const ImageInfo *,Image *,const BlobMode,ExceptionInfo *), SetBlobExtent(Image *,const MagickSizeType), UnmapBlob(void *,const size_t); diff --git a/magick/blob.c b/magick/blob.c index ef1442fb2..817e49333 100644 --- a/magick/blob.c +++ b/magick/blob.c @@ -665,6 +665,88 @@ MagickExport unsigned char *DetachBlob(BlobInfo *blob_info) % % % % % % ++ D i s c a r d B l o b B y t e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DiscardBlobBytes() discards bytes in a blob. +% +% The format of the DiscardBlobBytes method is: +% +% MagickBooleanType DiscardBlobBytes(Image *image,const size_t length) +% +% A description of each parameter follows. +% +% o image: the image. +% +% o length: the number of bytes to skip. +% +*/ + +static inline const unsigned char *ReadBlobStream(Image *image, + const size_t length,unsigned char *data,ssize_t *count) +{ + assert(count != (ssize_t *) NULL); + assert(image->blob != (BlobInfo *) NULL); + if (image->blob->type != BlobStream) + { + *count=ReadBlob(image,length,data); + return(data); + } + if (image->blob->offset >= (MagickOffsetType) image->blob->length) + { + *count=0; + image->blob->eof=MagickTrue; + return(data); + } + data=image->blob->data+image->blob->offset; + *count=(ssize_t) MagickMin(length,(size_t) (image->blob->length- + image->blob->offset)); + image->blob->offset+=(*count); + if (*count != (ssize_t) length) + image->blob->eof=MagickTrue; + return(data); +} + +MagickExport MagickBooleanType DiscardBlobBytes(Image *image, + const size_t length) +{ + register ssize_t + i; + + size_t + quantum; + + ssize_t + count; + + unsigned char + buffer[8192]; + + assert(image != (Image *) NULL); + assert(image->signature == MagickSignature); + count=0; + for (i=0; i < (ssize_t) length; i+=count) + { + quantum=MagickMin(length-i,sizeof(buffer)); + (void) ReadBlobStream(image,quantum,buffer,&count); + if (count <= 0) + { + count=0; + if (errno != EINTR) + break; + } + } + return(i < (ssize_t) length ? MagickFalse : MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % + D u p l i c a t e s B l o b % % % % % @@ -1485,32 +1567,6 @@ MagickExport unsigned char *ImageToBlob(const ImageInfo *image_info, % o exception: return any errors or warnings in this structure. % */ - -static inline const unsigned char *ReadBlobStream(Image *image, - const size_t length,unsigned char *data,ssize_t *count) -{ - assert(count != (ssize_t *) NULL); - assert(image->blob != (BlobInfo *) NULL); - if (image->blob->type != BlobStream) - { - *count=ReadBlob(image,length,data); - return(data); - } - if (image->blob->offset >= (MagickOffsetType) image->blob->length) - { - *count=0; - image->blob->eof=MagickTrue; - return(data); - } - data=image->blob->data+image->blob->offset; - *count=(ssize_t) MagickMin(length,(size_t) (image->blob->length- - image->blob->offset)); - image->blob->offset+=(*count); - if (*count != (ssize_t) length) - image->blob->eof=MagickTrue; - return(data); -} - MagickExport MagickBooleanType ImageToFile(Image *image,char *filename, ExceptionInfo *exception) { @@ -3676,61 +3732,6 @@ MagickExport MagickBooleanType SetBlobExtent(Image *image, % % % % % % -+ S k i p B l o b B y t e s % -% % -% % -% % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% SkipBlobBytes() skips over bytes in a blob. -% -% The format of the SkipBlobBytes method is: -% -% MagickBooleanType SkipBlobBytes(Image *image,const size_t length) -% -% A description of each parameter follows. -% -% o image: the image. -% -% o length: the number of bytes to skip. -% -*/ -MagickExport MagickBooleanType SkipBlobBytes(Image *image,const size_t length) -{ - register ssize_t - i; - - size_t - quantum; - - ssize_t - count; - - unsigned char - buffer[8192]; - - assert(image != (Image *) NULL); - assert(image->signature == MagickSignature); - count=0; - for (i=0; i < (ssize_t) length; i+=count) - { - quantum=MagickMin(length-i,sizeof(buffer)); - (void) ReadBlobStream(image,quantum,buffer,&count); - if (count <= 0) - { - count=0; - if (errno != EINTR) - break; - } - } - return(i < (ssize_t) length ? MagickFalse : MagickTrue); -} - -/* -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% % -% % -% % + S y n c B l o b % % % % % diff --git a/magick/blob.h b/magick/blob.h index eb4d71e1f..16dd23c2b 100644 --- a/magick/blob.h +++ b/magick/blob.h @@ -50,8 +50,7 @@ extern MagickExport MagickBooleanType ExceptionInfo *), IsBlobExempt(const Image *), IsBlobSeekable(const Image *), - IsBlobTemporary(const Image *), - SkipBlobBytes(Image *,const size_t); + IsBlobTemporary(const Image *); extern MagickExport MagickSizeType GetBlobSize(const Image *); -- 2.50.1