]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
fixes
authorTimo Sirainen <tss@iki.fi>
Mon, 10 Nov 2003 21:36:13 +0000 (23:36 +0200)
committerTimo Sirainen <tss@iki.fi>
Mon, 10 Nov 2003 21:36:13 +0000 (23:36 +0200)
--HG--
branch : HEAD

src/lib/istream-limit.c
src/lib/istream.c

index dd4bc752268d983606ef1b391960b1430a91c772..27046bd8b082a2413dd9ed9332b91fd435988084 100644 (file)
@@ -47,17 +47,19 @@ static ssize_t _read(struct _istream *stream)
        ssize_t ret;
        size_t pos;
 
-       if (stream->istream.v_offset >= lstream->v_size)
+       if (stream->istream.v_offset +
+           (stream->pos - stream->skip) >= lstream->v_size)
                return -1;
 
        if (lstream->input->v_offset !=
            lstream->v_start_offset + stream->istream.v_offset) {
                i_stream_seek(lstream->input,
-                             lstream->v_start_offset + stream->istream.v_offset);
+                             lstream->v_start_offset +
+                             stream->istream.v_offset);
        }
 
        if (i_stream_read(lstream->input) == -2 && stream->buffer != NULL) {
-               if (lstream->istream.skip == 0)
+               if (stream->skip == 0)
                        return -2;
                stream->istream.eof = lstream->input->eof;
        }
@@ -70,9 +72,9 @@ static ssize_t _read(struct _istream *stream)
        if (pos > left)
                pos = left;
 
-       ret = pos <= lstream->istream.pos ? -1 :
+       ret = pos <= stream->pos ? -1 :
                (ssize_t) (pos - stream->pos);
-       lstream->istream.pos = pos;
+       stream->pos = pos;
        return ret;
 }
 
index ecaabbea58fdade43e9d5052d5a5c3d228ba4b08..c9a1e98d97bfc20a652ab5fc503109425f8d23fd 100644 (file)
@@ -78,11 +78,15 @@ void i_stream_seek(struct istream *stream, uoff_t v_offset)
 {
        struct _istream *_stream = stream->real_stream;
 
+       if (v_offset > stream->v_offset) {
+               i_stream_skip(stream, v_offset - stream->v_offset);
+               return;
+       }
+
        if (stream->closed)
                return;
 
-       if (v_offset < stream->v_offset)
-               stream->eof = FALSE;
+       stream->eof = FALSE;
        _stream->seek(_stream, v_offset);
 }