From 18aba9157e2b6a9c2135b0c491770fcdd28f2c7c Mon Sep 17 00:00:00 2001 From: cristy Date: Fri, 14 Jun 2013 19:48:08 +0000 Subject: [PATCH] --- MagickCore/blob.c | 39 +++++++++++++++++++++++---------------- coders/bmp.c | 47 ++++++++++++++++++++++++++++++++++------------- 2 files changed, 57 insertions(+), 29 deletions(-) diff --git a/MagickCore/blob.c b/MagickCore/blob.c index 06eb37e3e..e8d11a1b0 100644 --- a/MagickCore/blob.c +++ b/MagickCore/blob.c @@ -81,6 +81,9 @@ #if !defined(MAP_FAILED) #define MAP_FAILED ((void *) -1) #endif +#if !defined(MS_SYNC) +#define MS_SYNC 0x04 +#endif #if defined(__OS2__) #include #define _O_BINARY O_BINARY @@ -112,9 +115,6 @@ struct _BlobInfo extent, quantum; - MapMode - mode; - MagickBooleanType mapped, eof; @@ -650,7 +650,10 @@ MagickExport void DestroyBlob(Image *image) return; (void) CloseBlob(image); if (image->blob->mapped != MagickFalse) - (void) UnmapBlob(image->blob->data,image->blob->length); + { + (void) UnmapBlob(image->blob->data,image->blob->length); + RelinquishMagickResource(MapResource,image->blob->length); + } if (image->blob->semaphore != (SemaphoreInfo *) NULL) DestroySemaphoreInfo(&image->blob->semaphore); image->blob->signature=(~MagickSignature); @@ -688,7 +691,10 @@ MagickExport unsigned char *DetachBlob(BlobInfo *blob_info) if (blob_info->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); if (blob_info->mapped != MagickFalse) - (void) UnmapBlob(blob_info->data,blob_info->length); + { + (void) UnmapBlob(blob_info->data,blob_info->length); + RelinquishMagickResource(MapResource,blob_info->length); + } blob_info->mapped=MagickFalse; blob_info->length=0; blob_info->offset=0; @@ -2554,6 +2560,9 @@ MagickExport MagickBooleanType OpenBlob(const ImageInfo *image_info, ExceptionInfo *sans_exception; + size_t + length; + struct stat *properties; @@ -2561,20 +2570,19 @@ MagickExport MagickBooleanType OpenBlob(const ImageInfo *image_info, magick_info=GetMagickInfo(image_info->magick,sans_exception); sans_exception=DestroyExceptionInfo(sans_exception); properties=(&image->blob->properties); + length=(size_t) properties->st_size; if ((magick_info != (const MagickInfo *) NULL) && (GetMagickBlobSupport(magick_info) != MagickFalse) && - (properties->st_size <= MagickMaxBufferExtent)) + (AcquireMagickResource(MapResource,length) != MagickFalse)) { - size_t - length; - void *blob; - length=(size_t) properties->st_size; blob=MapBlob(fileno(image->blob->file_info.file),ReadMode, 0,length); - if (blob != (void *) NULL) + if (blob == (void *) NULL) + RelinquishMagickResource(MapResource,length); + else { /* Format supports blobs-- use memory-mapped I/O. @@ -2588,7 +2596,6 @@ MagickExport MagickBooleanType OpenBlob(const ImageInfo *image_info, } AttachBlob(image->blob,blob,length); image->blob->mapped=MagickTrue; - image->blob->mode=ReadMode; } } } @@ -3791,6 +3798,7 @@ MagickPrivate MagickBooleanType SetBlobExtent(Image *image, count; (void) UnmapBlob(image->blob->data,image->blob->length); + RelinquishMagickResource(MapResource,image->blob->length); if (extent != (MagickSizeType) ((off_t) extent)) return(MagickFalse); offset=SeekBlob(image,0,SEEK_END); @@ -3820,7 +3828,7 @@ MagickPrivate MagickBooleanType SetBlobExtent(Image *image, image->blob->file_info.file),WriteMode,0,(size_t) extent); image->blob->extent=(size_t) extent; image->blob->length=(size_t) extent; - image->blob->mode=WriteMode; + (void) AcquireMagickResource(MapResource,extent); (void) SyncBlob(image); break; } @@ -3903,9 +3911,8 @@ static int SyncBlob(Image *image) break; case BlobStream: { -#if defined(MAGICKCORE_HAVE_MMAP_FILEIO) && defined(MS_SYNC) - if ((image->blob->mapped != MagickFalse) && - ((image->blob->mode == WriteMode) || (image->blob->mode == IOMode))) +#if defined(MAGICKCORE_HAVE_MMAP_FILEIO) + if (image->blob->mapped != MagickFalse) status=msync(image->blob->data,image->blob->length,MS_SYNC); #endif break; diff --git a/coders/bmp.c b/coders/bmp.c index b2d1e9f20..6e66cc5c7 100644 --- a/coders/bmp.c +++ b/coders/bmp.c @@ -506,6 +506,7 @@ static Image *ReadBMPImage(const ImageInfo *image_info,ExceptionInfo *exception) *image; MagickBooleanType + mapped, status; MagickOffsetType @@ -924,22 +925,34 @@ static Image *ReadBMPImage(const ImageInfo *image_info,ExceptionInfo *exception) bmp_info.bits_per_pixel<<=1; bytes_per_line=4*((image->columns*bmp_info.bits_per_pixel+31)/32); length=(size_t) bytes_per_line*image->rows; - pixels=(unsigned char *) AcquireQuantumMemory((size_t) image->rows, - MagickMax(bytes_per_line,image->columns+256UL)*sizeof(*pixels)); - if (pixels == (unsigned char *) NULL) - ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + mapped=MagickFalse; if ((bmp_info.compression == BI_RGB) || (bmp_info.compression == BI_BITFIELDS)) { if (image->debug != MagickFalse) (void) LogMagickEvent(CoderEvent,GetMagickModule(), " Reading pixels (%.20g bytes)",(double) length); - count=ReadBlob(image,length,pixels); - if (count != (ssize_t) length) + if (GetBlobStreamData(image) != (unsigned char *) NULL) { - pixels=(unsigned char *) RelinquishMagickMemory(pixels); - ThrowReaderException(CorruptImageError, - "InsufficientImageDataInFile"); + mapped=MagickTrue; + pixels=GetBlobStreamData(image)+TellBlob(image); + if (DiscardBlobBytes(image,length) == MagickFalse) + ThrowReaderException(CorruptImageError, + "InsufficientImageDataInFile"); + } + else + { + pixels=(unsigned char *) AcquireQuantumMemory((size_t) image->rows, + MagickMax(bytes_per_line,image->columns)*sizeof(*pixels)); + if (pixels == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + count=ReadBlob(image,length,pixels); + if (count != (ssize_t) length) + { + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + ThrowReaderException(CorruptImageError, + "InsufficientImageDataInFile"); + } } } else @@ -947,6 +960,10 @@ static Image *ReadBMPImage(const ImageInfo *image_info,ExceptionInfo *exception) /* Convert run-length encoded raster pixels. */ + pixels=(unsigned char *) AcquireQuantumMemory((size_t) image->rows, + MagickMax(bytes_per_line,image->columns+256UL)*sizeof(*pixels)); + if (pixels == (unsigned char *) NULL) + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); status=DecodeImage(image,bmp_info.compression,pixels); if (status == MagickFalse) { @@ -1146,7 +1163,8 @@ static Image *ReadBMPImage(const ImageInfo *image_info,ExceptionInfo *exception) if (bmp_info.compression != BI_RGB && bmp_info.compression != BI_BITFIELDS) { - pixels=(unsigned char *) RelinquishMagickMemory(pixels); + if (mapped == MagickFalse) + pixels=(unsigned char *) RelinquishMagickMemory(pixels); ThrowReaderException(CorruptImageError, "UnrecognizedImageCompression"); } @@ -1245,7 +1263,8 @@ static Image *ReadBMPImage(const ImageInfo *image_info,ExceptionInfo *exception) if ((bmp_info.compression != BI_RGB) && (bmp_info.compression != BI_BITFIELDS)) { - pixels=(unsigned char *) RelinquishMagickMemory(pixels); + if (mapped == MagickFalse) + pixels=(unsigned char *) RelinquishMagickMemory(pixels); ThrowReaderException(CorruptImageError, "UnrecognizedImageCompression"); } @@ -1301,11 +1320,13 @@ static Image *ReadBMPImage(const ImageInfo *image_info,ExceptionInfo *exception) } default: { - pixels=(unsigned char *) RelinquishMagickMemory(pixels); + if (mapped == MagickFalse) + pixels=(unsigned char *) RelinquishMagickMemory(pixels); ThrowReaderException(CorruptImageError,"ImproperImageHeader"); } } - pixels=(unsigned char *) RelinquishMagickMemory(pixels); + if (mapped == MagickFalse) + pixels=(unsigned char *) RelinquishMagickMemory(pixels); if (EOFBlob(image) != MagickFalse) { ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", -- 2.40.0