Blame SOURCES/libtiff-unknown-fix.patch

e4d7d2
Ooops, previous fix to unknown-tag handling caused TIFFReadDirectory to
e4d7d2
sometimes complain about out-of-order tags when there weren't really any.
e4d7d2
Fix by decoupling that logic from the tag search logic.
e4d7d2
e4d7d2
Filed upstream at http://bugzilla.maptools.org/show_bug.cgi?id=2210
e4d7d2
e4d7d2
e4d7d2
diff -Naur tiff-3.9.4.orig/libtiff/tif_dirread.c tiff-3.9.4/libtiff/tif_dirread.c
e4d7d2
--- tiff-3.9.4.orig/libtiff/tif_dirread.c	2010-06-14 10:27:51.000000000 -0400
e4d7d2
+++ tiff-3.9.4/libtiff/tif_dirread.c	2010-06-16 01:27:03.000000000 -0400
e4d7d2
@@ -83,6 +83,7 @@
e4d7d2
 	const TIFFFieldInfo* fip;
e4d7d2
 	size_t fix;
e4d7d2
 	uint16 dircount;
e4d7d2
+	uint16 previous_tag = 0;
e4d7d2
 	int diroutoforderwarning = 0, compressionknown = 0;
e4d7d2
 	int haveunknowntags = 0;
e4d7d2
 
e4d7d2
@@ -163,23 +164,24 @@
e4d7d2
 
e4d7d2
 		if (dp->tdir_tag == IGNORE)
e4d7d2
 			continue;
e4d7d2
-		if (fix >= tif->tif_nfields)
e4d7d2
-			fix = 0;
e4d7d2
 
e4d7d2
 		/*
e4d7d2
 		 * Silicon Beach (at least) writes unordered
e4d7d2
 		 * directory tags (violating the spec).  Handle
e4d7d2
 		 * it here, but be obnoxious (maybe they'll fix it?).
e4d7d2
 		 */
e4d7d2
-		if (dp->tdir_tag < tif->tif_fieldinfo[fix]->field_tag) {
e4d7d2
+		if (dp->tdir_tag < previous_tag) {
e4d7d2
 			if (!diroutoforderwarning) {
e4d7d2
 				TIFFWarningExt(tif->tif_clientdata, module,
e4d7d2
 	"%s: invalid TIFF directory; tags are not sorted in ascending order",
e4d7d2
 					    tif->tif_name);
e4d7d2
 				diroutoforderwarning = 1;
e4d7d2
 			}
e4d7d2
-			fix = 0;			/* O(n^2) */
e4d7d2
 		}
e4d7d2
+		previous_tag = dp->tdir_tag;
e4d7d2
+		if (fix >= tif->tif_nfields ||
e4d7d2
+		    dp->tdir_tag < tif->tif_fieldinfo[fix]->field_tag)
e4d7d2
+			fix = 0;			/* O(n^2) */
e4d7d2
 		while (fix < tif->tif_nfields &&
e4d7d2
 		    tif->tif_fieldinfo[fix]->field_tag < dp->tdir_tag)
e4d7d2
 			fix++;