changeset 17605:dffc6dd2be0d

lib: istream-tee wasn't returning data correctly always. This fixes an assert-crash in istream-tee.c. (Hopefully it was always assert-crashing instead of returning corrupted data.)
author Timo Sirainen <tss@iki.fi>
date Fri, 04 Jul 2014 15:33:12 +0300
parents 189f97de7ffa
children f1d29866e147
files src/lib/istream-tee.c
diffstat 1 files changed, 5 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib/istream-tee.c	Fri Jul 04 14:48:44 2014 +0300
+++ b/src/lib/istream-tee.c	Fri Jul 04 15:33:12 2014 +0300
@@ -35,6 +35,7 @@
 		old_used = tstream->istream.pos - tstream->istream.skip;
 
 		tstream->istream.buffer = data;
+		i_assert(tstream->istream.istream.v_offset >= tee->input->v_offset);
 		tstream->istream.skip = tstream->istream.istream.v_offset -
 			tee->input->v_offset;
 		i_assert(tstream->istream.skip + old_used <= size);
@@ -155,14 +156,17 @@
 	} else {
 		/* there's still some data available from parent */
 		i_assert(last_high_offset < input->v_offset + size);
+		tee_streams_update_buffer(tstream->tee);
 		i_assert(stream->pos < size);
-		stream->buffer = data;
 	}
 
 	i_assert(stream->buffer == data);
 	ret = size - stream->pos;
 	i_assert(ret > 0);
 	stream->pos = size;
+
+	i_assert(stream->istream.v_offset + (stream->pos - stream->skip) ==
+		 input->v_offset + size);
 	return ret;
 }