]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
zlib: Fixed reading concatenated .gz files.
authorTimo Sirainen <tss@iki.fi>
Tue, 23 Aug 2011 18:41:24 +0000 (21:41 +0300)
committerTimo Sirainen <tss@iki.fi>
Tue, 23 Aug 2011 18:41:24 +0000 (21:41 +0300)
src/plugins/zlib/istream-zlib.c

index 8c53640829ac67dca040d3dfc26a809df4d600c8..8d1a73c37f352a5eefac75c449fa1a1ab1f96a55 100644 (file)
@@ -38,6 +38,8 @@ struct zlib_istream {
        unsigned int zs_closed:1;
 };
 
+static void i_stream_zlib_init(struct zlib_istream *zstream);
+
 static void i_stream_zlib_close(struct iostream_private *stream)
 {
        struct zlib_istream *zstream = (struct zlib_istream *)stream;
@@ -157,6 +159,7 @@ static int i_stream_zlib_read_trailer(struct zlib_istream *zstream)
                return -1;
        }
        i_stream_skip(stream->parent, GZ_TRAILER_SIZE);
+       zstream->prev_size = 0;
        zstream->trailer_read = TRUE;
        return 1;
 }
@@ -180,12 +183,21 @@ static ssize_t i_stream_zlib_read(struct istream_private *stream)
                        if (ret <= 0)
                                return ret;
                }
-               stream->istream.eof = TRUE;
-               return -1;
+               if (!zstream->gz || i_stream_is_eof(stream->parent)) {
+                       stream->istream.eof = TRUE;
+                       return -1;
+               }
+               /* gzip file with concatenated content */
+               zstream->eof_offset = (uoff_t)-1;
+               zstream->header_read = FALSE;
+               zstream->trailer_read = FALSE;
+               zstream->crc32 = 0;
+
+               (void)inflateEnd(&zstream->zs);
+               i_stream_zlib_init(zstream);
        }
 
        if (!zstream->header_read) {
-               i_assert(zstream->high_pos == 0);
                do {
                        ret = i_stream_zlib_read_header(stream);
                } while (ret == 0 && stream->istream.blocking);