Skip to content

Commit

Permalink
lib-storage: Fix crash in mail_get_header_stream() when its previous …
Browse files Browse the repository at this point in the history
…stream wasn't at EOF

At least this could have happened when indexes were disabled and running:

FETCH 1 (envelope body.peek[header.fields (foo)] bodystructure)

Fixes:
Panic: file index-mail-headers.c: line 198 (index_mail_parse_header_init): assertion failed: (!mail->data.header_parser_initialized)
  • Loading branch information
sirainen authored and villesavolainen committed Jun 14, 2017
1 parent e05d395 commit 3c93c5e
Showing 1 changed file with 13 additions and 5 deletions.
18 changes: 13 additions & 5 deletions src/lib-storage/index/index-mail-headers.c
Expand Up @@ -875,6 +875,19 @@ int index_mail_get_header_stream(struct mail *_mail,
struct istream *input;
string_t *dest;

if (mail->data.filter_stream != NULL) {
const unsigned char *data;
size_t size;

/* read through the previous filter_stream. this makes sure
that the fields are added to cache, and most importantly it
resets header_parser_initialized=FALSE so we don't assert
on it. */
while (i_stream_read_more(mail->data.filter_stream, &data, &size) > 0)
i_stream_skip(mail->data.filter_stream, size);
i_stream_destroy(&mail->data.filter_stream);
}

if (mail->data.save_bodystructure_header) {
/* we have to parse the header. */
const char *reason =
Expand All @@ -889,8 +902,6 @@ int index_mail_get_header_stream(struct mail *_mail,
headers->count) > 0) {
str_append(dest, "\n");
_mail->transaction->stats.cache_hit_count++;
if (mail->data.filter_stream != NULL)
i_stream_destroy(&mail->data.filter_stream);
mail->data.filter_stream =
i_stream_create_from_data(str_data(dest),
str_len(dest));
Expand Down Expand Up @@ -921,9 +932,6 @@ int index_mail_get_header_stream(struct mail *_mail,
if (mail_get_hdr_stream_because(_mail, NULL, reason, &input) < 0)
return -1;

if (mail->data.filter_stream != NULL)
i_stream_destroy(&mail->data.filter_stream);

index_mail_parse_header_init(mail, headers);
mail->data.filter_stream =
i_stream_create_header_filter(mail->data.stream,
Expand Down

0 comments on commit 3c93c5e

Please sign in to comment.