From: Cristy Date: Fri, 2 Dec 2016 01:06:50 +0000 (-0500) Subject: Fix possible buffer overflow when writing compressed TIFFS X-Git-Tag: 7.0.3-9~22 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e5fd9ab1b70b2edd06de8efb606e04482cb9a2f0;p=imagemagick Fix possible buffer overflow when writing compressed TIFFS --- diff --git a/ChangeLog b/ChangeLog index 1421a6338..8ff3b2fb1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,8 @@ * Support read-masks for the -modulate option. * Prevent buffer overflow when streaming an image (reference https://github.com/ImageMagick/ImageMagick/issues/312). + * Fix possible buffer overflow when writing compressed TIFFS (vulnerability + report from Cisco Talos, CVE-2016-8707). 2016-11-15 7.0.3-8 Cristy * Release ImageMagick version 7.0.3-8, GIT revision 19067:5aceded:20161125. diff --git a/coders/tiff.c b/coders/tiff.c index e108920f3..88a9d41c2 100644 --- a/coders/tiff.c +++ b/coders/tiff.c @@ -1150,7 +1150,7 @@ static Image *ReadTIFFImage(const ImageInfo *image_info, width; unsigned char - *pixels; + *tiff_pixels; /* Open image. @@ -1608,7 +1608,13 @@ RestoreMSCWarning method=ReadTileMethod; quantum_info->endian=LSBEndian; quantum_type=RGBQuantum; - pixels=(unsigned char *) GetQuantumPixels(quantum_info); + tiff_pixels=(unsigned char *) AcquireMagickMemory(TIFFScanlineSize(tiff)+ + sizeof(uint32)); + if (tiff_pixels == (unsigned char *) NULL) + { + TIFFClose(tiff); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } switch (method) { case ReadSingleSampleMethod: @@ -1645,7 +1651,6 @@ RestoreMSCWarning TIFFClose(tiff); ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); } - pixels=(unsigned char *) GetQuantumPixels(quantum_info); for (y=0; y < (ssize_t) image->rows; y++) { int @@ -1654,14 +1659,14 @@ RestoreMSCWarning register Quantum *magick_restrict q; - status=TIFFReadPixels(tiff,bits_per_sample,0,y,(char *) pixels); + status=TIFFReadPixels(tiff,bits_per_sample,0,y,(char *) tiff_pixels); if (status == -1) break; q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); if (q == (Quantum *) NULL) break; (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, - quantum_type,pixels,exception); + quantum_type,tiff_pixels,exception); if (SyncAuthenticPixels(image,exception) == MagickFalse) break; if (image->previous == (Image *) NULL) @@ -1702,7 +1707,6 @@ RestoreMSCWarning TIFFClose(tiff); ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); } - pixels=(unsigned char *) GetQuantumPixels(quantum_info); for (y=0; y < (ssize_t) image->rows; y++) { int @@ -1711,14 +1715,14 @@ RestoreMSCWarning register Quantum *magick_restrict q; - status=TIFFReadPixels(tiff,bits_per_sample,0,y,(char *) pixels); + status=TIFFReadPixels(tiff,bits_per_sample,0,y,(char *) tiff_pixels); if (status == -1) break; q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); if (q == (Quantum *) NULL) break; (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, - quantum_type,pixels,exception); + quantum_type,tiff_pixels,exception); if (SyncAuthenticPixels(image,exception) == MagickFalse) break; if (image->previous == (Image *) NULL) @@ -1747,7 +1751,7 @@ RestoreMSCWarning status; status=TIFFReadPixels(tiff,bits_per_sample,(tsample_t) i,y,(char *) - pixels); + tiff_pixels); if (status == -1) break; q=GetAuthenticPixels(image,0,y,image->columns,1,exception); @@ -1773,7 +1777,7 @@ RestoreMSCWarning default: quantum_type=UndefinedQuantum; break; } (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, - quantum_type,pixels,exception); + quantum_type,tiff_pixels,exception); if (SyncAuthenticPixels(image,exception) == MagickFalse) break; } @@ -1789,7 +1793,6 @@ RestoreMSCWarning } case ReadYCCKMethod: { - pixels=(unsigned char *) GetQuantumPixels(quantum_info); for (y=0; y < (ssize_t) image->rows; y++) { int @@ -1804,13 +1807,13 @@ RestoreMSCWarning unsigned char *p; - status=TIFFReadPixels(tiff,bits_per_sample,0,y,(char *) pixels); + status=TIFFReadPixels(tiff,bits_per_sample,0,y,(char *) tiff_pixels); if (status == -1) break; q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); if (q == (Quantum *) NULL) break; - p=pixels; + p=tiff_pixels; for (x=0; x < (ssize_t) image->columns; x++) { SetPixelCyan(image,ScaleCharToQuantum(ClampYCC((double) *p+ @@ -1859,13 +1862,13 @@ RestoreMSCWarning break; if (i == 0) { - if (TIFFReadRGBAStrip(tiff,(tstrip_t) y,(uint32 *) pixels) == 0) + if (TIFFReadRGBAStrip(tiff,(tstrip_t) y,(uint32 *) tiff_pixels) == 0) break; i=(ssize_t) MagickMin((ssize_t) rows_per_strip,(ssize_t) image->rows-y); } i--; - p=((uint32 *) pixels)+image->columns*i; + p=((uint32 *) tiff_pixels)+image->columns*i; for (x=0; x < (ssize_t) image->columns; x++) { SetPixelRed(image,ScaleCharToQuantum((unsigned char) @@ -2079,6 +2082,7 @@ RestoreMSCWarning break; } } + tiff_pixels=(unsigned char *) RelinquishMagickMemory(tiff_pixels); SetQuantumImageType(image,quantum_type); next_tiff_frame: if (quantum_info != (QuantumInfo *) NULL)