changeset 2295:545c1d3ead54 HEAD

Wrapper streams shouldn't try to read data if it's already buffered in main stream. Fixes at least problem with APPEND when the whole message came in one TCP packet.
author Timo Sirainen <tss@iki.fi>
date Wed, 07 Jul 2004 16:36:29 +0300
parents dde57895a5be
children e504e7d19bf7
files src/lib-mail/istream-header-filter.c src/lib/istream-limit.c
diffstat 2 files changed, 22 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-mail/istream-header-filter.c	Wed Jul 07 12:34:03 2004 +0300
+++ b/src/lib-mail/istream-header-filter.c	Wed Jul 07 16:36:29 2004 +0300
@@ -71,19 +71,22 @@
 			      mstream->header_size.physical_size);
 	}
 
-	ret = i_stream_read(mstream->input);
-
-	mstream->istream.pos -= mstream->istream.skip;
-	mstream->istream.skip = 0;
-
-	mstream->istream.buffer = i_stream_get_data(mstream->input, &pos);
-	if (pos <= mstream->istream.pos) {
-		i_assert(ret <= 0);
-	} else {
-		ret = pos - mstream->istream.pos;
-                mstream->istream.pos = pos;
+	stream->buffer = i_stream_get_data(mstream->input, &pos);
+	if (pos <= stream->pos) {
+		if (i_stream_read(mstream->input) == -2) {
+			if (stream->skip == 0)
+				return -2;
+		}
+		stream->istream.disconnected = mstream->input->disconnected;
+		stream->buffer = i_stream_get_data(mstream->input, &pos);
 	}
 
+	stream->pos -= mstream->istream.skip;
+	stream->skip = 0;
+
+	ret = pos <= stream->pos ? -1 :
+		(ssize_t) (pos - stream->pos);
+	stream->pos = pos;
 	return ret;
 }
 
--- a/src/lib/istream-limit.c	Wed Jul 07 12:34:03 2004 +0300
+++ b/src/lib/istream-limit.c	Wed Jul 07 16:36:29 2004 +0300
@@ -58,15 +58,18 @@
 			      stream->istream.v_offset);
 	}
 
-	if (i_stream_read(lstream->input) == -2 && stream->buffer != NULL) {
-		if (stream->skip == 0)
-			return -2;
+	stream->buffer = i_stream_get_data(lstream->input, &pos);
+	if (pos <= stream->pos) {
+		if (i_stream_read(lstream->input) == -2) {
+			if (stream->skip == 0)
+				return -2;
+		}
+		stream->istream.disconnected = lstream->input->disconnected;
+		stream->buffer = i_stream_get_data(lstream->input, &pos);
 	}
-	stream->istream.disconnected = lstream->input->disconnected;
 
 	stream->pos -= stream->skip;
 	stream->skip = 0;
-	stream->buffer = i_stream_get_data(lstream->input, &pos);
 
 	if (lstream->v_size != (uoff_t)-1) {
 		left = lstream->v_size - stream->istream.v_offset;