From: Cristy Date: Sun, 23 Jul 2017 21:09:32 +0000 (-0400) Subject: https://github.com/ImageMagick/ImageMagick/issues/552 X-Git-Tag: 7.0.6-3~12 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=46bcb8a86801d3d9c3f89ec1c01fa8a98da05645;p=imagemagick https://github.com/ImageMagick/ImageMagick/issues/552 --- diff --git a/ChangeLog b/ChangeLog index 4ac4b6671..883476023 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,3 @@ -2017-07-23 7.0.6-3 Cristy - * Release ImageMagick version 7.0.6-3, GIT revision 20582:b6e1fa3f6:20170723. - 2017-07-23 7.0.6-3 Cristy * Fixed numerous memory leaks (reference https://github.com/ImageMagick/ImageMagick/issues). diff --git a/MagickCore/cache-private.h b/MagickCore/cache-private.h index efcabba6a..0f7f8d288 100644 --- a/MagickCore/cache-private.h +++ b/MagickCore/cache-private.h @@ -223,6 +223,9 @@ typedef struct _CacheInfo MagickCLCacheInfo opencl; + + MagickBooleanType + persist, } CacheInfo; extern MagickPrivate Cache diff --git a/MagickCore/cache.c b/MagickCore/cache.c index 2e3e50ed3..4e2fa22a8 100644 --- a/MagickCore/cache.c +++ b/MagickCore/cache.c @@ -3544,6 +3544,8 @@ static MagickBooleanType OpenPixelCache(Image *image,const MapMode mode, return(MagickTrue); } status=AcquireMagickResource(AreaResource,cache_info->length); + if ((status != MagickFalse) && (cache_info->persist != MagickFalse)) + status=MagickFalse; length=number_pixels*(cache_info->number_channels*sizeof(Quantum)+ cache_info->metacontent_extent); if ((status != MagickFalse) && (length == (MagickSizeType) ((size_t) length))) @@ -3669,7 +3671,8 @@ static MagickBooleanType OpenPixelCache(Image *image,const MapMode mode, "CacheResourcesExhausted","`%s'",image->filename); return(MagickFalse); } - if ((source_info.storage_class != UndefinedClass) && (mode != ReadMode)) + if ((source_info.storage_class != UndefinedClass) && (mode != ReadMode) && + (cache_info->persist != MagickFalse)) { (void) ClosePixelCacheOnDisk(cache_info); *cache_info->cache_filename='\0'; @@ -3819,7 +3822,7 @@ MagickExport MagickBooleanType PersistPixelCache(Image *image, *magick_restrict clone_info; Image - clone_image; + *clone_image; MagickBooleanType status; @@ -3860,19 +3863,16 @@ MagickExport MagickBooleanType PersistPixelCache(Image *image, /* Clone persistent pixel cache. */ - clone_image=(*image); - clone_info=(CacheInfo *) clone_image.cache; - image->cache=ClonePixelCache(cache_info); - cache_info=(CacheInfo *) ReferencePixelCache(image->cache); - (void) CopyMagickString(cache_info->cache_filename,filename,MagickPathExtent); - cache_info->type=DiskCache; - cache_info->offset=(*offset); - cache_info=(CacheInfo *) image->cache; - status=OpenPixelCache(image,IOMode,exception); - if (status != MagickFalse) - status=ClonePixelCacheRepository(cache_info,clone_info,exception); + clone_image=CloneImage(image,image->columns,image->rows,MagickTrue,exception); + if (clone_image == (Image *) NULL) + return(MagickFalse); + clone_info=(CacheInfo *) clone_image->cache; + (void) CopyMagickString(clone_info->cache_filename,filename,MagickPathExtent); + clone_info->persist=MagickTrue; + clone_info->offset=(*offset); + status=ClonePixelCacheRepository(clone_info,image->cache,exception); *offset+=cache_info->length+page_size-(cache_info->length % page_size); - clone_info=(CacheInfo *) DestroyPixelCache(clone_info); + clone_image=DestroyImage(clone_image); return(status); } diff --git a/MagickCore/resource.c b/MagickCore/resource.c index 78e15d100..cf2545ece 100644 --- a/MagickCore/resource.c +++ b/MagickCore/resource.c @@ -1007,11 +1007,14 @@ MagickExport MagickBooleanType RelinquishUniqueFileResource(const char *path) ActivateSemaphoreInfo(&resource_semaphore); LockSemaphoreInfo(resource_semaphore); if (temporary_resources != (SplayTreeInfo *) NULL) - status=DeleteNodeFromSplayTree(temporary_resources, (const void *) path); + status=DeleteNodeFromSplayTree(temporary_resources,(const void *) path); UnlockSemaphoreInfo(resource_semaphore); - (void) CopyMagickString(cache_path,path,MagickPathExtent); - AppendImageFormat("cache",cache_path); - (void) ShredFile(cache_path); + if (status != MagickFalse) + { + (void) CopyMagickString(cache_path,path,MagickPathExtent); + AppendImageFormat("cache",cache_path); + (void) ShredFile(cache_path); + } if (status == MagickFalse) status=ShredFile(path); return(status);