changeset 12306:d95510ee0c8f

istream-header-filter: Drop duplicate headers instead of assert-crashing with them.
author Timo Sirainen <tss@iki.fi>
date Tue, 19 Oct 2010 18:39:27 +0100
parents 0908326bf4b9
children 368fd1cce4d6
files src/lib-mail/istream-header-filter.c
diffstat 1 files changed, 10 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-mail/istream-header-filter.c	Mon Oct 18 19:00:59 2010 +0100
+++ b/src/lib-mail/istream-header-filter.c	Tue Oct 19 18:39:27 2010 +0100
@@ -499,7 +499,8 @@
 			      header_filter_callback *callback, void *context)
 {
 	struct header_filter_istream *mstream;
-	unsigned int i;
+	unsigned int i, j;
+	int ret;
 
 	i_assert((flags & (HEADER_FILTER_INCLUDE|HEADER_FILTER_EXCLUDE)) != 0);
 
@@ -510,10 +511,14 @@
 
 	mstream->headers = headers_count == 0 ? NULL :
 		p_new(mstream->pool, const char *, headers_count);
-	for (i = 0; i < headers_count; i++)  {
-		i_assert(i == 0 ||
-			 strcmp(mstream->headers[i-1], headers[i]) < 0);
-		mstream->headers[i] = p_strdup(mstream->pool, headers[i]);
+	for (i = j = 0; i < headers_count; i++)  {
+		ret = j == 0 ? -1 : strcmp(mstream->headers[j-1], headers[i]);
+		if (ret == 0) {
+			/* drop duplicate */
+			continue;
+		} 
+		i_assert(ret < 0);
+		mstream->headers[j++] = p_strdup(mstream->pool, headers[i]);
 	}
 	mstream->headers_count = headers_count;
 	mstream->hdr_buf = buffer_create_dynamic(mstream->pool, 1024);