From dede8409341ba16c068cb3f733af8ccbe714f7f0 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sat, 24 Mar 2018 17:51:58 +0100 Subject: [PATCH] Fixed memory leaks reported in #1041 and improved the error messages. --- coders/bgr.c | 121 +++++++++------------- coders/cmyk.c | 168 +++++++++++-------------------- coders/gray.c | 267 +++++++++---------------------------------------- coders/rgb.c | 156 ++++++++++++----------------- coders/ycbcr.c | 212 +++++++++++++++++++++++---------------- 5 files changed, 339 insertions(+), 585 deletions(-) diff --git a/coders/bgr.c b/coders/bgr.c index f26459d69..308775297 100644 --- a/coders/bgr.c +++ b/coders/bgr.c @@ -202,6 +202,7 @@ static Image *ReadBGRImage(const ImageInfo *image_info, count=0; length=0; scene=0; + status=MagickTrue; do { /* @@ -212,7 +213,7 @@ static Image *ReadBGRImage(const ImageInfo *image_info, break; status=SetImageExtent(image,image->columns,image->rows,exception); if (status == MagickFalse) - return(DestroyImageList(image)); + break; switch (image_info->interlace) { case NoInterlace: @@ -226,8 +227,6 @@ static Image *ReadBGRImage(const ImageInfo *image_info, length=GetQuantumExtent(canvas_image,quantum_info,quantum_type); pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } for (y=0; y < (ssize_t) image->extract_info.height; y++) { @@ -242,6 +241,7 @@ static Image *ReadBGRImage(const ImageInfo *image_info, if (count != (ssize_t) length) { + status=MagickFalse; ThrowFileException(exception,CorruptImageError, "UnexpectedEndOfFile",image->filename); break; @@ -287,8 +287,6 @@ static Image *ReadBGRImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } break; } @@ -311,8 +309,6 @@ static Image *ReadBGRImage(const ImageInfo *image_info, length=GetQuantumExtent(canvas_image,quantum_info,RedQuantum); pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } for (y=0; y < (ssize_t) image->extract_info.height; y++) { @@ -327,6 +323,7 @@ static Image *ReadBGRImage(const ImageInfo *image_info, if (count != (ssize_t) length) { + status=MagickFalse; ThrowFileException(exception,CorruptImageError, "UnexpectedEndOfFile",image->filename); break; @@ -392,8 +389,6 @@ static Image *ReadBGRImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -415,8 +410,6 @@ static Image *ReadBGRImage(const ImageInfo *image_info, length=GetQuantumExtent(canvas_image,quantum_info,RedQuantum); pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } for (y=0; y < (ssize_t) image->extract_info.height; y++) { @@ -431,6 +424,7 @@ static Image *ReadBGRImage(const ImageInfo *image_info, if (count != (ssize_t) length) { + status=MagickFalse; ThrowFileException(exception,CorruptImageError, "UnexpectedEndOfFile",image->filename); break; @@ -464,8 +458,6 @@ static Image *ReadBGRImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -486,6 +478,7 @@ static Image *ReadBGRImage(const ImageInfo *image_info, if (count != (ssize_t) length) { + status=MagickFalse; ThrowFileException(exception,CorruptImageError, "UnexpectedEndOfFile",image->filename); break; @@ -519,8 +512,6 @@ static Image *ReadBGRImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -541,6 +532,7 @@ static Image *ReadBGRImage(const ImageInfo *image_info, if (count != (ssize_t) length) { + status=MagickFalse; ThrowFileException(exception,CorruptImageError, "UnexpectedEndOfFile",image->filename); break; @@ -574,8 +566,6 @@ static Image *ReadBGRImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -604,6 +594,7 @@ static Image *ReadBGRImage(const ImageInfo *image_info, if (count != (ssize_t) length) { + status=MagickFalse; ThrowFileException(exception,CorruptImageError, "UnexpectedEndOfFile",image->filename); break; @@ -638,8 +629,6 @@ static Image *ReadBGRImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -664,31 +653,29 @@ static Image *ReadBGRImage(const ImageInfo *image_info, AppendImageFormat("B",image->filename); status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); if (status == MagickFalse) + break; + if (DiscardBlobBytes(image,(MagickSizeType) image->offset) == MagickFalse) { - canvas_image=DestroyImageList(canvas_image); - image=DestroyImageList(image); - return((Image *) NULL); + status=MagickFalse; + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + break; } - if (DiscardBlobBytes(image,image->offset) == MagickFalse) - ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", - image->filename); length=GetQuantumExtent(canvas_image,quantum_info,BlueQuantum); for (i=0; i < (ssize_t) scene; i++) + { for (y=0; y < (ssize_t) image->extract_info.height; y++) { pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); if (count != (ssize_t) length) - { - ThrowFileException(exception,CorruptImageError, - "UnexpectedEndOfFile",image->filename); - break; - } + break; } + if (count != (ssize_t) length) + break; + } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; for (y=0; y < (ssize_t) image->extract_info.height; y++) { register const Quantum @@ -702,6 +689,7 @@ static Image *ReadBGRImage(const ImageInfo *image_info, if (count != (ssize_t) length) { + status=MagickFalse; ThrowFileException(exception,CorruptImageError, "UnexpectedEndOfFile",image->filename); break; @@ -735,8 +723,6 @@ static Image *ReadBGRImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -748,28 +734,22 @@ static Image *ReadBGRImage(const ImageInfo *image_info, AppendImageFormat("G",image->filename); status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); if (status == MagickFalse) - { - canvas_image=DestroyImageList(canvas_image); - image=DestroyImageList(image); - return((Image *) NULL); - } + break; length=GetQuantumExtent(canvas_image,quantum_info,GreenQuantum); for (i=0; i < (ssize_t) scene; i++) + { for (y=0; y < (ssize_t) image->extract_info.height; y++) { pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); if (count != (ssize_t) length) - { - ThrowFileException(exception,CorruptImageError, - "UnexpectedEndOfFile",image->filename); - break; - } + break; } + if (count != (ssize_t) length) + break; + } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; for (y=0; y < (ssize_t) image->extract_info.height; y++) { register const Quantum @@ -783,6 +763,7 @@ static Image *ReadBGRImage(const ImageInfo *image_info, if (count != (ssize_t) length) { + status=MagickFalse; ThrowFileException(exception,CorruptImageError, "UnexpectedEndOfFile",image->filename); break; @@ -816,8 +797,6 @@ static Image *ReadBGRImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -829,28 +808,22 @@ static Image *ReadBGRImage(const ImageInfo *image_info, AppendImageFormat("R",image->filename); status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); if (status == MagickFalse) - { - canvas_image=DestroyImageList(canvas_image); - image=DestroyImageList(image); - return((Image *) NULL); - } + break; length=GetQuantumExtent(canvas_image,quantum_info,RedQuantum); for (i=0; i < (ssize_t) scene; i++) + { for (y=0; y < (ssize_t) image->extract_info.height; y++) { pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); if (count != (ssize_t) length) - { - ThrowFileException(exception,CorruptImageError, - "UnexpectedEndOfFile",image->filename); - break; - } + break; } + if (count != (ssize_t) length) + break; + } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; for (y=0; y < (ssize_t) image->extract_info.height; y++) { register const Quantum @@ -864,6 +837,7 @@ static Image *ReadBGRImage(const ImageInfo *image_info, if (count != (ssize_t) length) { + status=MagickFalse; ThrowFileException(exception,CorruptImageError, "UnexpectedEndOfFile",image->filename); break; @@ -897,8 +871,6 @@ static Image *ReadBGRImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -912,28 +884,22 @@ static Image *ReadBGRImage(const ImageInfo *image_info, AppendImageFormat("A",image->filename); status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); if (status == MagickFalse) - { - canvas_image=DestroyImageList(canvas_image); - image=DestroyImageList(image); - return((Image *) NULL); - } + break; length=GetQuantumExtent(canvas_image,quantum_info,AlphaQuantum); for (i=0; i < (ssize_t) scene; i++) + { for (y=0; y < (ssize_t) image->extract_info.height; y++) { pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); if (count != (ssize_t) length) - { - ThrowFileException(exception,CorruptImageError, - "UnexpectedEndOfFile",image->filename); - break; - } + break; } + if (count != (ssize_t) length) + break; + } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; for (y=0; y < (ssize_t) image->extract_info.height; y++) { register const Quantum @@ -947,6 +913,7 @@ static Image *ReadBGRImage(const ImageInfo *image_info, if (count != (ssize_t) length) { + status=MagickFalse; ThrowFileException(exception,CorruptImageError, "UnexpectedEndOfFile",image->filename); break; @@ -980,8 +947,6 @@ static Image *ReadBGRImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -1000,6 +965,8 @@ static Image *ReadBGRImage(const ImageInfo *image_info, break; } } + if (status == MagickFalse) + break; SetQuantumImageType(image,quantum_type); /* Proceed to next image. @@ -1029,6 +996,8 @@ static Image *ReadBGRImage(const ImageInfo *image_info, quantum_info=DestroyQuantumInfo(quantum_info); canvas_image=DestroyImage(canvas_image); (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); return(GetFirstImageInList(image)); } diff --git a/coders/cmyk.c b/coders/cmyk.c index 74c7eafbc..cd14c076d 100644 --- a/coders/cmyk.c +++ b/coders/cmyk.c @@ -168,7 +168,10 @@ static Image *ReadCMYKImage(const ImageInfo *image_info, exception); quantum_info=AcquireQuantumInfo(image_info,canvas_image); if (quantum_info == (QuantumInfo *) NULL) - ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + { + canvas_image=DestroyImage(canvas_image); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } quantum_type=CMYKQuantum; if (LocaleCompare(image_info->magick,"CMYKA") == 0) { @@ -222,8 +225,6 @@ static Image *ReadCMYKImage(const ImageInfo *image_info, length=GetQuantumExtent(canvas_image,quantum_info,quantum_type); pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } for (y=0; y < (ssize_t) image->extract_info.height; y++) { @@ -284,8 +285,6 @@ static Image *ReadCMYKImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } break; } @@ -309,29 +308,27 @@ static Image *ReadCMYKImage(const ImageInfo *image_info, length=GetQuantumExtent(canvas_image,quantum_info,CyanQuantum); pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } for (y=0; y < (ssize_t) image->extract_info.height; y++) { - register const Quantum - *magick_restrict p; + for (i=0; i < (ssize_t) (image->alpha_trait != UndefinedPixelTrait ? 5 : 4); i++) + { + register const Quantum + *magick_restrict p; - register Quantum - *magick_restrict q; + register Quantum + *magick_restrict q; - register ssize_t - x; + register ssize_t + x; - if (count != (ssize_t) length) - { - status=MagickFalse; - ThrowFileException(exception,CorruptImageError, - "UnexpectedEndOfFile",image->filename); - break; - } - for (i=0; i < (ssize_t) (image->alpha_trait != UndefinedPixelTrait ? 5 : 4); i++) - { + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } quantum_type=quantum_types[i]; q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, exception); @@ -390,8 +387,6 @@ static Image *ReadCMYKImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -413,8 +408,6 @@ static Image *ReadCMYKImage(const ImageInfo *image_info, length=GetQuantumExtent(canvas_image,quantum_info,CyanQuantum); pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } for (y=0; y < (ssize_t) image->extract_info.height; y++) { @@ -462,8 +455,6 @@ static Image *ReadCMYKImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -517,8 +508,6 @@ static Image *ReadCMYKImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -572,8 +561,6 @@ static Image *ReadCMYKImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -627,8 +614,6 @@ static Image *ReadCMYKImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -685,8 +670,6 @@ static Image *ReadCMYKImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -711,32 +694,29 @@ static Image *ReadCMYKImage(const ImageInfo *image_info, AppendImageFormat("C",image->filename); status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); if (status == MagickFalse) + break; + if (DiscardBlobBytes(image,(MagickSizeType) image->offset) == MagickFalse) { - canvas_image=DestroyImageList(canvas_image); - image=DestroyImageList(image); - return((Image *) NULL); + status=MagickFalse; + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + break; } - if (DiscardBlobBytes(image,(MagickSizeType) image->offset) == MagickFalse) - ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", - image->filename); length=GetQuantumExtent(canvas_image,quantum_info,CyanQuantum); for (i=0; i < (ssize_t) scene; i++) + { for (y=0; y < (ssize_t) image->extract_info.height; y++) { pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); if (count != (ssize_t) length) - { - status=MagickFalse; - ThrowFileException(exception,CorruptImageError, - "UnexpectedEndOfFile",image->filename); - break; - } + break; } + if (count != (ssize_t) length) + break; + } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; for (y=0; y < (ssize_t) image->extract_info.height; y++) { register const Quantum @@ -783,8 +763,6 @@ static Image *ReadCMYKImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -796,29 +774,22 @@ static Image *ReadCMYKImage(const ImageInfo *image_info, AppendImageFormat("M",image->filename); status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); if (status == MagickFalse) - { - canvas_image=DestroyImageList(canvas_image); - image=DestroyImageList(image); - return((Image *) NULL); - } + break; length=GetQuantumExtent(canvas_image,quantum_info,MagentaQuantum); for (i=0; i < (ssize_t) scene; i++) + { for (y=0; y < (ssize_t) image->extract_info.height; y++) { pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); if (count != (ssize_t) length) - { - status=MagickFalse; - ThrowFileException(exception,CorruptImageError, - "UnexpectedEndOfFile",image->filename); - break; - } + break; } + if (count != (ssize_t) length) + break; + } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; for (y=0; y < (ssize_t) image->extract_info.height; y++) { register const Quantum @@ -865,8 +836,6 @@ static Image *ReadCMYKImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -878,29 +847,22 @@ static Image *ReadCMYKImage(const ImageInfo *image_info, AppendImageFormat("Y",image->filename); status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); if (status == MagickFalse) - { - canvas_image=DestroyImageList(canvas_image); - image=DestroyImageList(image); - return((Image *) NULL); - } + break; length=GetQuantumExtent(canvas_image,quantum_info,YellowQuantum); for (i=0; i < (ssize_t) scene; i++) + { for (y=0; y < (ssize_t) image->extract_info.height; y++) { pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); if (count != (ssize_t) length) - { - status=MagickFalse; - ThrowFileException(exception,CorruptImageError, - "UnexpectedEndOfFile",image->filename); - break; - } + break; } + if (count != (ssize_t) length) + break; + } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; for (y=0; y < (ssize_t) image->extract_info.height; y++) { register const Quantum @@ -948,8 +910,6 @@ static Image *ReadCMYKImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -961,29 +921,22 @@ static Image *ReadCMYKImage(const ImageInfo *image_info, AppendImageFormat("K",image->filename); status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); if (status == MagickFalse) - { - canvas_image=DestroyImageList(canvas_image); - image=DestroyImageList(image); - return((Image *) NULL); - } + break; length=GetQuantumExtent(canvas_image,quantum_info,BlackQuantum); for (i=0; i < (ssize_t) scene; i++) + { for (y=0; y < (ssize_t) image->extract_info.height; y++) { pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); if (count != (ssize_t) length) - { - status=MagickFalse; - ThrowFileException(exception,CorruptImageError, - "UnexpectedEndOfFile",image->filename); - break; - } + break; } + if (count != (ssize_t) length) + break; + } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; for (y=0; y < (ssize_t) image->extract_info.height; y++) { register const Quantum @@ -1031,8 +984,6 @@ static Image *ReadCMYKImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -1046,29 +997,22 @@ static Image *ReadCMYKImage(const ImageInfo *image_info, AppendImageFormat("A",image->filename); status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); if (status == MagickFalse) - { - canvas_image=DestroyImageList(canvas_image); - image=DestroyImageList(image); - return((Image *) NULL); - } + break; length=GetQuantumExtent(canvas_image,quantum_info,AlphaQuantum); for (i=0; i < (ssize_t) scene; i++) + { for (y=0; y < (ssize_t) image->extract_info.height; y++) { pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); if (count != (ssize_t) length) - { - status=MagickFalse; - ThrowFileException(exception,CorruptImageError, - "UnexpectedEndOfFile",image->filename); - break; - } + break; } + if (count != (ssize_t) length) + break; + } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; for (y=0; y < (ssize_t) image->extract_info.height; y++) { register const Quantum @@ -1116,8 +1060,6 @@ static Image *ReadCMYKImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -1135,6 +1077,8 @@ static Image *ReadCMYKImage(const ImageInfo *image_info, break; } } + if (status == MagickFalse) + break; SetQuantumImageType(image,quantum_type); /* Proceed to next image. diff --git a/coders/gray.c b/coders/gray.c index 8aedd64fc..ec4f29945 100644 --- a/coders/gray.c +++ b/coders/gray.c @@ -166,7 +166,10 @@ static Image *ReadGRAYImage(const ImageInfo *image_info, exception); quantum_info=AcquireQuantumInfo(image_info,canvas_image); if (quantum_info == (QuantumInfo *) NULL) - ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + { + canvas_image=DestroyImage(canvas_image); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } quantum_type=GrayQuantum; if (LocaleCompare(image_info->magick,"GRAYA") == 0) { @@ -194,6 +197,7 @@ static Image *ReadGRAYImage(const ImageInfo *image_info, count=0; length=0; scene=0; + status=MagickTrue; do { /* @@ -204,7 +208,7 @@ static Image *ReadGRAYImage(const ImageInfo *image_info, break; status=SetImageExtent(image,image->columns,image->rows,exception); if (status == MagickFalse) - return(DestroyImageList(image)); + break; switch (image_info->interlace) { case NoInterlace: @@ -218,8 +222,6 @@ static Image *ReadGRAYImage(const ImageInfo *image_info, length=GetQuantumExtent(canvas_image,quantum_info,quantum_type); pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } for (y=0; y < (ssize_t) image->extract_info.height; y++) { @@ -234,6 +236,7 @@ static Image *ReadGRAYImage(const ImageInfo *image_info, if (count != (ssize_t) length) { + status=MagickFalse; ThrowFileException(exception,CorruptImageError, "UnexpectedEndOfFile",image->filename); break; @@ -278,8 +281,6 @@ static Image *ReadGRAYImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } break; } @@ -300,28 +301,27 @@ static Image *ReadGRAYImage(const ImageInfo *image_info, length=GetQuantumExtent(canvas_image,quantum_info,RedQuantum); pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } for (y=0; y < (ssize_t) image->extract_info.height; y++) { - register const Quantum - *magick_restrict p; + for (i=0; i < (ssize_t) (image->alpha_trait != UndefinedPixelTrait ? 4 : 3); i++) + { + register const Quantum + *magick_restrict p; - register Quantum - *magick_restrict q; + register Quantum + *magick_restrict q; - register ssize_t - x; + register ssize_t + x; - if (count != (ssize_t) length) - { - ThrowFileException(exception,CorruptImageError, - "UnexpectedEndOfFile",image->filename); - break; - } - for (i=0; i < (ssize_t) (image->alpha_trait != UndefinedPixelTrait ? 4 : 3); i++) - { + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } quantum_type=quantum_types[i]; q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, exception); @@ -365,8 +365,6 @@ static Image *ReadGRAYImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -388,8 +386,6 @@ static Image *ReadGRAYImage(const ImageInfo *image_info, length=GetQuantumExtent(canvas_image,quantum_info,RedQuantum); pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } for (y=0; y < (ssize_t) image->extract_info.height; y++) { @@ -404,6 +400,7 @@ static Image *ReadGRAYImage(const ImageInfo *image_info, if (count != (ssize_t) length) { + status=MagickFalse; ThrowFileException(exception,CorruptImageError, "UnexpectedEndOfFile",image->filename); break; @@ -436,8 +433,6 @@ static Image *ReadGRAYImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -460,6 +455,7 @@ static Image *ReadGRAYImage(const ImageInfo *image_info, if (count != (ssize_t) length) { + status=MagickFalse; ThrowFileException(exception,CorruptImageError, "UnexpectedEndOfFile",image->filename); break; @@ -493,8 +489,6 @@ static Image *ReadGRAYImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -516,34 +510,32 @@ static Image *ReadGRAYImage(const ImageInfo *image_info, /* Partition interlacing: G..., G..., G... */ - AppendImageFormat("R",image->filename); + AppendImageFormat("G",image->filename); status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); if (status == MagickFalse) + break; + if (DiscardBlobBytes(image,(MagickSizeType) image->offset) == MagickFalse) { - canvas_image=DestroyImageList(canvas_image); - image=DestroyImageList(image); - return((Image *) NULL); + status=MagickFalse; + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + break; } - if (DiscardBlobBytes(image,(MagickSizeType) image->offset) == MagickFalse) - ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", - image->filename); length=GetQuantumExtent(canvas_image,quantum_info,RedQuantum); for (i=0; i < (ssize_t) scene; i++) + { for (y=0; y < (ssize_t) image->extract_info.height; y++) { pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); if (count != (ssize_t) length) - { - ThrowFileException(exception,CorruptImageError, - "UnexpectedEndOfFile",image->filename); - break; - } + break; } + if (count != (ssize_t) length) + break; + } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; for (y=0; y < (ssize_t) image->extract_info.height; y++) { register const Quantum @@ -557,6 +549,7 @@ static Image *ReadGRAYImage(const ImageInfo *image_info, if (count != (ssize_t) length) { + status=MagickFalse; ThrowFileException(exception,CorruptImageError, "UnexpectedEndOfFile",image->filename); break; @@ -589,8 +582,6 @@ static Image *ReadGRAYImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -599,193 +590,28 @@ static Image *ReadGRAYImage(const ImageInfo *image_info, break; } (void) CloseBlob(image); - AppendImageFormat("G",image->filename); - status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); - if (status == MagickFalse) - { - canvas_image=DestroyImageList(canvas_image); - image=DestroyImageList(image); - return((Image *) NULL); - } - length=GetQuantumExtent(canvas_image,quantum_info,GreenQuantum); - for (i=0; i < (ssize_t) scene; i++) - for (y=0; y < (ssize_t) image->extract_info.height; y++) - { - pixels=(const unsigned char *) ReadBlobStream(image,length, - GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - { - ThrowFileException(exception,CorruptImageError, - "UnexpectedEndOfFile",image->filename); - break; - } - } - pixels=(const unsigned char *) ReadBlobStream(image,length, - GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; - for (y=0; y < (ssize_t) image->extract_info.height; y++) - { - register const Quantum - *magick_restrict p; - - register Quantum - *magick_restrict q; - - register ssize_t - x; - - if (count != (ssize_t) length) - { - ThrowFileException(exception,CorruptImageError, - "UnexpectedEndOfFile",image->filename); - break; - } - q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, - exception); - if (q == (Quantum *) NULL) - break; - length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, - quantum_info,GreenQuantum,pixels,exception); - if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) - break; - if (((y-image->extract_info.y) >= 0) && - ((y-image->extract_info.y) < (ssize_t) image->rows)) - { - p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, - canvas_image->columns,1,exception); - q=GetAuthenticPixels(image,0,y-image->extract_info.y, - image->columns,1,exception); - if ((p == (const Quantum *) NULL) || (q == (Quantum *) NULL)) - break; - for (x=0; x < (ssize_t) image->columns; x++) - { - SetPixelGreen(image,GetPixelGreen(canvas_image,p),q); - p+=GetPixelChannels(canvas_image); - q+=GetPixelChannels(image); - } - if (SyncAuthenticPixels(image,exception) == MagickFalse) - break; - } - pixels=(const unsigned char *) ReadBlobStream(image,length, - GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; - } - if (image->previous == (Image *) NULL) - { - status=SetImageProgress(image,LoadImageTag,2,5); - if (status == MagickFalse) - break; - } - (void) CloseBlob(image); - AppendImageFormat("B",image->filename); - status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); - if (status == MagickFalse) - { - canvas_image=DestroyImageList(canvas_image); - image=DestroyImageList(image); - return((Image *) NULL); - } - length=GetQuantumExtent(canvas_image,quantum_info,BlueQuantum); - for (i=0; i < (ssize_t) scene; i++) - for (y=0; y < (ssize_t) image->extract_info.height; y++) - { - pixels=(const unsigned char *) ReadBlobStream(image,length, - GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - { - ThrowFileException(exception,CorruptImageError, - "UnexpectedEndOfFile",image->filename); - break; - } - } - pixels=(const unsigned char *) ReadBlobStream(image,length, - GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; - for (y=0; y < (ssize_t) image->extract_info.height; y++) - { - register const Quantum - *magick_restrict p; - - register Quantum - *magick_restrict q; - - register ssize_t - x; - - if (count != (ssize_t) length) - { - ThrowFileException(exception,CorruptImageError, - "UnexpectedEndOfFile",image->filename); - break; - } - q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, - exception); - if (q == (Quantum *) NULL) - break; - length=ImportQuantumPixels(canvas_image,(CacheView *) NULL, - quantum_info,BlueQuantum,pixels,exception); - if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse) - break; - if (((y-image->extract_info.y) >= 0) && - ((y-image->extract_info.y) < (ssize_t) image->rows)) - { - p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0, - canvas_image->columns,1,exception); - q=GetAuthenticPixels(image,0,y-image->extract_info.y, - image->columns,1,exception); - if ((p == (const Quantum *) NULL) || (q == (Quantum *) NULL)) - break; - for (x=0; x < (ssize_t) image->columns; x++) - { - SetPixelBlue(image,GetPixelBlue(canvas_image,p),q); - p+=GetPixelChannels(canvas_image); - q+=GetPixelChannels(image); - } - if (SyncAuthenticPixels(image,exception) == MagickFalse) - break; - } - pixels=(const unsigned char *) ReadBlobStream(image,length, - GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; - } - if (image->previous == (Image *) NULL) - { - status=SetImageProgress(image,LoadImageTag,3,5); - if (status == MagickFalse) - break; - } if (image->alpha_trait != UndefinedPixelTrait) { (void) CloseBlob(image); AppendImageFormat("A",image->filename); status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); if (status == MagickFalse) - { - canvas_image=DestroyImageList(canvas_image); - image=DestroyImageList(image); - return((Image *) NULL); - } + break; length=GetQuantumExtent(canvas_image,quantum_info,AlphaQuantum); for (i=0; i < (ssize_t) scene; i++) + { for (y=0; y < (ssize_t) image->extract_info.height; y++) { pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); if (count != (ssize_t) length) - { - ThrowFileException(exception,CorruptImageError, - "UnexpectedEndOfFile",image->filename); - break; - } + break; } + if (count != (ssize_t) length) + break; + } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; for (y=0; y < (ssize_t) image->extract_info.height; y++) { register const Quantum @@ -799,6 +625,7 @@ static Image *ReadGRAYImage(const ImageInfo *image_info, if (count != (ssize_t) length) { + status=MagickFalse; ThrowFileException(exception,CorruptImageError, "UnexpectedEndOfFile",image->filename); break; @@ -831,8 +658,6 @@ static Image *ReadGRAYImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -851,6 +676,8 @@ static Image *ReadGRAYImage(const ImageInfo *image_info, break; } } + if (status == MagickFalse) + break; SetQuantumImageType(image,quantum_type); /* Proceed to next image. @@ -880,6 +707,8 @@ static Image *ReadGRAYImage(const ImageInfo *image_info, quantum_info=DestroyQuantumInfo(quantum_info); canvas_image=DestroyImage(canvas_image); (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); return(GetFirstImageInList(image)); } diff --git a/coders/rgb.c b/coders/rgb.c index ac3ebff4e..f3dc377ec 100644 --- a/coders/rgb.c +++ b/coders/rgb.c @@ -164,7 +164,10 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) exception); quantum_info=AcquireQuantumInfo(image_info,canvas_image); if (quantum_info == (QuantumInfo *) NULL) - ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + { + canvas_image=DestroyImage(canvas_image); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } quantum_type=RGBQuantum; if (LocaleCompare(image_info->magick,"RGBA") == 0) { @@ -198,6 +201,7 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) count=0; length=0; scene=0; + status=MagickTrue; do { /* @@ -208,7 +212,7 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) break; status=SetImageExtent(image,image->columns,image->rows,exception); if (status == MagickFalse) - return(DestroyImageList(image)); + break; switch (image_info->interlace) { case NoInterlace: @@ -222,8 +226,6 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) length=GetQuantumExtent(canvas_image,quantum_info,quantum_type); pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } for (y=0; y < (ssize_t) image->extract_info.height; y++) { @@ -238,6 +240,7 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) if (count != (ssize_t) length) { + status=MagickFalse; ThrowFileException(exception,CorruptImageError, "UnexpectedEndOfFile",image->filename); break; @@ -282,8 +285,6 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } break; } @@ -308,28 +309,27 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) length=GetQuantumExtent(canvas_image,quantum_info,RedQuantum); pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } for (y=0; y < (ssize_t) image->extract_info.height; y++) { - register const Quantum - *magick_restrict p; + for (i=0; i < (ssize_t) (image->alpha_trait != UndefinedPixelTrait ? 4 : 3); i++) + { + register const Quantum + *magick_restrict p; - register Quantum - *magick_restrict q; + register Quantum + *magick_restrict q; - register ssize_t - x; + register ssize_t + x; - if (count != (ssize_t) length) - { - ThrowFileException(exception,CorruptImageError, - "UnexpectedEndOfFile",image->filename); - break; - } - for (i=0; i < (ssize_t) (image->alpha_trait != UndefinedPixelTrait ? 4 : 3); i++) - { + if (count != (ssize_t) length) + { + status=MagickFalse; + ThrowFileException(exception,CorruptImageError, + "UnexpectedEndOfFile",image->filename); + break; + } quantum_type=quantum_types[i]; q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1, exception); @@ -388,8 +388,6 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -411,8 +409,6 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) length=GetQuantumExtent(canvas_image,quantum_info,RedQuantum); pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } for (y=0; y < (ssize_t) image->extract_info.height; y++) { @@ -427,6 +423,7 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) if (count != (ssize_t) length) { + status=MagickFalse; ThrowFileException(exception,CorruptImageError, "UnexpectedEndOfFile",image->filename); break; @@ -459,8 +456,6 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -481,6 +476,7 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) if (count != (ssize_t) length) { + status=MagickFalse; ThrowFileException(exception,CorruptImageError, "UnexpectedEndOfFile",image->filename); break; @@ -513,8 +509,6 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -535,6 +529,7 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) if (count != (ssize_t) length) { + status=MagickFalse; ThrowFileException(exception,CorruptImageError, "UnexpectedEndOfFile",image->filename); break; @@ -567,8 +562,6 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -591,6 +584,7 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) if (count != (ssize_t) length) { + status=MagickFalse; ThrowFileException(exception,CorruptImageError, "UnexpectedEndOfFile",image->filename); break; @@ -624,8 +618,6 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -650,31 +642,29 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) AppendImageFormat("R",image->filename); status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); if (status == MagickFalse) + break; + if (DiscardBlobBytes(image,(MagickSizeType) image->offset) == MagickFalse) { - canvas_image=DestroyImageList(canvas_image); - image=DestroyImageList(image); - return((Image *) NULL); + status=MagickFalse; + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + break; } - if (DiscardBlobBytes(image,(MagickSizeType) image->offset) == MagickFalse) - ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", - image->filename); length=GetQuantumExtent(canvas_image,quantum_info,RedQuantum); for (i=0; i < (ssize_t) scene; i++) + { for (y=0; y < (ssize_t) image->extract_info.height; y++) { pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); if (count != (ssize_t) length) - { - ThrowFileException(exception,CorruptImageError, - "UnexpectedEndOfFile",image->filename); - break; - } + break; } + if (count != (ssize_t) length) + break; + } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; for (y=0; y < (ssize_t) image->extract_info.height; y++) { register const Quantum @@ -688,6 +678,7 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) if (count != (ssize_t) length) { + status=MagickFalse; ThrowFileException(exception,CorruptImageError, "UnexpectedEndOfFile",image->filename); break; @@ -720,8 +711,6 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -733,28 +722,22 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) AppendImageFormat("G",image->filename); status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); if (status == MagickFalse) - { - canvas_image=DestroyImageList(canvas_image); - image=DestroyImageList(image); - return((Image *) NULL); - } + break; length=GetQuantumExtent(canvas_image,quantum_info,GreenQuantum); for (i=0; i < (ssize_t) scene; i++) + { for (y=0; y < (ssize_t) image->extract_info.height; y++) { pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); if (count != (ssize_t) length) - { - ThrowFileException(exception,CorruptImageError, - "UnexpectedEndOfFile",image->filename); - break; - } + break; } + if (count != (ssize_t) length) + break; + } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; for (y=0; y < (ssize_t) image->extract_info.height; y++) { register const Quantum @@ -768,6 +751,7 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) if (count != (ssize_t) length) { + status=MagickFalse; ThrowFileException(exception,CorruptImageError, "UnexpectedEndOfFile",image->filename); break; @@ -800,8 +784,6 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -813,28 +795,22 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) AppendImageFormat("B",image->filename); status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); if (status == MagickFalse) - { - canvas_image=DestroyImageList(canvas_image); - image=DestroyImageList(image); - return((Image *) NULL); - } + break; length=GetQuantumExtent(canvas_image,quantum_info,BlueQuantum); for (i=0; i < (ssize_t) scene; i++) + { for (y=0; y < (ssize_t) image->extract_info.height; y++) { pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); if (count != (ssize_t) length) - { - ThrowFileException(exception,CorruptImageError, - "UnexpectedEndOfFile",image->filename); - break; - } - } + break; + } + if (count != (ssize_t) length) + break; + } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; for (y=0; y < (ssize_t) image->extract_info.height; y++) { register const Quantum @@ -848,6 +824,7 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) if (count != (ssize_t) length) { + status=MagickFalse; ThrowFileException(exception,CorruptImageError, "UnexpectedEndOfFile",image->filename); break; @@ -880,8 +857,6 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -895,28 +870,22 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) AppendImageFormat("A",image->filename); status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); if (status == MagickFalse) - { - canvas_image=DestroyImageList(canvas_image); - image=DestroyImageList(image); - return((Image *) NULL); - } + break; length=GetQuantumExtent(canvas_image,quantum_info,AlphaQuantum); for (i=0; i < (ssize_t) scene; i++) + { for (y=0; y < (ssize_t) image->extract_info.height; y++) { pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); if (count != (ssize_t) length) - { - ThrowFileException(exception,CorruptImageError, - "UnexpectedEndOfFile",image->filename); - break; - } + break; } + if (count != (ssize_t) length) + break; + } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; for (y=0; y < (ssize_t) image->extract_info.height; y++) { register const Quantum @@ -930,6 +899,7 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) if (count != (ssize_t) length) { + status=MagickFalse; ThrowFileException(exception,CorruptImageError, "UnexpectedEndOfFile",image->filename); break; @@ -962,8 +932,6 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -982,6 +950,8 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) break; } } + if (status == MagickFalse) + break; SetQuantumImageType(image,quantum_type); /* Proceed to next image. @@ -1011,6 +981,8 @@ static Image *ReadRGBImage(const ImageInfo *image_info,ExceptionInfo *exception) quantum_info=DestroyQuantumInfo(quantum_info); canvas_image=DestroyImage(canvas_image); (void) CloseBlob(image); + if (status == MagickFalse) + return(DestroyImageList(image)); return(GetFirstImageInList(image)); } diff --git a/coders/ycbcr.c b/coders/ycbcr.c index 8855ade93..da6e238e0 100644 --- a/coders/ycbcr.c +++ b/coders/ycbcr.c @@ -118,15 +118,8 @@ static Image *ReadYCBCRImage(const ImageInfo *image_info, QuantumType quantum_type; - register const Quantum - *p; - register ssize_t - i, - x; - - register Quantum - *q; + i; size_t length; @@ -175,7 +168,10 @@ static Image *ReadYCBCRImage(const ImageInfo *image_info, exception); quantum_info=AcquireQuantumInfo(image_info,canvas_image); if (quantum_info == (QuantumInfo *) NULL) - ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + { + canvas_image=DestroyImage(canvas_image); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } quantum_type=RGBQuantum; if (LocaleCompare(image_info->magick,"YCbCrA") == 0) { @@ -229,11 +225,18 @@ static Image *ReadYCBCRImage(const ImageInfo *image_info, length=GetQuantumExtent(canvas_image,quantum_info,quantum_type); pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } for (y=0; y < (ssize_t) image->extract_info.height; y++) { + register const Quantum + *magick_restrict p; + + register Quantum + *magick_restrict q; + + register ssize_t + x; + if (count != (ssize_t) length) { status=MagickFalse; @@ -281,8 +284,6 @@ static Image *ReadYCBCRImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } break; } @@ -305,13 +306,20 @@ static Image *ReadYCBCRImage(const ImageInfo *image_info, length=GetQuantumExtent(canvas_image,quantum_info,RedQuantum); pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } for (y=0; y < (ssize_t) image->extract_info.height; y++) { for (i=0; i < (ssize_t) (image->alpha_trait != UndefinedPixelTrait ? 4 : 3); i++) { + register const Quantum + *magick_restrict p; + + register Quantum + *magick_restrict q; + + register ssize_t + x; + if (count != (ssize_t) length) { status=MagickFalse; @@ -373,8 +381,6 @@ static Image *ReadYCBCRImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -396,11 +402,18 @@ static Image *ReadYCBCRImage(const ImageInfo *image_info, length=GetQuantumExtent(canvas_image,quantum_info,RedQuantum); pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } for (y=0; y < (ssize_t) image->extract_info.height; y++) { + register const Quantum + *magick_restrict p; + + register Quantum + *magick_restrict q; + + register ssize_t + x; + if (count != (ssize_t) length) { status=MagickFalse; @@ -437,8 +450,6 @@ static Image *ReadYCBCRImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -448,6 +459,15 @@ static Image *ReadYCBCRImage(const ImageInfo *image_info, } for (y=0; y < (ssize_t) image->extract_info.height; y++) { + register const Quantum + *magick_restrict p; + + register Quantum + *magick_restrict q; + + register ssize_t + x; + if (count != (ssize_t) length) { status=MagickFalse; @@ -484,8 +504,6 @@ static Image *ReadYCBCRImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -495,6 +513,15 @@ static Image *ReadYCBCRImage(const ImageInfo *image_info, } for (y=0; y < (ssize_t) image->extract_info.height; y++) { + register const Quantum + *magick_restrict p; + + register Quantum + *magick_restrict q; + + register ssize_t + x; + if (count != (ssize_t) length) { status=MagickFalse; @@ -531,8 +558,6 @@ static Image *ReadYCBCRImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -544,6 +569,15 @@ static Image *ReadYCBCRImage(const ImageInfo *image_info, { for (y=0; y < (ssize_t) image->extract_info.height; y++) { + register const Quantum + *magick_restrict p; + + register Quantum + *magick_restrict q; + + register ssize_t + x; + if (count != (ssize_t) length) { status=MagickFalse; @@ -581,8 +615,6 @@ static Image *ReadYCBCRImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -607,32 +639,40 @@ static Image *ReadYCBCRImage(const ImageInfo *image_info, AppendImageFormat("Y",image->filename); status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); if (status == MagickFalse) + break; + if (DiscardBlobBytes(image,(MagickSizeType) image->offset) == MagickFalse) { - canvas_image=DestroyImageList(canvas_image); - image=DestroyImageList(image); - return((Image *) NULL); + status=MagickFalse; + ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", + image->filename); + break; } - if (DiscardBlobBytes(image,(MagickSizeType) image->offset) == MagickFalse) - ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", - image->filename); length=GetQuantumExtent(canvas_image,quantum_info,RedQuantum); for (i=0; i < (ssize_t) scene; i++) + { for (y=0; y < (ssize_t) image->extract_info.height; y++) { pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); if (count != (ssize_t) length) - { - status=MagickFalse; - ThrowFileException(exception,CorruptImageError, - "UnexpectedEndOfFile",image->filename); - break; - } + break; } + if (count != (ssize_t) length) + break; + } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); for (y=0; y < (ssize_t) image->extract_info.height; y++) { + register const Quantum + *magick_restrict p; + + register Quantum + *magick_restrict q; + + register ssize_t + x; + if (count != (ssize_t) length) { status=MagickFalse; @@ -669,8 +709,6 @@ static Image *ReadYCBCRImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -682,31 +720,33 @@ static Image *ReadYCBCRImage(const ImageInfo *image_info, AppendImageFormat("Cb",image->filename); status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); if (status == MagickFalse) - { - canvas_image=DestroyImageList(canvas_image); - image=DestroyImageList(image); - return((Image *) NULL); - } + break; length=GetQuantumExtent(canvas_image,quantum_info,GreenQuantum); for (i=0; i < (ssize_t) scene; i++) + { for (y=0; y < (ssize_t) image->extract_info.height; y++) { pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); if (count != (ssize_t) length) - { - status=MagickFalse; - ThrowFileException(exception,CorruptImageError, - "UnexpectedEndOfFile",image->filename); - break; - } + break; } + if (count != (ssize_t) length) + break; + } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; for (y=0; y < (ssize_t) image->extract_info.height; y++) { + register const Quantum + *magick_restrict p; + + register Quantum + *magick_restrict q; + + register ssize_t + x; + if (count != (ssize_t) length) { status=MagickFalse; @@ -743,8 +783,6 @@ static Image *ReadYCBCRImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -756,31 +794,33 @@ static Image *ReadYCBCRImage(const ImageInfo *image_info, AppendImageFormat("Cr",image->filename); status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); if (status == MagickFalse) - { - canvas_image=DestroyImageList(canvas_image); - image=DestroyImageList(image); - return((Image *) NULL); - } + break; length=GetQuantumExtent(canvas_image,quantum_info,BlueQuantum); for (i=0; i < (ssize_t) scene; i++) + { for (y=0; y < (ssize_t) image->extract_info.height; y++) { pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); if (count != (ssize_t) length) - { - status=MagickFalse; - ThrowFileException(exception,CorruptImageError, - "UnexpectedEndOfFile",image->filename); - break; - } + break; } + if (count != (ssize_t) length) + break; + } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; for (y=0; y < (ssize_t) image->extract_info.height; y++) { + register const Quantum + *magick_restrict p; + + register Quantum + *magick_restrict q; + + register ssize_t + x; + if (count != (ssize_t) length) { status=MagickFalse; @@ -817,8 +857,6 @@ static Image *ReadYCBCRImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -832,31 +870,33 @@ static Image *ReadYCBCRImage(const ImageInfo *image_info, AppendImageFormat("A",image->filename); status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); if (status == MagickFalse) - { - canvas_image=DestroyImageList(canvas_image); - image=DestroyImageList(image); - return((Image *) NULL); - } + break; length=GetQuantumExtent(canvas_image,quantum_info,AlphaQuantum); for (i=0; i < (ssize_t) scene; i++) + { for (y=0; y < (ssize_t) image->extract_info.height; y++) { pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); if (count != (ssize_t) length) - { - status=MagickFalse; - ThrowFileException(exception,CorruptImageError, - "UnexpectedEndOfFile",image->filename); - break; - } + break; } + if (count != (ssize_t) length) + break; + } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; for (y=0; y < (ssize_t) image->extract_info.height; y++) { + register const Quantum + *magick_restrict p; + + register Quantum + *magick_restrict q; + + register ssize_t + x; + if (count != (ssize_t) length) { status=MagickFalse; @@ -894,8 +934,6 @@ static Image *ReadYCBCRImage(const ImageInfo *image_info, } pixels=(const unsigned char *) ReadBlobStream(image,length, GetQuantumPixels(quantum_info),&count); - if (count != (ssize_t) length) - break; } if (image->previous == (Image *) NULL) { @@ -913,6 +951,8 @@ static Image *ReadYCBCRImage(const ImageInfo *image_info, break; } } + if (status == MagickFalse) + break; SetQuantumImageType(image,quantum_type); /* Proceed to next image. -- 2.40.0