From f45038537a7e2f37cdefe19e72b7efeb7fe4b801 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Tue, 23 Aug 2011 21:41:24 +0300 Subject: [PATCH] zlib: Fixed reading concatenated .gz files. --- src/plugins/zlib/istream-zlib.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/plugins/zlib/istream-zlib.c b/src/plugins/zlib/istream-zlib.c index 8c53640829..8d1a73c37f 100644 --- a/src/plugins/zlib/istream-zlib.c +++ b/src/plugins/zlib/istream-zlib.c @@ -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); -- 2.47.3