]> granicus.if.org Git - imagemagick/commitdiff
Fix cleanup of layer info.
authordirk <dirk@git.imagemagick.org>
Sat, 28 Dec 2013 22:55:19 +0000 (22:55 +0000)
committerdirk <dirk@git.imagemagick.org>
Sat, 28 Dec 2013 22:55:19 +0000 (22:55 +0000)
coders/psd.c

index 845876341f55987d8532b36db64417a045b745a1..5c07c3db8457770b7b7921c7832ab3ffa9962526 100644 (file)
@@ -434,6 +434,21 @@ static ssize_t DecodePSDPixels(const size_t number_compact_pixels,
   return(i);
 }
 
+static inline LayerInfo *DestroyLayerInfo(LayerInfo *layer_info,
+  const ssize_t number_layers)
+{
+  ssize_t
+    i;
+
+  for (i=0; i<number_layers; i++)
+  {
+    if (layer_info[i].image != (Image *) NULL)
+      layer_info[i].image=DestroyImage(layer_info[i].image);
+  }
+
+  return (LayerInfo *) RelinquishMagickMemory(layer_info);
+}
+
 static inline size_t GetPSDPacketSize(Image *image)
 {
   if (image->storage_class == PseudoClass)
@@ -1250,7 +1265,7 @@ static MagickStatusType ReadPSDLayers(Image *image,PSDInfo *psd_info,
         layer_info[i].channels=ReadBlobMSBShort(image);
         if (layer_info[i].channels > MaxPSDChannels)
           {
-            layer_info=(LayerInfo *) RelinquishMagickMemory(layer_info);
+            layer_info=DestroyLayerInfo(layer_info,number_layers);
             ThrowBinaryException(CorruptImageError,"MaximumChannelsExceeded",
             image->filename);
           }
@@ -1277,7 +1292,7 @@ static MagickStatusType ReadPSDLayers(Image *image,PSDInfo *psd_info,
             if (image->debug != MagickFalse)
               (void) LogMagickEvent(CoderEvent,GetMagickModule(),
                 "  layer type was %.4s instead of 8BIM", type);
-            layer_info=(LayerInfo *) RelinquishMagickMemory(layer_info);
+            layer_info=DestroyLayerInfo(layer_info,number_layers);
             ThrowBinaryException(CorruptImageError,"ImproperImageHeader",
               image->filename);
           }
@@ -1330,7 +1345,7 @@ static MagickStatusType ReadPSDLayers(Image *image,PSDInfo *psd_info,
                 */
                 if (DiscardBlobBytes(image,length-16) == MagickFalse)
                   {
-                    layer_info=(LayerInfo *) RelinquishMagickMemory(layer_info);
+                    layer_info=DestroyLayerInfo(layer_info,number_layers);
                     ThrowFileException(exception,CorruptImageError,
                       "UnexpectedEndOfFile",image->filename);
                   }
@@ -1379,7 +1394,7 @@ static MagickStatusType ReadPSDLayers(Image *image,PSDInfo *psd_info,
                  ((MagickOffsetType) (size-combined_length)));
              if (DiscardBlobBytes(image,size-combined_length) == MagickFalse)
                {
-                 layer_info=(LayerInfo *) RelinquishMagickMemory(layer_info);
+                 layer_info=DestroyLayerInfo(layer_info,number_layers);
                  ThrowBinaryException(CorruptImageError,
                    "UnexpectedEndOfFile",image->filename);
                }
@@ -1420,9 +1435,7 @@ static MagickStatusType ReadPSDLayers(Image *image,PSDInfo *psd_info,
           layer_info[i].page.height,MagickFalse,exception);
         if (layer_info[i].image == (Image *) NULL)
           {
-            for (j=0; j < i; j++)
-              layer_info[j].image=DestroyImage(layer_info[j].image);
-            layer_info=(LayerInfo *) RelinquishMagickMemory(layer_info);
+            layer_info=DestroyLayerInfo(layer_info,number_layers);
             if (image->debug != MagickFalse)
               (void) LogMagickEvent(CoderEvent,GetMagickModule(),
                 "  allocation of image for layer %.20g failed",(double) i);
@@ -1440,7 +1453,7 @@ static MagickStatusType ReadPSDLayers(Image *image,PSDInfo *psd_info,
             if (DiscardBlobBytes(image,layer_info[i].channel_info[j].size) ==
                   MagickFalse)
               {
-                layer_info=(LayerInfo *) RelinquishMagickMemory(layer_info);
+                layer_info=DestroyLayerInfo(layer_info,number_layers);
                 ThrowBinaryException(CorruptImageError,
                   "UnexpectedEndOfFile",image->filename);
               }