diff --git a/coders/bgr.c b/coders/bgr.c
index ed9b7ec..5a5b7b1 100644
--- a/coders/bgr.c
+++ b/coders/bgr.c
@@ -149,13 +149,9 @@
           image=DestroyImageList(image);
           return((Image *) NULL);
         }
-      for (i=0; i < image->offset; i++)
-        if (ReadBlobByte(image) == EOF)
-          {
-            ThrowFileException(exception,CorruptImageError,
-              "UnexpectedEndOfFile",image->filename);
-            break;
-          }
+      if (DiscardBlobBytes(image,image->offset) == MagickFalse)
+        ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
+          image->filename);
     }
   /*
     Create virtual canvas to support cropping (i.e. image.rgb[100x100+10+20]).
@@ -629,13 +625,9 @@
             image=DestroyImageList(image);
             return((Image *) NULL);
           }
-        for (i=0; i < image->offset; i++)
-          if (ReadBlobByte(image) == EOF)
-            {
-              ThrowFileException(exception,CorruptImageError,
-                "UnexpectedEndOfFile",image->filename);
-              break;
-            }
+        if (DiscardBlobBytes(image,image->offset) == MagickFalse)
+          ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
+            image->filename);
         length=GetQuantumExtent(canvas_image,quantum_info,BlueQuantum);
         for (i=0; i < (ssize_t) scene; i++)
           for (y=0; y < (ssize_t) image->extract_info.height; y++)
diff --git a/coders/cmyk.c b/coders/cmyk.c
index 31e223f..69b31e0 100644
--- a/coders/cmyk.c
+++ b/coders/cmyk.c
@@ -149,13 +149,9 @@
           image=DestroyImageList(image);
           return((Image *) NULL);
         }
-      for (i=0; i < image->offset; i++)
-        if (ReadBlobByte(image) == EOF)
-          {
-            ThrowFileException(exception,CorruptImageError,
-              "UnexpectedEndOfFile",image->filename);
-            break;
-          }
+      if (DiscardBlobBytes(image,image->offset) == MagickFalse)
+        ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
+          image->filename);
     }
   /*
     Create virtual canvas to support cropping (i.e. image.cmyk[100x100+10+20]).
@@ -701,13 +697,9 @@
             image=DestroyImageList(image);
             return((Image *) NULL);
           }
-        for (i=0; i < image->offset; i++)
-          if (ReadBlobByte(image) == EOF)
-            {
-              ThrowFileException(exception,CorruptImageError,
-                "UnexpectedEndOfFile",image->filename);
-              break;
-            }
+        if (DiscardBlobBytes(image,image->offset) == MagickFalse)
+          ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
+            image->filename);
         length=GetQuantumExtent(canvas_image,quantum_info,CyanQuantum);
         for (i=0; i < (ssize_t) scene; i++)
           for (y=0; y < (ssize_t) image->extract_info.height; y++)
diff --git a/coders/gray.c b/coders/gray.c
index db60438..c24980c 100644
--- a/coders/gray.c
+++ b/coders/gray.c
@@ -148,13 +148,9 @@
       image=DestroyImageList(image);
       return((Image *) NULL);
     }
-  for (i=0; i < image->offset; i++)
-    if (ReadBlobByte(image) == EOF)
-      {
-        ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
-          image->filename);
-        break;
-      }
+  if (DiscardBlobBytes(image,image->offset) == MagickFalse)
+    ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
+      image->filename);
   /*
     Create virtual canvas to support cropping (i.e. image.gray[100x100+10+20]).
   */
diff --git a/coders/mono.c b/coders/mono.c
index 71edd7f..0915be9 100644
--- a/coders/mono.c
+++ b/coders/mono.c
@@ -140,13 +140,9 @@
       image=DestroyImageList(image);
       return((Image *) NULL);
     }
