From: Timo Sirainen Date: Wed, 7 Jul 2004 13:36:29 +0000 (+0300) Subject: Wrapper streams shouldn't try to read data if it's already buffered in main X-Git-Tag: 1.1.alpha1~3811 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=42aaebd4b237403aff6bbfafdcdf52cf5f8c1c06;p=thirdparty%2Fdovecot%2Fcore.git 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 --- 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;