]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
bugfixes
authorTimo Sirainen <tss@iki.fi>
Mon, 6 Oct 2003 20:53:39 +0000 (23:53 +0300)
committerTimo Sirainen <tss@iki.fi>
Mon, 6 Oct 2003 20:53:39 +0000 (23:53 +0300)
--HG--
branch : HEAD

src/lib-index/mbox/istream-mbox.c

index a7f76b23b33ab755f58cde715f7ffd1a14604269..0a0fdc17844b01a5dd30c0f19a363d0b3e6c4dbd 100644 (file)
@@ -48,6 +48,8 @@ static ssize_t _read(struct _istream *stream)
 {
        struct mbox_istream *mstream = (struct mbox_istream *) stream;
        ssize_t ret;
+       uoff_t limit, old_limit;
+       off_t vsize_diff;
 
        if (stream->istream.v_offset < mstream->header_size.virtual_size) {
                /* we don't support mixing headers and body.
@@ -55,17 +57,29 @@ static ssize_t _read(struct _istream *stream)
                return -2;
        }
 
-       if (mstream->input->v_offset - mstream->header_size.physical_size !=
-           stream->istream.v_offset - mstream->header_size.virtual_size) {
-               i_stream_seek(mstream->input, stream->istream.v_offset -
-                             mstream->header_size.virtual_size +
-                             mstream->header_size.physical_size);
+       /* may be positive or negative, depending on how much there was CRs
+          and how much headers were hidden */
+       vsize_diff = mstream->header_size.virtual_size -
+               mstream->header_size.physical_size;
+
+       limit = stream->istream.v_limit - vsize_diff;
+       old_limit = mstream->input->v_limit;
+       if (limit != old_limit)
+               i_stream_set_read_limit(mstream->input, limit);
+
+       if (mstream->input->v_offset != stream->istream.v_offset - vsize_diff) {
+               i_stream_seek(mstream->input,
+                             stream->istream.v_offset - vsize_diff);
        }
 
        ret = i_stream_read(mstream->input);
+
        mstream->istream.skip = 0;
        mstream->istream.buffer =
                i_stream_get_data(mstream->input, &mstream->istream.pos);
+
+       if (limit != old_limit)
+               i_stream_set_read_limit(mstream->input, old_limit);
        return ret;
 }
 
@@ -77,11 +91,12 @@ static void _seek(struct _istream *stream, uoff_t v_offset)
        if (v_offset < mstream->header_size.virtual_size) {
                /* still in headers */
                stream->skip = v_offset;
-               stream->pos = mstream->header_size.virtual_size;
+               stream->pos = stream->high_pos =
+                       mstream->header_size.virtual_size;
                stream->buffer = buffer_get_data(mstream->headers, NULL);
        } else {
                /* body - use our real input stream */
-               stream->skip = stream->pos = 0;
+               stream->skip = stream->pos = stream->high_pos = 0;
                stream->buffer = NULL;
 
                v_offset += mstream->header_size.physical_size -