-  for (i=0; i < image->offset; i++)
-    if (ReadBlobByte(image) == EOF)
-      {
-        ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
-          image->filename);
-        break;
-      }
+  if (DiscardBlobBytes(image,image->offset) == MagickFalse)
+    ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
+      image->filename);
   /*
     Initialize image colormap.
   */
diff --git a/coders/pes.c b/coders/pes.c
index 4a08c6c..81c32b9 100644
--- a/coders/pes.c
+++ b/coders/pes.c
@@ -493,9 +493,9 @@
     ThrowReaderException(CorruptImageError,"ImproperImageHeader");
   count=ReadBlob(image,4,version);
   offset=(int) ReadBlobLSBLong(image);
-  for (i=0; i < (offset+36); i++)
-    if (ReadBlobByte(image) == EOF)
-      break;
+  if (DiscardBlobBytes(image,offset+36) == MagickFalse)
+    ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
+      image->filename);
   if (EOFBlob(image) != MagickFalse)
     ThrowReaderException(CorruptImageError,"UnexpectedEndOfFile");
   /*
@@ -510,9 +510,9 @@
   }
   for ( ; i < 256L; i++)
     blocks[i].offset=0;
-  for (i=0; i < (ssize_t) (532L-number_colors-21); i++)
-    if (ReadBlobByte(image) == EOF)
-      break;
+  if (DiscardBlobBytes(image,532L-number_colors-21) == MagickFalse)
+    ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
+      image->filename);
   if (EOFBlob(image) != MagickFalse)
     ThrowReaderException(CorruptImageError,"UnexpectedEndOfFile");
   /*
diff --git a/coders/psd.c b/coders/psd.c
index 2877109..2b8ea3c 100644
--- a/coders/psd.c
+++ b/coders/psd.c
@@ -932,9 +932,12 @@
       length=ReadBlobMSBLong(image);
     }
   if ((image_info->number_scenes == 1) && (image_info->scene == 0))
-    if (DiscardBlobBytes(image,length) == MagickFalse)
-      ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
-        image->filename);
+    {
+      if (DiscardBlobBytes(image,length) == MagickFalse)
+        ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
+          image->filename);
+      length=0;
+    }
   if (length == 0)
     {
       if (image->debug != MagickFalse)
@@ -1065,19 +1068,15 @@
                     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.
                     */
                     if (DiscardBlobBytes(image,length-16) == MagickFalse)
-                      {
-                        ThrowFileException(exception,CorruptImageError,
-                          "UnexpectedEndOfFile",image->filename);
-                        break;
-                      }
+                      ThrowFileException(exception,CorruptImageError,
+                        "UnexpectedEndOfFile",image->filename);
                   }
                 combinedlength+=length+4;  /* +4 for length */
                 length=ReadBlobMSBLong(image);
@@ -1160,11 +1159,8 @@
                     "      unsupported data: length=%.20g",(double)
                     (size-combinedlength));
                 if (DiscardBlobBytes(image,size-combinedlength) == MagickFalse)
-                  {
-                    ThrowFileException(exception,CorruptImageError,
-                      "UnexpectedEndOfFile",image->filename);
-                    break;
-                  }
+                  ThrowFileException(exception,CorruptImageError,
+                    "UnexpectedEndOfFile",image->filename);
               }
             /*
               Allocate layered image.
diff --git a/coders/raw.c b/coders/raw.c
index 7f59eef..b834aba 100644
--- a/coders/raw.c
+++ b/coders/raw.c
@@ -146,13 +146,9 @@
       image=DestroyImageList(image);
       return((Image *) NULL);
     }
-  for (i=0; i < image->offset; i++)
-    if (ReadBlobByte(image) == EOF)
-      {
-        ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
-          image->filename);
-        break;
-      }
+  if (DiscardBlobBytes(image,image->offset) == MagickFalse)
+    ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
+      image->filename);
   /*
     Create virtual canvas to support cropping (i.e. image.gray[100x100+10+20]).
   */
