]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Wrapper streams shouldn't try to read data if it's already buffered in main
authorTimo Sirainen <tss@iki.fi>
Wed, 7 Jul 2004 13:36:29 +0000 (16:36 +0300)
committerTimo Sirainen <tss@iki.fi>
Wed, 7 Jul 2004 13:36:29 +0000 (16:36 +0300)
stream. Fixes at least problem with APPEND when the whole message came in
one TCP packet.

--HG--
branch : HEAD

src/lib-mail/istream-header-filter.c
src/lib/istream-limit.c

index 623ac7a50cc515719aa407b7d08c9541442838e3..41e23ae939c121aa2d4565dc4f6d9d310a42e4e0 100644 (file)
@@ -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;
 }
 
index 14a9bf007484c72cc3c127408521d333b8ab4e49..06f680405786fda3fe827b12d70cf5eb4c4e1104 100644 (file)
@@ -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;