From 30ff2d7418317a3ec078761673c8ce0daf2fc940 Mon Sep 17 00:00:00 2001
From: Frank Warmerdam <[EMAIL REDACTED]>
Date: Thu, 13 Sep 2007 20:49:14 +0000
Subject: [PATCH] Fix _TIFFMergeFields() so duplicates are ignored (#1585)
---
ChangeLog | 6 ++++++
libtiff/tif_dirinfo.c | 27 ++++++++++++---------------
2 files changed, 18 insertions(+), 15 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 1a4faf3e..32c8b941 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2007-09-13 Frank Warmerdam <warmerdam@pobox.com>
+
+ * tif_dirinfo.c: _TIFFMergeFields() now only merges in field
+ definitions that are missing. Existing definitions are silently
+ ignored. (Bug #1585)
+
2007-07-18 Andrey Kiselev <dron@ak4719.spb.edu>
* libtiff/{Makefile.am, Makefile.v}: Do not distribute tiffconf.h,
diff --git a/libtiff/tif_dirinfo.c b/libtiff/tif_dirinfo.c
index 74d1cb5d..5cb96e8c 100644
--- a/libtiff/tif_dirinfo.c
+++ b/libtiff/tif_dirinfo.c
@@ -1,4 +1,4 @@
-/* $Id: tif_dirinfo.c,v 1.65.2.4 2007-06-29 20:06:46 bfriesen Exp $ */
+/* $Id: tif_dirinfo.c,v 1.65.2.5 2007-09-13 20:49:15 fwarmerdam Exp $ */
/*
* Copyright (c) 1988-1997 Sam Leffler
@@ -596,18 +596,6 @@ _TIFFMergeFieldInfo(TIFF* tif, const TIFFFieldInfo info[], int n)
TIFFFieldInfo** tp;
int i;
- for (i = 0; i < n; i++) {
- const TIFFFieldInfo *fip =
- _TIFFFindFieldInfo(tif, info[i].field_tag, TIFF_ANY);
- if (fip) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Field with tag %lu is already registered as \"%s\"",
- (unsigned int) info[i].field_tag,
- fip->field_name);
- return 0;
- }
- }
-
tif->tif_foundfield = NULL;
if (tif->tif_nfields > 0) {
@@ -627,10 +615,19 @@ _TIFFMergeFieldInfo(TIFF* tif, const TIFFFieldInfo info[], int n)
}
tp = tif->tif_fieldinfo + tif->tif_nfields;
for (i = 0; i < n; i++)
- *tp++ = (TIFFFieldInfo*) (info + i); /* XXX */
+ {
+ const TIFFFieldInfo *fip =
+ _TIFFFindFieldInfo(tif, info[i].field_tag, info[i].field_type);
+
+ /* only add definitions that aren't already present */
+ if (!fip) {
+ *tp++ = (TIFFFieldInfo*) (info + i);
+ tif->tif_nfields++;
+ }
+ }
/* Sort the field info by tag number */
- qsort(tif->tif_fieldinfo, tif->tif_nfields += n,
+ qsort(tif->tif_fieldinfo, tif->tif_nfields,
sizeof (TIFFFieldInfo*), tagCompare);
return n;