diff --git a/coders/rgb.c b/coders/rgb.c
index 252b3ca..0ec26f2 100644
--- a/coders/rgb.c
+++ b/coders/rgb.c
@@ -149,13 +149,9 @@
           image=DestroyImageList(image);
           return((Image *) NULL);
         }
-      for (i=0; i < image->offset; i++)
-        if (ReadBlobByte(image) == EOF)
-          {
-            ThrowFileException(exception,CorruptImageError,
-              "UnexpectedEndOfFile",image->filename);
-            break;
-          }
+      if (DiscardBlobBytes(image,image->offset) == MagickFalse)
+        ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
+          image->filename);
     }
   /*
     Create virtual canvas to support cropping (i.e. image.rgb[100x100+10+20]).
@@ -636,13 +632,9 @@
             image=DestroyImageList(image);
             return((Image *) NULL);
           }
-        for (i=0; i < image->offset; i++)
-          if (ReadBlobByte(image) == EOF)
-            {
-              ThrowFileException(exception,CorruptImageError,
-                "UnexpectedEndOfFile",image->filename);
-              break;
-            }
+        if (DiscardBlobBytes(image,image->offset) == MagickFalse)
+          ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
+            image->filename);
         length=GetQuantumExtent(canvas_image,quantum_info,RedQuantum);
         for (i=0; i < (ssize_t) scene; i++)
           for (y=0; y < (ssize_t) image->extract_info.height; y++)
diff --git a/coders/uyvy.c b/coders/uyvy.c
index 0ac9253..8d1506d 100644
--- a/coders/uyvy.c
+++ b/coders/uyvy.c
@@ -139,13 +139,9 @@
   status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
   if (status == MagickFalse)
     return((Image *) NULL);
-  for (i=0; i < image->offset; i++)
-    if (ReadBlobByte(image) == EOF)
-      {
-        ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
-          image->filename);
-        break;
-      }
+  if (DiscardBlobBytes(image,image->offset) == MagickFalse)
+    ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
+      image->filename);
   image->depth=8;
   if (image_info->ping != MagickFalse)
     {
diff --git a/coders/wbmp.c b/coders/wbmp.c
index 12366de..c94a9b5 100644
--- a/coders/wbmp.c
+++ b/coders/wbmp.c
@@ -175,13 +175,9 @@
     ThrowReaderException(CorruptImageError,"CorruptWBMPimage");
   if ((image->columns == 0) || (image->rows == 0))
     ThrowReaderException(CorruptImageError,"ImproperImageHeader");
-  for (i=0; i < image->offset; i++)
-    if (ReadBlobByte(image) == EOF)
-      {
-        ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
-          image->filename);
-        break;
-      }
+  if (DiscardBlobBytes(image,image->offset) == MagickFalse)
+    ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
+      image->filename);
   if (AcquireImageColormap(image,2) == MagickFalse)
     ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
   if (image_info->ping != MagickFalse)
diff --git a/coders/xcf.c b/coders/xcf.c
index 4a78731..7e39de6 100644
--- a/coders/xcf.c
+++ b/coders/xcf.c
@@ -841,8 +841,9 @@
       break;
      case PROP_PARASITES:
      {
-        for (i=0; i < (ssize_t) prop_size; i++ )
-          (void) ReadBlobByte(image);
+       if (DiscardBlobBytes(image,prop_size) == MagickFalse)
+         ThrowFileException(&image->exception,CorruptImageError,
+           "UnexpectedEndOfFile",image->filename);
 
         /*
        ssize_t base = info->cp;
@@ -1069,8 +1070,9 @@
            by some Gimp versions.
         */
         size_t num_colours = ReadBlobMSBLong(image);
-        for (i=0; i < (ssize_t) (3L*num_colours); i++ )
-          (void) ReadBlobByte(image);
+        if (DiscardBlobBytes(image,3*num_colours) == MagickFalse)
+          ThrowFileException(&image->exception,CorruptImageError,
+            "UnexpectedEndOfFile",image->filename);
     /*
       if (info->file_version == 0)
       {
@@ -1116,10 +1118,9 @@
       case PROP_GUIDES:
       {
          /* just skip it - we don't care about guides */
