dovecot-2.2: istream-attachment-connector: Avoid seeking in the ...
dovecot at dovecot.org
dovecot at dovecot.org
Wed Aug 22 10:18:58 EEST 2012
details: http://hg.dovecot.org/dovecot-2.2/rev/9cefc52d688f
changeset: 14944:9cefc52d688f
user: Timo Sirainen <tss at iki.fi>
date: Wed Aug 22 10:18:44 2012 +0300
description:
istream-attachment-connector: Avoid seeking in the base stream, it may not be seekable.
diffstat:
src/lib-mail/istream-attachment-connector.c | 16 ++++++++++------
1 files changed, 10 insertions(+), 6 deletions(-)
diffs (51 lines):
diff -r 34e4c04ae679 -r 9cefc52d688f src/lib-mail/istream-attachment-connector.c
--- a/src/lib-mail/istream-attachment-connector.c Wed Aug 22 10:18:08 2012 +0300
+++ b/src/lib-mail/istream-attachment-connector.c Wed Aug 22 10:18:44 2012 +0300
@@ -11,7 +11,7 @@
struct istream_attachment_connector {
pool_t pool;
struct istream *base_input;
- uoff_t msg_size;
+ uoff_t base_input_offset, msg_size;
uoff_t encoded_offset;
ARRAY(struct istream *) streams;
@@ -27,6 +27,7 @@
conn = p_new(pool, struct istream_attachment_connector, 1);
conn->pool = pool;
conn->base_input = base_input;
+ conn->base_input_offset = base_input->v_offset;
conn->msg_size = msg_size;
p_array_init(&conn->streams, pool, 8);
i_stream_ref(conn->base_input);
@@ -64,10 +65,11 @@
if (base_prefix_size > 0) {
/* add a part of the base message before the attachment */
- input = i_stream_create_limit(conn->base_input,
+ input = i_stream_create_range(conn->base_input,
+ conn->base_input_offset,
base_prefix_size);
array_append(&conn->streams, &input, 1);
- i_stream_skip(conn->base_input, base_prefix_size);
+ conn->base_input_offset += base_prefix_size;
conn->encoded_offset += base_prefix_size;
}
conn->encoded_offset += encoded_size;
@@ -95,11 +97,13 @@
*_conn = NULL;
- if (conn->base_input->v_offset != conn->msg_size) {
- i_assert(conn->base_input->v_offset < conn->msg_size);
+ if (conn->base_input_offset != conn->msg_size) {
+ i_assert(conn->base_input_offset < conn->msg_size);
trailer_size = conn->msg_size - conn->encoded_offset;
- input = i_stream_create_limit(conn->base_input, trailer_size);
+ input = i_stream_create_range(conn->base_input,
+ conn->base_input_offset,
+ trailer_size);
array_append(&conn->streams, &input, 1);
}
array_append_zero(&conn->streams);
More information about the dovecot-cvs
mailing list