libtiff: Fix _TIFFMergeFields() so duplicates are ignored (#1585)

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;