From 816ce59d8d9e0c7c3a3b128304fbca156d19b8ac Mon Sep 17 00:00:00 2001 From: Cristy Date: Sun, 26 Nov 2017 09:11:15 -0500 Subject: [PATCH] https://github.com/ImageMagick/ImageMagick/issues/876 --- MagickCore/cache.c | 34 ++++++++++++++++++++++++---------- MagickCore/resource.c | 10 +++++----- 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/MagickCore/cache.c b/MagickCore/cache.c index 926fe0f73..615bdc93d 100644 --- a/MagickCore/cache.c +++ b/MagickCore/cache.c @@ -536,7 +536,7 @@ static MagickBooleanType ClonePixelCacheRepository( CacheInfo *magick_restrict clone_info,CacheInfo *magick_restrict cache_info, ExceptionInfo *exception) { -#define MaxCacheThreads GetMagickResourceLimit(ThreadResource) +#define MaxCacheThreads ((size_t) GetMagickResourceLimit(ThreadResource)) #define cache_number_threads(source,destination,chunk,multithreaded) \ num_threads((multithreaded) == 0 ? 1 : \ (((source)->type != MemoryCache) && \ @@ -3525,8 +3525,7 @@ static MagickBooleanType OpenPixelCache(Image *image,const MapMode mode, if ((status != MagickFalse) && (length == (MagickSizeType) ((size_t) length))) { status=AcquireMagickResource(MemoryResource,cache_info->length); - if (((cache_info->type == UndefinedCache) && (status != MagickFalse)) || - (cache_info->type == MemoryCache)) + if ((cache_info->type == UndefinedCache) && (status != MagickFalse)) { status=MagickTrue; if (cache_anonymous_memory <= 0) @@ -3579,17 +3578,14 @@ static MagickBooleanType OpenPixelCache(Image *image,const MapMode mode, } } } - /* - Create pixel cache on disk. - */ - status=AcquireMagickResource(DiskResource,cache_info->length); - if ((status == MagickFalse) || (cache_info->type == DistributedCache)) + if (cache_info->type == DistributedCache) { DistributeCacheInfo *server_info; - if (cache_info->type == DistributedCache) - RelinquishMagickResource(DiskResource,cache_info->length); + /* + Distribute the pixel cache to a remote server. + */ server_info=AcquireDistributeCacheInfo(exception); if (server_info != (DistributeCacheInfo *) NULL) { @@ -3644,6 +3640,17 @@ static MagickBooleanType OpenPixelCache(Image *image,const MapMode mode, "CacheResourcesExhausted","`%s'",image->filename); return(MagickFalse); } + /* + Create pixel cache on disk. + */ + status=AcquireMagickResource(DiskResource,cache_info->length); + if (status == MagickFalse) + { + cache_info->type=UndefinedCache; + (void) ThrowMagickException(exception,GetMagickModule(),CacheError, + "CacheResourcesExhausted","`%s'",image->filename); + return(MagickFalse); + } if ((source_info.storage_class != UndefinedClass) && (mode != ReadMode) && (cache_info->mode != PersistMode)) { @@ -3832,6 +3839,13 @@ MagickExport MagickBooleanType PersistPixelCache(Image *image, /* Clone persistent pixel cache. */ + status=AcquireMagickResource(DiskResource,cache_info->length); + if (status == MagickFalse) + { + (void) ThrowMagickException(exception,GetMagickModule(),CacheError, + "CacheResourcesExhausted","`%s'",image->filename); + return(MagickFalse); + } clone_info=(CacheInfo *) ClonePixelCache(cache_info); clone_info->type=DiskCache; (void) CopyMagickString(clone_info->cache_filename,filename,MagickPathExtent); diff --git a/MagickCore/resource.c b/MagickCore/resource.c index 31a0bde99..9453d375d 100644 --- a/MagickCore/resource.c +++ b/MagickCore/resource.c @@ -214,7 +214,6 @@ MagickExport MagickBooleanType AcquireMagickResource(const ResourceType type, status=MagickTrue; else resource_info.memory-=(MagickOffsetType) size; - assert(resource_info.memory >= 0); if (logging != MagickFalse) { (void) FormatMagickSize(size,MagickTrue,"B",MagickFormatExtent, @@ -235,7 +234,6 @@ MagickExport MagickBooleanType AcquireMagickResource(const ResourceType type, status=MagickTrue; else resource_info.map-=(MagickOffsetType) size; - assert(resource_info.map >= 0); if (logging != MagickFalse) { (void) FormatMagickSize(size,MagickTrue,"B",MagickFormatExtent, @@ -256,7 +254,6 @@ MagickExport MagickBooleanType AcquireMagickResource(const ResourceType type, status=MagickTrue; else resource_info.disk-=(MagickOffsetType) size; - assert(resource_info.disk >= 0); if (logging != MagickFalse) { (void) FormatMagickSize(size,MagickTrue,"B",MagickFormatExtent, @@ -277,7 +274,6 @@ MagickExport MagickBooleanType AcquireMagickResource(const ResourceType type, status=MagickTrue; else resource_info.file-=(MagickOffsetType) size; - assert(resource_info.file >= 0); if (logging != MagickFalse) { (void) FormatMagickSize(size,MagickFalse,(const char *) NULL, @@ -352,7 +348,6 @@ MagickExport MagickBooleanType AcquireMagickResource(const ResourceType type, status=MagickTrue; else resource_info.time-=(MagickOffsetType) size; - assert(resource_info.time >= 0); if (logging != MagickFalse) { (void) FormatMagickSize(size,MagickFalse,(const char *) NULL, @@ -969,6 +964,7 @@ MagickExport void RelinquishMagickResource(const ResourceType type, case MemoryResource: { resource_info.memory-=size; + assert(resource_info.memory >= 0); if (logging != MagickFalse) { (void) FormatMagickSize(size,MagickFalse,"B",MagickFormatExtent, @@ -983,6 +979,7 @@ MagickExport void RelinquishMagickResource(const ResourceType type, case MapResource: { resource_info.map-=size; + assert(resource_info.map >= 0); if (logging != MagickFalse) { (void) FormatMagickSize(size,MagickFalse,"B",MagickFormatExtent, @@ -997,6 +994,7 @@ MagickExport void RelinquishMagickResource(const ResourceType type, case DiskResource: { resource_info.disk-=size; + assert(resource_info.disk >= 0); if (logging != MagickFalse) { (void) FormatMagickSize(size,MagickFalse,"B",MagickFormatExtent, @@ -1011,6 +1009,7 @@ MagickExport void RelinquishMagickResource(const ResourceType type, case FileResource: { resource_info.file-=size; + assert(resource_info.file >= 0); if (logging != MagickFalse) { (void) FormatMagickSize(size,MagickFalse,(const char *) NULL, @@ -1068,6 +1067,7 @@ MagickExport void RelinquishMagickResource(const ResourceType type, case TimeResource: { resource_info.time-=size; + assert(resource_info.time >= 0); if (logging != MagickFalse) { (void) FormatMagickSize(size,MagickFalse,(const char *) NULL, -- 2.40.0