diff -uNr ImageMagick-6.6.6-10-dos//magick/property.c ImageMagick-6.6.6-10//magick/property.c --- ImageMagick-6.6.6-10-dos//magick/property.c 2012-04-13 22:20:51.461261921 -0400 +++ ImageMagick-6.6.6-10//magick/property.c 2012-04-13 22:21:06.337908868 -0400 @@ -459,6 +459,13 @@ return(y); } +static inline ssize_t MagickMin(const ssize_t x,const ssize_t y) +{ + if (x < y) + return(x); + return(y); +} + static inline int ReadPropertyByte(const unsigned char **p,size_t *length) { int @@ -593,7 +600,7 @@ continue; if (ReadPropertyByte(&info,&length) != (unsigned char) 'M') continue; - id=(ssize_t) ReadPropertyMSBShort(&info,&length); + id=(ssize_t) ((int) ReadPropertyMSBShort(&info,&length)); if (id < (ssize_t) start) continue; if (id > (ssize_t) stop) @@ -624,7 +631,7 @@ No name match, scroll forward and try next. */ info+=count; - length-=count; + length-=MagickMin(count,(ssize_t) length); continue; } if ((*name == '#') && (sub_number != 1)) @@ -634,7 +641,7 @@ */ sub_number--; info+=count; - length-=count; + length-=MagickMin(count,(ssize_t) length); continue; } /* @@ -649,7 +656,7 @@ (void) CopyMagickMemory(attribute,(char *) info,(size_t) count); attribute[count]='\0'; info+=count; - length-=count; + length-=MagickMin(count,(ssize_t) length); if ((id <= 1999) || (id >= 2999)) (void) SetImageProperty((Image *) image,key,(const char *) attribute); @@ -1103,6 +1110,9 @@ size_t length; + SplayTreeInfo + *exif_resources; + ssize_t offset; @@ -1225,7 +1235,7 @@ } if (length < 16) return(MagickFalse); - id=(ssize_t) ReadPropertyShort(LSBEndian,exif); + id=(ssize_t) ((int) ReadPropertyShort(LSBEndian,exif)); endian=LSBEndian; if (id == 0x4949) endian=LSBEndian; @@ -1249,6 +1259,8 @@ level=0; entry=0; tag_offset=0; + exif_resources=NewSplayTree((int (*)(const void *,const void *)) NULL, + (void *(*)(void *)) NULL,(void *(*)(void *)) NULL); do { /* @@ -1264,7 +1276,7 @@ /* Determine how many entries there are in the current IFD. */ - number_entries=ReadPropertyShort(endian,directory); + number_entries=(size_t) ((int) ReadPropertyShort(endian,directory)); for ( ; entry < number_entries; entry++) { ssize_t @@ -1280,9 +1292,12 @@ size_t format; - q=(unsigned char *) (directory+2+(12*entry)); - tag_value=(ssize_t) (ReadPropertyShort(endian,q)+tag_offset); - format=(size_t) ReadPropertyShort(endian,q+2); + q=(unsigned char *) (directory+(12*entry)+2); + if (GetValueFromSplayTree(exif_resources,q) == q) + break; + (void) AddValueToSplayTree(exif_resources,q,q); + tag_value=(ssize_t) ((int) ReadPropertyShort(endian,q)+tag_offset); + format=(size_t) ((int) ReadPropertyShort(endian,q+2)); if (format >= (sizeof(tag_bytes)/sizeof(*tag_bytes))) break; components=(ssize_t) ((int) ReadPropertyLong(endian,q+4)); @@ -1335,7 +1350,7 @@ case EXIF_FMT_ULONG: { EXIFMultipleValues(4,"%.20g",(double) - ReadPropertyLong(endian,p1)); + ((int) ReadPropertyLong(endian,p1))); break; } case EXIF_FMT_SLONG: @@ -1347,8 +1362,8 @@ case EXIF_FMT_URATIONAL: { EXIFMultipleFractions(8,"%.20g/%.20g",(double) - ReadPropertyLong(endian,p1),(double) - ReadPropertyLong(endian,p1+4)); + ((int) ReadPropertyLong(endian,p1)),(double) + ((int) ReadPropertyLong(endian,p1+4))); break; } case EXIF_FMT_SRATIONAL: @@ -1449,13 +1464,12 @@ } } if ((tag_value == TAG_EXIF_OFFSET) || - (tag_value == TAG_INTEROP_OFFSET) || - (tag_value == TAG_GPS_OFFSET)) + (tag_value == TAG_INTEROP_OFFSET) || (tag_value == TAG_GPS_OFFSET)) { size_t offset; - offset=(size_t) ReadPropertyLong(endian,p); + offset=(size_t) ((int) ReadPropertyLong(endian,p)); if ((offset < length) && (level < (MaxDirectoryStack-2))) { size_t @@ -1473,8 +1487,8 @@ level++; if ((directory+2+(12*number_entries)) > (exif+length)) break; - offset=(size_t) ReadPropertyLong(endian,directory+2+(12* - number_entries)); + offset=(size_t) ((int) ReadPropertyLong(endian,directory+2+(12* + number_entries))); if ((offset != 0) && (offset < length) && (level < (MaxDirectoryStack-2))) { @@ -1488,6 +1502,7 @@ } } } while (level > 0); + exif_resources=DestroySplayTree(exif_resources); return(MagickTrue); } @@ -1629,7 +1644,7 @@ in_subpath=MagickFalse; while (length > 0) { - selector=(ssize_t) ReadPropertyMSBShort(&blob,&length); + selector=(ssize_t) ((int) ReadPropertyMSBShort(&blob,&length)); switch (selector) { case 0: @@ -1638,15 +1653,15 @@ if (knot_count != 0) { blob+=24; - length-=24; + length-=MagickMin(24,(ssize_t) length); break; } /* Expected subpath length record. */ - knot_count=(ssize_t) ReadPropertyMSBShort(&blob,&length); + knot_count=(ssize_t) ((int) ReadPropertyMSBShort(&blob,&length)); blob+=22; - length-=22; + length-=MagickMin(22,(ssize_t) length); break; } case 1: @@ -1660,7 +1675,7 @@ Unexpected subpath knot */ blob+=24; - length-=24; + length-=MagickMin(24,(ssize_t) length); break; } /* @@ -1672,8 +1687,8 @@ xx, yy; - yy=ReadPropertyMSBLong(&blob,&length); - xx=ReadPropertyMSBLong(&blob,&length); + yy=(size_t) ((int) ReadPropertyMSBLong(&blob,&length)); + xx=(size_t) ((int) ReadPropertyMSBLong(&blob,&length)); x=(ssize_t) xx; if (xx > 2147483647) x=(ssize_t) xx-4294967295-1; @@ -1761,7 +1776,7 @@ default: { blob+=24; - length-=24; + length-=MagickMin(24,(ssize_t) length); break; } } @@ -1826,7 +1841,7 @@ in_subpath=MagickFalse; while (length != 0) { - selector=(ssize_t) ReadPropertyMSBShort(&blob,&length); + selector=(ssize_t) ((int) ReadPropertyMSBShort(&blob,&length)); switch (selector) { case 0: @@ -1835,15 +1850,15 @@ if (knot_count != 0) { blob+=24; - length-=24; + length-=MagickMin(24,(ssize_t) length); break; } /* Expected subpath length record. */ - knot_count=(ssize_t) ReadPropertyMSBShort(&blob,&length); + knot_count=(ssize_t) ((int) ReadPropertyMSBShort(&blob,&length)); blob+=22; - length-=22; + length-=MagickMin(22,(ssize_t) length); break; } case 1: @@ -1857,7 +1872,7 @@ Unexpected subpath knot. */ blob+=24; - length-=24; + length-=MagickMin(24,(ssize_t) length); break; } /* @@ -1932,7 +1947,7 @@ default: { blob+=24; - length-=24; + length-=MagickMin(24,(ssize_t) length); break; } }