Mercurial > dovecot > core-2.2
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);