]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
istream: Changed default destroy() implementation not to do parent stream seeking.
authorTimo Sirainen <tss@iki.fi>
Wed, 24 Jun 2009 02:01:17 +0000 (22:01 -0400)
committerTimo Sirainen <tss@iki.fi>
Wed, 24 Jun 2009 02:01:17 +0000 (22:01 -0400)
The stream's v_offset may be completely different from what parent uses.

--HG--
branch : HEAD

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

index 0f288c4bef3eff165c83d6bbe97c84b5356364bb..d4f5f4dd69e5f8f950f5aa046795125c42dc4c24 100644 (file)
@@ -9,6 +9,21 @@ struct limit_istream {
        uoff_t v_size;
 };
 
+static void i_stream_limit_destroy(struct iostream_private *stream)
+{
+       struct limit_istream *lstream = (struct limit_istream *) stream;
+       uoff_t v_offset;
+
+       v_offset = lstream->istream.parent_start_offset +
+               lstream->istream.istream.v_offset;
+       if (lstream->istream.parent->seekable ||
+           v_offset > lstream->istream.parent->v_offset) {
+               /* get to same position in parent stream */
+               i_stream_seek(lstream->istream.parent, v_offset);
+       }
+       i_stream_unref(&lstream->istream.parent);
+}
+
 static ssize_t i_stream_limit_read(struct istream_private *stream)
 {
        struct limit_istream *lstream = (struct limit_istream *) stream;
@@ -116,6 +131,7 @@ struct istream *i_stream_create_limit(struct istream *input, uoff_t v_size)
        lstream->v_size = v_size;
        lstream->istream.max_buffer_size = input->real_stream->max_buffer_size;
 
+       lstream->istream.iostream.destroy = i_stream_limit_destroy;
        lstream->istream.parent = input;
        lstream->istream.read = i_stream_limit_read;
        lstream->istream.seek = i_stream_limit_seek;
index c6e7979b823fcaa38530b06979c7cfb84a97250d..1637c642d1702c62daf87febdeaa2581df617dfb 100644 (file)
@@ -481,19 +481,10 @@ i_stream_default_set_max_buffer_size(struct iostream_private *stream,
 static void i_stream_default_destroy(struct iostream_private *stream)
 {
        struct istream_private *_stream = (struct istream_private *)stream;
-               uoff_t v_offset;
 
        i_free(_stream->w_buffer);
-       if (_stream->parent != NULL) {
-               v_offset = _stream->parent_start_offset +
-                       _stream->istream.v_offset;
-               if (_stream->parent->seekable ||
-                   v_offset > _stream->parent->v_offset) {
-                       /* get to same position in parent stream */
-                       i_stream_seek(_stream->parent, v_offset);
-               }
+       if (_stream->parent != NULL)
                i_stream_unref(&_stream->parent);
-       }
 }
 
 static void