]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imap: Fixed fetching partial ranges from non-BODY[]
authorTimo Sirainen <tss@iki.fi>
Sat, 11 Aug 2012 23:08:30 +0000 (02:08 +0300)
committerTimo Sirainen <tss@iki.fi>
Sat, 11 Aug 2012 23:08:30 +0000 (02:08 +0300)
src/lib-imap-storage/imap-msgpart.c

index 59176c9ec8997426fef1d2d5bcc0cdf9463d1a42..189fd5f4f9f394fa753cf1d0006f346790684add 100644 (file)
@@ -362,7 +362,7 @@ imap_msgpart_get_partial_header(struct mail *mail, struct istream *mail_input,
 
 static void
 skip_using_parts(struct mail *mail, struct istream *input,
-                uoff_t *virtual_skip)
+                uoff_t physical_start, uoff_t *virtual_skip)
 {
        enum mail_lookup_abort old_lookup_abort;
        struct message_part *parts, *part;
@@ -382,14 +382,15 @@ skip_using_parts(struct mail *mail, struct istream *input,
                /* skip header */
                vpos += part->header_size.virtual_size;
                *virtual_skip -= part->header_size.virtual_size;
-               i_stream_seek(input, part->physical_pos +
+               i_stream_seek(input, physical_start + part->physical_pos +
                              part->header_size.physical_size);
 
                if (vpos + part->body_size.virtual_size <= *virtual_skip) {
                        /* skip body */
                        vpos += part->body_size.virtual_size;
                        *virtual_skip -= part->body_size.virtual_size;
-                       i_stream_seek(input, part->physical_pos +
+                       i_stream_seek(input, physical_start +
+                                     part->physical_pos +
                                      part->header_size.physical_size +
                                      part->body_size.physical_size);
                        part = part->next;
@@ -419,12 +420,12 @@ imap_msgpart_crlf_seek(struct mail *mail, struct istream *input,
                   cache->physical_start == physical_start &&
                   cache->virtual_pos < virtual_skip) {
                /* use cache */
-               i_stream_seek(input, cache->physical_pos);
+               i_stream_seek(input, physical_start + cache->physical_pos);
                virtual_skip -= cache->virtual_pos;
        } else {
                /* can't use cache, but maybe we can skip faster using the
                   message parts. */
-               skip_using_parts(mail, input, &virtual_skip);
+               skip_using_parts(mail, input, physical_start, &virtual_skip);
        }
        crlf_input = i_stream_create_crlf(input);
        i_stream_unref(&input);