File ImageMagick-security-exif.patch of Package ImageMagick

http://www.imagemagick.org/discourse-server/viewtopic.php?f=4&t=20629
Index: ImageMagick-6.6.5-8/coders/jpeg.c
===================================================================
--- ImageMagick-6.6.5-8.orig/coders/jpeg.c
+++ ImageMagick-6.6.5-8/coders/jpeg.c
@@ -207,9 +207,12 @@ static MagickBooleanType IsJPEG(const un
 %    o exception: return any errors or warnings in this structure.
 %
 */
+static void JPEGErrorHandler(j_common_ptr jpeg_info);
 
 static MagickBooleanType EmitMessage(j_common_ptr jpeg_info,int level)
 {
+#define JPEGExcessiveWarnings  1000
+
   char
     message[JMSG_LENGTH_MAX];
 
@@ -224,11 +227,12 @@ static MagickBooleanType EmitMessage(j_c
   image=error_manager->image;
   if (level < 0)
     {
+      if (jpeg_info->err->num_warnings++ > JPEGExcessiveWarnings)
+        JPEGErrorHandler(jpeg_info);
       if ((jpeg_info->err->num_warnings == 0) ||
           (jpeg_info->err->trace_level >= 3))
         ThrowBinaryException(CorruptImageWarning,(char *) message,
           image->filename);
-      jpeg_info->err->num_warnings++;
     }
   else
     if (jpeg_info->err->trace_level >= level)
Index: ImageMagick-6.6.5-8/coders/tiff.c
===================================================================
--- ImageMagick-6.6.5-8.orig/coders/tiff.c
+++ ImageMagick-6.6.5-8/coders/tiff.c
@@ -593,7 +593,7 @@ static void TIFFGetEXIFProperties(TIFF *
           *ascii;
 
         if (TIFFGetField(tiff,exif_info[i].tag,&ascii) != 0)
-          (void) CopyMagickMemory(value,ascii,MaxTextExtent);
+          (void) CopyMagickString(value,ascii,MaxTextExtent);
         break;
       }
       case TIFF_SHORT:
Index: ImageMagick-6.6.5-8/magick/property.c
===================================================================
--- ImageMagick-6.6.5-8.orig/magick/property.c
+++ ImageMagick-6.6.5-8/magick/property.c
@@ -1304,6 +1304,8 @@ static MagickBooleanType GetEXIFProperty
         break;
       components=(int) ReadPropertyLong(endian,q+4);
       number_bytes=(size_t) components*tag_bytes[format];
+      if (number_bytes < components)
+        break;  /* prevent overflow */
       if (number_bytes <= 4)
         p=q+8;
       else
@@ -1327,6 +1329,8 @@ static MagickBooleanType GetEXIFProperty
             buffer[MaxTextExtent],
             *value;
 
+          value=(char *) NULL;
+          *buffer='\0';
           switch (format)
           {
             case EXIF_FMT_BYTE:
Index: ImageMagick-6.6.5-8/magick/profile.c
===================================================================
--- ImageMagick-6.6.5-8.orig/magick/profile.c
+++ ImageMagick-6.6.5-8/magick/profile.c
@@ -1738,8 +1738,10 @@
       format=(long) ReadProfileShort(endian,q+2);
       if ((format-1) >= EXIF_NUM_FORMATS)
         break;
-      components=(long) ReadProfileLong(endian,q+4);
+      components=(ssize_t) ((int) ReadProfileLong(endian,q+4));
       number_bytes=(size_t) components*format_bytes[format];
+      if (number_bytes < components)
+        break;  /* prevent overflow */
       if (number_bytes <= 4)
         p=q+8;
       else
openSUSE Build Service is sponsored by