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