]> granicus.if.org Git - imagemagick/commitdiff
https://github.com/ImageMagick/ImageMagick/issues/876
authorCristy <urban-warrior@imagemagick.org>
Sun, 26 Nov 2017 14:11:15 +0000 (09:11 -0500)
committerCristy <urban-warrior@imagemagick.org>
Sun, 26 Nov 2017 14:11:15 +0000 (09:11 -0500)
MagickCore/cache.c
MagickCore/resource.c

index 926fe0f73e38a7caf96b294d6c90d387c9374f01..615bdc93df6a2df5147e8cef273c75f88ac50ae4 100644 (file)
@@ -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);
index 31a0bde991e2357db444d04d06d38e34f65c2867..9453d375d8b97fa2d1ec3d7d672c43c32bdb1981 100644 (file)
@@ -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,