dovecot-2.0: istream-header-filter: Drop duplicate headers inste...

dovecot at dovecot.org dovecot at dovecot.org
Tue Oct 19 20:40:08 EEST 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/d95510ee0c8f
changeset: 12306:d95510ee0c8f
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Oct 19 18:39:27 2010 +0100
description:
istream-header-filter: Drop duplicate headers instead of assert-crashing with them.

diffstat:

 src/lib-mail/istream-header-filter.c |  15 ++++++++++-----
 1 files changed, 10 insertions(+), 5 deletions(-)

diffs (32 lines):

diff -r 0908326bf4b9 -r d95510ee0c8f src/lib-mail/istream-header-filter.c
--- 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);


More information about the dovecot-cvs mailing list