File ImageMagick-security-exif.patch of Package ImageMagick.1463

http://www.imagemagick.org/discourse-server/viewtopic.php?f=4&t=20629
Index: ImageMagick-6.7.2-7/coders/jpeg.c
===================================================================
--- ImageMagick-6.7.2-7.orig/coders/jpeg.c
+++ ImageMagick-6.7.2-7/coders/jpeg.c
@@ -301,6 +301,8 @@ static MagickBooleanType JPEGErrorHandle
 
 static MagickBooleanType JPEGWarningHandler(j_common_ptr jpeg_info,int level)
 {
+#define JPEGExcessiveWarnings  1000
+
   char
     message[JMSG_LENGTH_MAX];
 
@@ -319,11 +321,12 @@ static MagickBooleanType JPEGWarningHand
         Process warning message.
       */
       (jpeg_info->err->format_message)(jpeg_info,message);
+      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 ((image->debug != MagickFalse) &&
Index: ImageMagick-6.7.2-7/coders/tiff.c
===================================================================
--- ImageMagick-6.7.2-7.orig/coders/tiff.c
+++ ImageMagick-6.7.2-7/coders/tiff.c
@@ -604,7 +604,7 @@ static void TIFFGetEXIFProperties(TIFF *
         ascii=(char *) NULL;
         if ((TIFFGetField(tiff,exif_info[i].tag,&ascii,&sans) != 0) &&
             (ascii != (char *) NULL) && (*ascii != '\0'))
-          (void) CopyMagickMemory(value,ascii,MaxTextExtent);
+          (void) CopyMagickString(value,ascii,MaxTextExtent);
         break;
       }
       case TIFF_SHORT:
Index: ImageMagick-6.7.2-7/magick/property.c
===================================================================
--- ImageMagick-6.7.2-7.orig/magick/property.c
+++ ImageMagick-6.7.2-7/magick/property.c
@@ -1269,6 +1269,8 @@ static MagickBooleanType GetEXIFProperty
         break;
       components=(ssize_t) ((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
@@ -1290,6 +1292,8 @@ static MagickBooleanType GetEXIFProperty
             buffer[MaxTextExtent],
             *value;
 
+          value=(char *) NULL;
+          *buffer='\0';
           switch (format)
           {
             case EXIF_FMT_BYTE:
Index: ImageMagick-6.7.2-7/magick/profile.c
===================================================================
--- ImageMagick-6.7.2-7.orig/magick/profile.c
+++ ImageMagick-6.7.2-7/magick/profile.c
@@ -1927,8 +1927,10 @@ MagickExport MagickBooleanType SyncImage
       format=(ssize_t) ReadProfileShort(endian,q+2);
       if ((format-1) >= EXIF_NUM_FORMATS)
         break;
-      components=(int) 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