From 42aaebd4b237403aff6bbfafdcdf52cf5f8c1c06 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Wed, 7 Jul 2004 16:36:29 +0300 Subject: [PATCH] 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. --HG-- branch : HEAD --- src/lib-mail/istream-header-filter.c | 25 ++++++++++++++----------- src/lib/istream-limit.c | 13 ++++++++----- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/lib-mail/istream-header-filter.c b/src/lib-mail/istream-header-filter.c index 623ac7a50c..41e23ae939 100644 --- a/src/lib-mail/istream-header-filter.c +++ b/src/lib-mail/istream-header-filter.c @@ -71,19 +71,22 @@ static ssize_t _read(struct _istream *stream) 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; } diff --git a/src/lib/istream-limit.c b/src/lib/istream-limit.c index 14a9bf0074..06f6804057 100644 --- a/src/lib/istream-limit.c +++ b/src/lib/istream-limit.c @@ -58,15 +58,18 @@ static ssize_t _read(struct _istream *stream) 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; -- 2.47.3