]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
istream-header-filter: Drop duplicate headers instead of assert-crashing with them.
authorTimo Sirainen <tss@iki.fi>
Tue, 19 Oct 2010 17:39:27 +0000 (18:39 +0100)
committerTimo Sirainen <tss@iki.fi>
Tue, 19 Oct 2010 17:39:27 +0000 (18:39 +0100)
src/lib-mail/istream-header-filter.c

index 252e81bb50e4fdc781ea6cd5fd6318c1aab30370..25c00aab86c7f993883af34fd7086e3d4d6449b5 100644 (file)
@@ -499,7 +499,8 @@ i_stream_create_header_filter(struct istream *input,
                              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 @@ i_stream_create_header_filter(struct istream *input,
 
        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);