From: Timo Sirainen Date: Thu, 4 Apr 2013 18:18:28 +0000 (+0300) Subject: istream-chain: Fixed handling small streams that get merged into same buffer. X-Git-Tag: 2.2.rc4~13 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d730192e34fbedbc590a5abc7351e5af5e120c5f;p=thirdparty%2Fdovecot%2Fcore.git istream-chain: Fixed handling small streams that get merged into same buffer. --- diff --git a/src/lib/istream-chain.c b/src/lib/istream-chain.c index c89c1255be..3e0fe98af0 100644 --- a/src/lib/istream-chain.c +++ b/src/lib/istream-chain.c @@ -118,21 +118,24 @@ static void i_stream_chain_read_next(struct chain_istream *cstream) if (link != NULL && link->stream != NULL) i_stream_seek(link->stream, 0); - /* we already verified that the data size is less than the - maximum buffer size */ - cstream->istream.pos = 0; - if (data_size > 0) { - if (!i_stream_try_alloc(&cstream->istream, data_size, &size)) - i_unreached(); - i_assert(size >= data_size); + if (cstream->istream.buffer == cstream->istream.w_buffer) { + /* we've already buffered the prev_input */ + } else { + /* we already verified that the data size is less than the + maximum buffer size */ + cstream->istream.pos = 0; + if (data_size > 0) { + if (!i_stream_try_alloc(&cstream->istream, data_size, &size)) + i_unreached(); + i_assert(size >= data_size); + } + memcpy(cstream->istream.w_buffer, data, data_size); + cstream->istream.skip = 0; + cstream->istream.pos = data_size; + cstream->prev_stream_left = data_size; } - - memcpy(cstream->istream.w_buffer, data, data_size); i_stream_skip(prev_input, data_size); i_stream_unref(&prev_input); - cstream->istream.skip = 0; - cstream->istream.pos = data_size; - cstream->prev_stream_left = data_size; } static ssize_t i_stream_chain_read(struct istream_private *stream)