]> granicus.if.org Git - imagemagick/commitdiff
(no commit message)
authorcristy <urban-warrior@git.imagemagick.org>
Thu, 16 Sep 2010 20:01:21 +0000 (20:01 +0000)
committercristy <urban-warrior@git.imagemagick.org>
Thu, 16 Sep 2010 20:01:21 +0000 (20:01 +0000)
coders/psd.c
magick/blob-private.h
magick/blob.c
magick/blob.h

index 43a2165d2fc3d6490c4103f67fbe36853946d74e..28771092a4ce1c0cb77dabc42afac9f915df9852 100644 (file)
@@ -932,13 +932,9 @@ static Image *ReadPSDImage(const ImageInfo *image_info,ExceptionInfo *exception)
       length=ReadBlobMSBLong(image);
     }
   if ((image_info->number_scenes == 1) && (image_info->scene == 0))
-    for ( ; length != 0; length--)
-      if (ReadBlobByte(image) == EOF)
-        {
-          ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
-            image->filename);
-          break;
-        }
+    if (DiscardBlobBytes(image,length) == MagickFalse)
+      ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
+        image->filename);
   if (length == 0)
     {
       if (image->debug != MagickFalse)
@@ -958,8 +954,9 @@ static Image *ReadPSDImage(const ImageInfo *image_info,ExceptionInfo *exception)
             Skip layers & masks.
           */
           quantum=psd_info.version == 1 ? 4UL : 8UL;
-          for (j=0; j < (ssize_t) (length-quantum); j++)
-            (void) ReadBlobByte(image);
+          if (DiscardBlobBytes(image,length-quantum) == MagickFalse)
+            ThrowFileException(exception,CorruptImageError,
+              "UnexpectedEndOfFile",image->filename);
         }
       else
         {
@@ -1068,14 +1065,19 @@ static Image *ReadPSDImage(const ImageInfo *image_info,ExceptionInfo *exception)
                     if (image->debug != MagickFalse)
                       (void) LogMagickEvent(CoderEvent,GetMagickModule(),
                         "      layer mask: offset(%.20g,%.20g), size(%.20g,%.20g), length=%.20g",
-                        (double) layer_info[i].mask.x,(double) layer_info[i].mask.y,
+                        (double) layer_info[i].mask.x,
+                        (double) layer_info[i].mask.y,
                         (double) layer_info[i].mask.width,(double)
                         layer_info[i].mask.height,(double) length-16);
                     /*
                       Skip over the rest of the layer mask information.
                     */
-                    for (j=0; j < (ssize_t) (length-16); j++)
-                      (void) ReadBlobByte(image);
+                    if (DiscardBlobBytes(image,length-16) == MagickFalse)
+                      {
+                        ThrowFileException(exception,CorruptImageError,
+                          "UnexpectedEndOfFile",image->filename);
+                        break;
+                      }
                   }
                 combinedlength+=length+4;  /* +4 for length */
                 length=ReadBlobMSBLong(image);
@@ -1157,8 +1159,12 @@ static Image *ReadPSDImage(const ImageInfo *image_info,ExceptionInfo *exception)
                   (void) LogMagickEvent(CoderEvent,GetMagickModule(),
                     "      unsupported data: length=%.20g",(double)
                     (size-combinedlength));