-        for (i=0; i < (ssize_t) prop_size; i++ )
-          if (ReadBlobByte(image) == EOF)
-            ThrowFileException(exception,CorruptImageError,
-              "UnexpectedEndOfFile",image->filename);
+        if (DiscardBlobBytes(image,prop_size) == MagickFalse)
+          ThrowFileException(&image->exception,CorruptImageError,
+            "UnexpectedEndOfFile",image->filename);
       }
       break;
 
@@ -1157,11 +1158,9 @@
     case PROP_PARASITES:
       {
         /* BOGUS: we may need these for IPTC stuff */
-        for (i=0; i < (ssize_t) prop_size; i++ )
-          if (ReadBlobByte(image) == EOF)
-            ThrowFileException(exception,CorruptImageError,
-              "UnexpectedEndOfFile",image->filename);
-
+        if (DiscardBlobBytes(image,prop_size) == MagickFalse)
+          ThrowFileException(&image->exception,CorruptImageError,
+            "UnexpectedEndOfFile",image->filename);
         /*
       gssize_t         base = info->cp;
       GimpParasite *p;
@@ -1188,10 +1187,9 @@
     case PROP_PATHS:
       {
       /* BOGUS: just skip it for now */
-        for (i=0; i< (ssize_t) prop_size; i++ )
-          if (ReadBlobByte(image) == EOF)
-            ThrowFileException(exception,CorruptImageError,
-              "UnexpectedEndOfFile",image->filename);
+        if (DiscardBlobBytes(image,prop_size) == MagickFalse)
+          ThrowFileException(&image->exception,CorruptImageError,
+            "UnexpectedEndOfFile",image->filename);
 
         /*
       PathList *paths = xcf_load_bzpaths (gimage, info);
diff --git a/coders/ycbcr.c b/coders/ycbcr.c
index 6571699..ede8af1 100644
--- a/coders/ycbcr.c
+++ b/coders/ycbcr.c
@@ -158,13 +158,9 @@
           image=DestroyImageList(image);
           return((Image *) NULL);
         }
-      for (i=0; i < image->offset; i++)
-        if (ReadBlobByte(image) == EOF)
-          {
-            ThrowFileException(exception,CorruptImageError,
-              "UnexpectedEndOfFile",image->filename);
-            break;
-          }
+      if (DiscardBlobBytes(image,image->offset) == MagickFalse)
+        ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
+          image->filename);
     }
   /*
     Create virtual canvas to support cropping (i.e. image.rgb[100x100+10+20]).
@@ -555,13 +551,9 @@
             image=DestroyImageList(image);
             return((Image *) NULL);
           }
-        for (i=0; i < image->offset; i++)
-          if (ReadBlobByte(image) == EOF)
-            {
-              ThrowFileException(exception,CorruptImageError,
-                "UnexpectedEndOfFile",image->filename);
-              break;
-            }
+        if (DiscardBlobBytes(image,image->offset) == MagickFalse)
+          ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
+            image->filename);
         length=GetQuantumExtent(canvas_image,quantum_info,RedQuantum);
         for (i=0; i < (ssize_t) scene; i++)
           for (y=0; y < (ssize_t) image->extract_info.height; y++)
diff --git a/coders/yuv.c b/coders/yuv.c
index 5981305..7a46c6d 100644
--- a/coders/yuv.c
+++ b/coders/yuv.c
@@ -186,13 +186,9 @@
           image=DestroyImageList(image);
           return((Image *) NULL);
         }
-      for (i=0; i < image->offset; i++)
-        if (ReadBlobByte(image) == EOF)
-          {
-            ThrowFileException(exception,CorruptImageError,
-              "UnexpectedEndOfFile",image->filename);
-            break;
-          }
+      if (DiscardBlobBytes(image,image->offset) == MagickFalse)
+        ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
+          image->filename);
     }
   /*
     Allocate memory for a scanline.
