Mercurial > dovecot > original-hg > dovecot-1.2
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;