-                for (j=0; j < (ssize_t) (size-combinedlength); j++)
-                  (void) ReadBlobByte(image);
+                if (DiscardBlobBytes(image,size-combinedlength) == MagickFalse)
+                  {
+                    ThrowFileException(exception,CorruptImageError,
+                      "UnexpectedEndOfFile",image->filename);
+                    break;
+                  }
               }
             /*
               Allocate layered image.
index b6459786f14741fb0afb018545158a09496addc1..2aa99187dac5557b4afd34e872867c31129b763a 100644 (file)
@@ -75,6 +75,7 @@ extern MagickExport int
 
 extern MagickExport  MagickBooleanType
   CloseBlob(Image *),
+  DiscardBlobBytes(Image *,const size_t),
   OpenBlob(const ImageInfo *,Image *,const BlobMode,ExceptionInfo *),
   SetBlobExtent(Image *,const MagickSizeType),
   UnmapBlob(void *,const size_t);
index ef1442fb28ede9e53dd4a534b0a7c18bafcab0f1..817e49333c91f089b1eabc058f9a1f8e3beea730 100644 (file)
@@ -665,6 +665,88 @@ MagickExport unsigned char *DetachBlob(BlobInfo *blob_info)
 %                                                                             %
 %                                                                             %
 %                                                                             %
++  D i s c a r d B l o b B y t e s                                            %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  DiscardBlobBytes() discards bytes in a blob.
+%
+%  The format of the DiscardBlobBytes method is:
+%
+%      MagickBooleanType DiscardBlobBytes(Image *image,const size_t length)
+%
+%  A description of each parameter follows.
+%
+%    o image: the image.
+%
+%    o length:  the number of bytes to skip.
+%
+*/
+
+static inline const unsigned char *ReadBlobStream(Image *image,
+  const size_t length,unsigned char *data,ssize_t *count)
+{
+  assert(count != (ssize_t *) NULL);
+  assert(image->blob != (BlobInfo *) NULL);
+  if (image->blob->type != BlobStream)
+    {
+      *count=ReadBlob(image,length,data);
+      return(data);
+    }
+  if (image->blob->offset >= (MagickOffsetType) image->blob->length)
+    {
+      *count=0;
+      image->blob->eof=MagickTrue;
+      return(data);
+    }
+  data=image->blob->data+image->blob->offset;
+  *count=(ssize_t) MagickMin(length,(size_t) (image->blob->length-
+    image->blob->offset));
+  image->blob->offset+=(*count);
+  if (*count != (ssize_t) length)
+    image->blob->eof=MagickTrue;
+  return(data);
+}
+
+MagickExport MagickBooleanType DiscardBlobBytes(Image *image,
+  const size_t length)
+{
+  register ssize_t
+    i;
+
+  size_t
+    quantum;
+
+  ssize_t
+    count;
+
+  unsigned char
+    buffer[8192];
+
+  assert(image != (Image *) NULL);
+  assert(image->signature == MagickSignature);
+  count=0;
+  for (i=0; i < (ssize_t) length; i+=count)
+  {
+    quantum=MagickMin(length-i,sizeof(buffer));
+    (void) ReadBlobStream(image,quantum,buffer,&count);
+    if (count <= 0)
+      {
+        count=0;
+        if (errno != EINTR)
+          break;
+      }
+  }
+  return(i < (ssize_t) length ? MagickFalse : MagickTrue);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
 +   D u p l i c a t e s B l o b                                               %
 %                                                                             %
 %                                                                             %
@@ -1485,32 +1567,6 @@ MagickExport unsigned char *ImageToBlob(const ImageInfo *image_info,
 %    o exception: return any errors or warnings in this structure.
 %
 */
-
-static inline const unsigned char *ReadBlobStream(Image *image,
-  const size_t length,unsigned char *data,ssize_t *count)
-{
-  assert(count != (ssize_t *) NULL);
-  assert(image->blob != (BlobInfo *) NULL);
-  if (image->blob->type != BlobStream)
-    {
-      *count=ReadBlob(image,length,data);
-      return(data);
-    }
-  if (image->blob->offset >= (MagickOffsetType) image->blob->length)
-    {
-      *count=0;
-      image->blob->eof=MagickTrue;
-      return(data);
-    }
-  data=image->blob->data+image->blob->offset;
-  *count=(ssize_t) MagickMin(length,(size_t) (image->blob->length-
-    image->blob->offset));
-  image->blob->offset+=(*count);
-  if (*count != (ssize_t) length)
-    image->blob->eof=MagickTrue;
-  return(data);
-}
-
 MagickExport MagickBooleanType ImageToFile(Image *image,char *filename,
   ExceptionInfo *exception)
 {
@@ -3676,61 +3732,6 @@ MagickExport MagickBooleanType SetBlobExtent(Image *image,
 %                                                                             %
 %                                                                             %
 %                                                                             %
-+  S k i p B l o b B y t e s                                                  %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  SkipBlobBytes() skips over bytes in a blob.
-%
-%  The format of the SkipBlobBytes method is:
-%
-%      MagickBooleanType SkipBlobBytes(Image *image,const size_t length)
-%
-%  A description of each parameter follows.
-%
-%    o image: the image.
-%
-%    o length:  the number of bytes to skip.
-%
-*/
-MagickExport MagickBooleanType SkipBlobBytes(Image *image,const size_t length)
-{
-  register ssize_t
-    i;
-
-  size_t
-    quantum;
-
-  ssize_t
-    count;
-
-  unsigned char
-    buffer[8192];
-
-  assert(image != (Image *) NULL);
-  assert(image->signature == MagickSignature);
-  count=0;
-  for (i=0; i < (ssize_t) length; i+=count)
-  {
-    quantum=MagickMin(length-i,sizeof(buffer));
-    (void) ReadBlobStream(image,quantum,buffer,&count);
-    if (count <= 0)
-      {
-        count=0;
-        if (errno != EINTR)
-          break;
-      }
-  }
-  return(i < (ssize_t) length ? MagickFalse : MagickTrue);
-}
-\f
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
 +  S y n c B l o b                                                            %
 %                                                                             %
 %                                                                             %
index eb4d71e1fc0d6030d13ef1acf28cf276b3db7703..16dd23c2b1749ec4983abe1467d9c241ff3c516e 100644 (file)
@@ -50,8 +50,7 @@ extern MagickExport MagickBooleanType
     ExceptionInfo *),
   IsBlobExempt(const Image *),
   IsBlobSeekable(const Image *),
-  IsBlobTemporary(const Image *),
-  SkipBlobBytes(Image *,const size_t);
+  IsBlobTemporary(const Image *);
 
 extern MagickExport MagickSizeType
   GetBlobSize(const Image *);