From: Timo Sirainen Date: Wed, 29 Oct 2003 14:54:03 +0000 (+0200) Subject: fix X-Git-Tag: 1.1.alpha1~4252 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8cba3d69f0d0a3f03dc3b630e18896aa00ebb6ff;p=thirdparty%2Fdovecot%2Fcore.git fix --HG-- branch : HEAD --- diff --git a/src/lib-index/mbox/istream-mbox.c b/src/lib-index/mbox/istream-mbox.c index a99a03db98..2a7995fac4 100644 --- a/src/lib-index/mbox/istream-mbox.c +++ b/src/lib-index/mbox/istream-mbox.c @@ -48,6 +48,7 @@ static ssize_t _read(struct _istream *stream) { struct mbox_istream *mstream = (struct mbox_istream *) stream; ssize_t ret; + size_t pos; uoff_t limit, old_limit; off_t vsize_diff; @@ -75,12 +76,18 @@ static ssize_t _read(struct _istream *stream) ret = i_stream_read(mstream->input); mstream->istream.skip = 0; - mstream->istream.buffer = - i_stream_get_data(mstream->input, &mstream->istream.pos); + mstream->istream.buffer = i_stream_get_data(mstream->input, &pos); + + if (pos == mstream->istream.pos) + ret = -1; + else { + ret = mstream->istream.pos - pos; + mstream->istream.pos = pos; + } if (limit != old_limit) i_stream_set_read_limit(mstream->input, old_limit); - return mstream->istream.pos == 0 ? -1 : (ssize_t)mstream->istream.pos; + return ret; } static void _seek(struct _istream *stream, uoff_t v_offset) diff --git a/src/lib/istream-file.c b/src/lib/istream-file.c index 4e0ce7d2c1..5c8e6da621 100644 --- a/src/lib/istream-file.c +++ b/src/lib/istream-file.c @@ -161,7 +161,8 @@ static ssize_t _read(struct _istream *stream) ret = pread(stream->fd, stream->w_buffer + stream->pos, size, stream->istream.start_offset + - stream->istream.v_offset); + stream->istream.v_offset + + (stream->pos - stream->skip)); } else { ret = read(stream->fd, stream->w_buffer + stream->pos, size); @@ -209,8 +210,10 @@ static void _skip(struct _istream *stream, uoff_t count) { struct file_istream *fstream = (struct file_istream *) stream; + i_assert(stream->skip == stream->pos); + if (!fstream->file) - fstream->skip_left += count - (stream->pos - stream->skip); + fstream->skip_left += count; stream->istream.v_offset += count; stream->skip = stream->pos = 0; }