From 7c242ea5de32c28d215cc3d37a37a01e5e6ba6b9 Mon Sep 17 00:00:00 2001 From: cristy Date: Fri, 21 Jun 2013 17:19:53 +0000 Subject: [PATCH] --- MagickCore/blob.c | 4 +- MagickCore/memory.c | 181 +++++++++++++++++++++++++++++++++---------- MagickCore/memory_.h | 8 ++ coders/bmp.c | 99 +++++++++-------------- 4 files changed, 186 insertions(+), 106 deletions(-) diff --git a/MagickCore/blob.c b/MagickCore/blob.c index 46c325085..9751155ff 100644 --- a/MagickCore/blob.c +++ b/MagickCore/blob.c @@ -2566,7 +2566,7 @@ MagickExport MagickBooleanType OpenBlob(const ImageInfo *image_info, length=(size_t) image->blob->properties.st_size; if ((magick_info != (const MagickInfo *) NULL) && (GetMagickBlobSupport(magick_info) != MagickFalse) && - (length > MagickMaxBufferExtent) && + (length <= MagickMaxBufferExtent) && (AcquireMagickResource(MapResource,length) != MagickFalse)) { void @@ -2790,7 +2790,7 @@ MagickExport ssize_t ReadBlob(Image *image,const size_t length, for (i=0; i < (ssize_t) length; i+=count) { - count=read(fileno(image->blob->file_info.file),q+i,(size_t) + count=read(fileno(image->blob->file_info.file),q+i,(size_t) MagickMin(length-i,(MagickSizeType) SSIZE_MAX)); if (count <= 0) { diff --git a/MagickCore/memory.c b/MagickCore/memory.c index e763fb1ed..a315c4911 100644 --- a/MagickCore/memory.c +++ b/MagickCore/memory.c @@ -104,7 +104,31 @@ typedef struct _DataSegmentInfo *next; } DataSegmentInfo; +typedef struct _MagickMemoryMethods +{ + AcquireMemoryHandler + acquire_memory_handler; + + ResizeMemoryHandler + resize_memory_handler; + + DestroyMemoryHandler + destroy_memory_handler; +} MagickMemoryMethods; + typedef struct _MemoryInfo +{ + char + filename[MaxTextExtent]; + + MagickBooleanType + mapped; + + void + *memory; +} MemoryInfo; + +typedef struct _MemoryPool { size_t allocation; @@ -118,20 +142,7 @@ typedef struct _MemoryInfo DataSegmentInfo *segments[MaxSegments], segment_pool[MaxSegments]; -} MemoryInfo; - -typedef struct _MagickMemoryMethods -{ - AcquireMemoryHandler - acquire_memory_handler; - - ResizeMemoryHandler - resize_memory_handler; - - DestroyMemoryHandler - destroy_memory_handler; -} MagickMemoryMethods; - +} MemoryPool; /* Global declarations. @@ -145,8 +156,8 @@ static MagickMemoryMethods }; #if defined(MAGICKCORE_ZERO_CONFIGURATION_SUPPORT) -static MemoryInfo - memory_info; +static MemoryPool + memory_pool; static SemaphoreInfo *memory_semaphore = (SemaphoreInfo *) NULL; @@ -299,7 +310,7 @@ static inline void InsertFreeBlock(void *block,const size_t i) size=SizeOfBlock(block); previous=(void *) NULL; - next=memory_info.blocks[i]; + next=memory_pool.blocks[i]; while ((next != (void *) NULL) && (SizeOfBlock(next) < size)) { previous=next; @@ -310,7 +321,7 @@ static inline void InsertFreeBlock(void *block,const size_t i) if (previous != (void *) NULL) NextBlockInList(previous)=block; else - memory_info.blocks[i]=block; + memory_pool.blocks[i]=block; if (next != (void *) NULL) PreviousBlockInList(next)=block; } @@ -324,7 +335,7 @@ static inline void RemoveFreeBlock(void *block,const size_t i) next=NextBlockInList(block); previous=PreviousBlockInList(block); if (previous == (void *) NULL) - memory_info.blocks[i]=next; + memory_pool.blocks[i]=next; else NextBlockInList(previous)=next; if (next != (void *) NULL) @@ -344,15 +355,15 @@ static void *AcquireBlock(size_t size) */ size=(size_t) (size+sizeof(size_t)+6*sizeof(size_t)-1) & -(4U*sizeof(size_t)); i=AllocationPolicy(size); - block=memory_info.blocks[i]; + block=memory_pool.blocks[i]; while ((block != (void *) NULL) && (SizeOfBlock(block) < size)) block=NextBlockInList(block); if (block == (void *) NULL) { i++; - while (memory_info.blocks[i] == (void *) NULL) + while (memory_pool.blocks[i] == (void *) NULL) i++; - block=memory_info.blocks[i]; + block=memory_pool.blocks[i]; if (i >= MaxBlocks) return((void *) NULL); } @@ -379,7 +390,7 @@ static void *AcquireBlock(size_t size) } assert(size == SizeOfBlock(block)); *BlockHeader(NextBlock(block))|=PreviousBlockBit; - memory_info.allocation+=size; + memory_pool.allocation+=size; return(block); } #endif @@ -426,18 +437,18 @@ MagickExport void *AcquireMagickMemory(const size_t size) i; assert(2*sizeof(size_t) > (size_t) (~SizeMask)); - (void) ResetMagickMemory(&memory_info,0,sizeof(memory_info)); - memory_info.allocation=SegmentSize; - memory_info.blocks[MaxBlocks]=(void *) (-1); + (void) ResetMagickMemory(&memory_pool,0,sizeof(memory_pool)); + memory_pool.allocation=SegmentSize; + memory_pool.blocks[MaxBlocks]=(void *) (-1); for (i=0; i < MaxSegments; i++) { if (i != 0) - memory_info.segment_pool[i].previous= - (&memory_info.segment_pool[i-1]); + memory_pool.segment_pool[i].previous= + (&memory_pool.segment_pool[i-1]); if (i != (MaxSegments-1)) - memory_info.segment_pool[i].next=(&memory_info.segment_pool[i+1]); + memory_pool.segment_pool[i].next=(&memory_pool.segment_pool[i+1]); } - free_segments=(&memory_info.segment_pool[0]); + free_segments=(&memory_pool.segment_pool[0]); } UnlockSemaphoreInfo(memory_semaphore); } @@ -458,6 +469,34 @@ MagickExport void *AcquireMagickMemory(const size_t size) % % % % % % +% A c q u i r e M e m o r y I n f o % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% AcquireMemoryInfo() returns a pointer to a block of memory at least size +% bytes suitably aligned for any use. +% +% The format of the AcquireMemoryInfo method is: +% +% MagickInfo *AcquireMemoryInfo(const size_t size) +% +% A description of each parameter follows: +% +% o size: the size of the virtual memory in bytes to allocate. +% +*/ +MagickExport MemoryInfo *AcquireMemoryInfo(const size_t size) +{ + return((MemoryInfo *) NULL); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % % A c q u i r e Q u a n t u m M e m o r y % % % % % @@ -579,15 +618,15 @@ MagickExport void DestroyMagickMemory(void) AcquireSemaphoreInfo(&memory_semaphore); LockSemaphoreInfo(memory_semaphore); UnlockSemaphoreInfo(memory_semaphore); - for (i=0; i < (ssize_t) memory_info.number_segments; i++) - if (memory_info.segments[i]->mapped == MagickFalse) + for (i=0; i < (ssize_t) memory_pool.number_segments; i++) + if (memory_pool.segments[i]->mapped == MagickFalse) memory_methods.destroy_memory_handler( - memory_info.segments[i]->allocation); + memory_pool.segments[i]->allocation); else - (void) UnmapBlob(memory_info.segments[i]->allocation, - memory_info.segments[i]->length); + (void) UnmapBlob(memory_pool.segments[i]->allocation, + memory_pool.segments[i]->length); free_segments=(DataSegmentInfo *) NULL; - (void) ResetMagickMemory(&memory_info,0,sizeof(memory_info)); + (void) ResetMagickMemory(&memory_pool,0,sizeof(memory_pool)); DestroySemaphoreInfo(&memory_semaphore); #endif } @@ -637,7 +676,7 @@ static MagickBooleanType ExpandHeap(size_t size) *segment; blocksize=((size+12*sizeof(size_t))+SegmentSize-1) & -SegmentSize; - assert(memory_info.number_segments < MaxSegments); + assert(memory_pool.number_segments < MaxSegments); segment=MapBlob(-1,IOMode,0,blocksize); mapped=segment != (void *) NULL ? MagickTrue : MagickFalse; if (segment == (void *) NULL) @@ -650,11 +689,11 @@ static MagickBooleanType ExpandHeap(size_t size) segment_info->length=blocksize; segment_info->allocation=segment; segment_info->bound=(char *) segment+blocksize; - i=(ssize_t) memory_info.number_segments-1; - for ( ; (i >= 0) && (memory_info.segments[i]->allocation > segment); i--) - memory_info.segments[i+1]=memory_info.segments[i]; - memory_info.segments[i+1]=segment_info; - memory_info.number_segments++; + i=(ssize_t) memory_pool.number_segments-1; + for ( ; (i >= 0) && (memory_pool.segments[i]->allocation > segment); i--) + memory_pool.segments[i+1]=memory_pool.segments[i]; + memory_pool.segments[i+1]=segment_info; + memory_pool.number_segments++; size=blocksize-12*sizeof(size_t); block=(char *) segment_info->allocation+4*sizeof(size_t); *BlockHeader(block)=size | PreviousBlockBit; @@ -715,6 +754,34 @@ MagickExport void GetMagickMemoryMethods( % % % % % % +% G e t M e m o r y I n f o M e m o r y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetMemoryInfoMemory() returns a pointer to the allocated memory. +% +% The format of the GetMemoryInfoMemory method is: +% +% void *GetMemoryInfoMemory(const MemoryInfo *memory_info) +% +% A description of each parameter follows: +% +% o memory: A pointer to a block of memory to free for reuse. +% +*/ +MagickExport void *GetMemoryInfoMemory(const MemoryInfo *memory_info) +{ + assert(memory_info != (const MemoryInfo *) NULL); + return(memory_info->memory); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % % R e l i n q u i s h A l i g n e d M e m o r y % % % % % @@ -820,6 +887,34 @@ MagickExport void *RelinquishMagickMemory(void *memory) % % % % % % +% R e l i n q u i s h V i r t u a l M e m o r y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% RelinquishMemoryInfo() frees memory acquired with AcquireMemoryInfo() +% or reuse. +% +% The format of the RelinquishMemoryInfo method is: +% +% void *RelinquishMemoryInfo(const MemoryInfo *memory_info) +% +% A description of each parameter follows: +% +% o memory_info: A pointer to a block of memory to free for reuse. +% +*/ +MagickExport MemoryInfo *RelinquishMemoryInfo(const MemoryInfo *memory_info) +{ + return((MemoryInfo *) NULL); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % % R e s e t M a g i c k M e m o r y % % % % % @@ -890,7 +985,7 @@ static inline void *ResizeBlock(void *block,size_t size) (void) memcpy(memory,block,size); else (void) memcpy(memory,block,SizeOfBlock(block)-sizeof(size_t)); - memory_info.allocation+=size; + memory_pool.allocation+=size; return(memory); } #endif diff --git a/MagickCore/memory_.h b/MagickCore/memory_.h index ac5664cc6..183692c32 100644 --- a/MagickCore/memory_.h +++ b/MagickCore/memory_.h @@ -22,11 +22,18 @@ extern "C" { #endif +typedef struct _MemoryInfo + MemoryInfo; + typedef void *(*AcquireMemoryHandler)(size_t) magick_alloc_size(1), (*DestroyMemoryHandler)(void *), *(*ResizeMemoryHandler)(void *,size_t) magick_alloc_size(2); +extern MagickExport MemoryInfo + *AcquireMemoryInfo(const size_t), + *RelinquishMemoryInfo(const MemoryInfo *); + extern MagickExport void *AcquireAlignedMemory(const size_t,const size_t) magick_attribute((__malloc__)) magick_alloc_sizes(1,2), @@ -39,6 +46,7 @@ extern MagickExport void DestroyMagickMemory(void), GetMagickMemoryMethods(AcquireMemoryHandler *,ResizeMemoryHandler *, DestroyMemoryHandler *), + *GetMemoryInfoMemory(const MemoryInfo *), *RelinquishAlignedMemory(void *), *RelinquishMagickMemory(void *), *ResetMagickMemory(void *,int,const size_t), diff --git a/coders/bmp.c b/coders/bmp.c index 5a6d4cb41..b2d1e9f20 100644 --- a/coders/bmp.c +++ b/coders/bmp.c @@ -116,7 +116,7 @@ typedef struct _BMPInfo offset_bits, size; - int + ssize_t width, height; @@ -249,16 +249,16 @@ static MagickBooleanType DecodeImage(Image *image,const size_t compression, /* Encoded mode. */ - count=(int) MagickMin((ssize_t) count,(ssize_t) (q-p)); + count=MagickMin(count,(int) (q-p)); byte=(unsigned char) ReadBlobByte(image); if (compression == BI_RLE8) { - for (i=0; i < (ssize_t) count; i++) + for (i=0; i < count; i++) *p++=(unsigned char) byte; } else { - for (i=0; i < (ssize_t) count; i++) + for (i=0; i < count; i++) *p++=(unsigned char) ((i & 0x01) != 0 ? (byte & 0x0f) : ((byte >> 4) & 0x0f)); } @@ -299,12 +299,12 @@ static MagickBooleanType DecodeImage(Image *image,const size_t compression, /* Absolute mode. */ - count=(int) MagickMin((ssize_t) count,(ssize_t) (q-p)); + count=MagickMin(count,(int) (q-p)); if (compression == BI_RLE8) - for (i=0; i < (ssize_t) count; i++) + for (i=0; i < count; i++) *p++=(unsigned char) ReadBlobByte(image); else - for (i=0; i < (ssize_t) count; i++) + for (i=0; i < count; i++) { if ((i & 0x01) == 0) byte=(unsigned char) ReadBlobByte(image); @@ -327,7 +327,7 @@ static MagickBooleanType DecodeImage(Image *image,const size_t compression, } } } - if (SetImageProgress(image,LoadImageTag,(MagickOffsetType) y,image->rows) == MagickFalse) + if (SetImageProgress(image,LoadImageTag,y,image->rows) == MagickFalse) break; } (void) ReadBlobByte(image); /* end of line */ @@ -506,7 +506,6 @@ static Image *ReadBMPImage(const ImageInfo *image_info,ExceptionInfo *exception) *image; MagickBooleanType - mapped, status; MagickOffsetType @@ -851,8 +850,8 @@ static Image *ReadBMPImage(const ImageInfo *image_info,ExceptionInfo *exception) default: ThrowReaderException(CorruptImageError,"UnrecognizedImageCompression"); } - image->columns=(size_t) MagickAbsoluteValue((ssize_t) bmp_info.width); - image->rows=(size_t) MagickAbsoluteValue((ssize_t) bmp_info.height); + image->columns=(size_t) MagickAbsoluteValue(bmp_info.width); + image->rows=(size_t) MagickAbsoluteValue(bmp_info.height); image->depth=bmp_info.bits_per_pixel <= 8 ? bmp_info.bits_per_pixel : 8; image->alpha_trait=(bmp_info.alpha_mask != 0) && (bmp_info.compression == BI_BITFIELDS) ? BlendPixelTrait : @@ -901,9 +900,9 @@ static Image *ReadBMPImage(const ImageInfo *image_info,ExceptionInfo *exception) p=bmp_colormap; for (i=0; i < (ssize_t) image->colors; i++) { - image->colormap[i].blue=(MagickRealType) ScaleCharToQuantum(*p++); - image->colormap[i].green=(MagickRealType) ScaleCharToQuantum(*p++); - image->colormap[i].red=(MagickRealType) ScaleCharToQuantum(*p++); + image->colormap[i].blue=ScaleCharToQuantum(*p++); + image->colormap[i].green=ScaleCharToQuantum(*p++); + image->colormap[i].red=ScaleCharToQuantum(*p++); if (packet_size == 4) p++; } @@ -925,34 +924,22 @@ 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; - mapped=MagickFalse; + 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"); 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); - if (GetBlobStreamData(image) != (unsigned char *) NULL) - { - mapped=MagickTrue; - pixels=GetBlobStreamData(image)+TellBlob(image); - if (DiscardBlobBytes(image,length) == MagickFalse) - ThrowReaderException(CorruptImageError, - "InsufficientImageDataInFile"); - } - else + count=ReadBlob(image,length,pixels); + if (count != (ssize_t) length) { - 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"); - } + pixels=(unsigned char *) RelinquishMagickMemory(pixels); + ThrowReaderException(CorruptImageError, + "InsufficientImageDataInFile"); } } else @@ -960,10 +947,6 @@ 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) { @@ -978,7 +961,7 @@ static Image *ReadBMPImage(const ImageInfo *image_info,ExceptionInfo *exception) if (bmp_info.compression == BI_RGB) { bmp_info.alpha_mask=image->alpha_trait == BlendPixelTrait ? - 0xff000000U : 0U; + 0xff000000L : 0L; bmp_info.red_mask=0x00ff0000U; bmp_info.green_mask=0x0000ff00U; bmp_info.blue_mask=0x000000ffU; @@ -1017,19 +1000,19 @@ static Image *ReadBMPImage(const ImageInfo *image_info,ExceptionInfo *exception) sample=shift.red; while (((bmp_info.red_mask << sample) & 0x80000000UL) != 0) sample++; - quantum_bits.red=(MagickRealType) (sample-shift.red); + quantum_bits.red=(Quantum) (sample-shift.red); sample=shift.green; while (((bmp_info.green_mask << sample) & 0x80000000UL) != 0) sample++; - quantum_bits.green=(MagickRealType) (sample-shift.green); + quantum_bits.green=(Quantum) (sample-shift.green); sample=shift.blue; while (((bmp_info.blue_mask << sample) & 0x80000000UL) != 0) sample++; - quantum_bits.blue=(MagickRealType) (sample-shift.blue); + quantum_bits.blue=(Quantum) (sample-shift.blue); sample=shift.alpha; while (((bmp_info.alpha_mask << sample) & 0x80000000UL) != 0) sample++; - quantum_bits.alpha=(MagickRealType) (sample-shift.alpha); + quantum_bits.alpha=(Quantum) (sample-shift.alpha); } switch (bmp_info.bits_per_pixel) { @@ -1163,8 +1146,7 @@ static Image *ReadBMPImage(const ImageInfo *image_info,ExceptionInfo *exception) if (bmp_info.compression != BI_RGB && bmp_info.compression != BI_BITFIELDS) { - if (mapped == MagickFalse) - pixels=(unsigned char *) RelinquishMagickMemory(pixels); + pixels=(unsigned char *) RelinquishMagickMemory(pixels); ThrowReaderException(CorruptImageError, "UnrecognizedImageCompression"); } @@ -1263,8 +1245,7 @@ static Image *ReadBMPImage(const ImageInfo *image_info,ExceptionInfo *exception) if ((bmp_info.compression != BI_RGB) && (bmp_info.compression != BI_BITFIELDS)) { - if (mapped == MagickFalse) - pixels=(unsigned char *) RelinquishMagickMemory(pixels); + pixels=(unsigned char *) RelinquishMagickMemory(pixels); ThrowReaderException(CorruptImageError, "UnrecognizedImageCompression"); } @@ -1320,13 +1301,11 @@ static Image *ReadBMPImage(const ImageInfo *image_info,ExceptionInfo *exception) } default: { - if (mapped == MagickFalse) - pixels=(unsigned char *) RelinquishMagickMemory(pixels); + pixels=(unsigned char *) RelinquishMagickMemory(pixels); ThrowReaderException(CorruptImageError,"ImproperImageHeader"); } } - if (mapped == MagickFalse) - pixels=(unsigned char *) RelinquishMagickMemory(pixels); + pixels=(unsigned char *) RelinquishMagickMemory(pixels); if (EOFBlob(image) != MagickFalse) { ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", @@ -1644,8 +1623,8 @@ static MagickBooleanType WriteBMPImage(const ImageInfo *image_info,Image *image, bmp_info.file_size+=extra_size; bmp_info.offset_bits+=extra_size; } - bmp_info.width=(int) image->columns; - bmp_info.height=(int) image->rows; + bmp_info.width=(ssize_t) image->columns; + bmp_info.height=(ssize_t) image->rows; bmp_info.planes=1; bmp_info.image_size=(unsigned int) (bytes_per_line*image->rows); bmp_info.file_size+=bmp_info.image_size; @@ -1731,12 +1710,10 @@ static MagickBooleanType WriteBMPImage(const ImageInfo *image_info,Image *image, } case 4: { - ssize_t - offset; - size_t byte, - nibble; + nibble, + offset; /* Convert PseudoClass image to a BMP monochrome image. @@ -2080,9 +2057,9 @@ static MagickBooleanType WriteBMPImage(const ImageInfo *image_info,Image *image, q=bmp_colormap; for (i=0; i < (ssize_t) MagickMin((ssize_t) image->colors,(ssize_t) bmp_info.number_colors); i++) { - *q++=ScaleQuantumToChar(ClampToQuantum(image->colormap[i].blue)); - *q++=ScaleQuantumToChar(ClampToQuantum(image->colormap[i].green)); - *q++=ScaleQuantumToChar(ClampToQuantum(image->colormap[i].red)); + *q++=ScaleQuantumToChar(image->colormap[i].blue); + *q++=ScaleQuantumToChar(image->colormap[i].green); + *q++=ScaleQuantumToChar(image->colormap[i].red); if (type > 2) *q++=(unsigned char) 0x0; } -- 2.40.0