]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-mail: istream-header-filter - Check errors reading header
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 3 May 2016 13:54:46 +0000 (16:54 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 10 May 2016 21:22:35 +0000 (17:22 -0400)
This probably doesn't affect the results much, since the stream_errno is set
anyway. But it's better to abort early, just in case the broken state might
end up asserting later.

src/lib-mail/istream-header-filter.c

index 1afb02641ba7fab677024669bf2ae2009c7f08c2..d094f27dc1b2500cdb38a646cd8378b3dc84ff16 100644 (file)
@@ -446,12 +446,12 @@ i_stream_header_filter_seek_to_header(struct header_filter_istream *mstream,
        mstream->seen_eoh = FALSE;
 }
 
-static void skip_header(struct header_filter_istream *mstream)
+static int skip_header(struct header_filter_istream *mstream)
 {
        size_t pos;
 
        if (mstream->header_read)
-               return;
+               return 0;
 
        if (mstream->istream.access_counter !=
            mstream->istream.parent->real_stream->access_counter) {
@@ -464,6 +464,7 @@ static void skip_header(struct header_filter_istream *mstream)
                pos = i_stream_get_data_size(&mstream->istream.istream);
                i_stream_skip(&mstream->istream.istream, pos);
        }
+       return mstream->istream.istream.stream_errno != 0 ? -1 : 0;
 }
 
 static void
@@ -502,7 +503,8 @@ static void i_stream_header_filter_seek(struct istream_private *stream,
        /* if we haven't parsed the whole header yet, we don't know if we
           want to seek inside header or body. so make sure we've parsed the
           header. */
-       skip_header(mstream);
+       if (skip_header(mstream) < 0)
+               return;
        stream_reset_to(mstream, v_offset);
 
        if (v_offset < mstream->header_size.virtual_size) {
@@ -542,7 +544,8 @@ i_stream_header_filter_stat(struct istream_private *stream, bool exact)
 
        /* fix the filtered header size */
        old_offset = stream->istream.v_offset;
-       skip_header(mstream);
+       if (skip_header(mstream) < 0)
+               return -1;
 
        stream->statbuf.st_size -=
                (off_t)mstream->header_size.physical_size -