dovecot-2.2: imap: Fixed fetching partial ranges from non-BODY[]

dovecot at dovecot.org dovecot at dovecot.org
Sun Aug 12 02:08:36 EEST 2012


details:   http://hg.dovecot.org/dovecot-2.2/rev/f4de7ed984b3
changeset: 14868:f4de7ed984b3
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Aug 12 02:08:30 2012 +0300
description:
imap: Fixed fetching partial ranges from non-BODY[]

diffstat:

 src/lib-imap-storage/imap-msgpart.c |  11 ++++++-----
 1 files changed, 6 insertions(+), 5 deletions(-)

diffs (45 lines):

diff -r a69d858948ca -r f4de7ed984b3 src/lib-imap-storage/imap-msgpart.c
--- a/src/lib-imap-storage/imap-msgpart.c	Sun Aug 12 01:38:51 2012 +0300
+++ b/src/lib-imap-storage/imap-msgpart.c	Sun Aug 12 02:08:30 2012 +0300
@@ -362,7 +362,7 @@
 
 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 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 @@
 		   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);


More information about the dovecot-cvs mailing list