From: Timo Sirainen Date: Fri, 27 Oct 2017 23:09:58 +0000 (+0300) Subject: lib-compression: ostream-zlib - Require o_stream_finish() to write the trailer X-Git-Tag: 2.3.0.rc1~704 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6fb8641aa5619d0c0dcd7be7570767f9688a953d;p=thirdparty%2Fdovecot%2Fcore.git lib-compression: ostream-zlib - Require o_stream_finish() to write the trailer It's now possible to call o_stream_flush() without the trailer getting written. It's also now required to call o_stream_finish() to write the trailer before closing the ostream. This guarantees that the caller checks that the trailer was successfully written. This isn't needed if the ostream already failed before writing the trailer. --- diff --git a/src/lib-compression/ostream-zlib.c b/src/lib-compression/ostream-zlib.c index 2851762de6..b2b3bde338 100644 --- a/src/lib-compression/ostream-zlib.c +++ b/src/lib-compression/ostream-zlib.c @@ -32,7 +32,8 @@ static void o_stream_zlib_close(struct iostream_private *stream, { struct zlib_ostream *zstream = (struct zlib_ostream *)stream; - (void)o_stream_flush(&zstream->ostream.ostream); + i_assert(zstream->ostream.finished || + zstream->ostream.ostream.stream_errno != 0); (void)deflateEnd(&zstream->zs); if (close_parent) o_stream_close(zstream->ostream.parent); @@ -230,7 +231,7 @@ static int o_stream_zlib_flush(struct ostream_private *stream) struct zlib_ostream *zstream = (struct zlib_ostream *)stream; int ret; - if (o_stream_zlib_send_flush(zstream, TRUE) < 0) + if (o_stream_zlib_send_flush(zstream, stream->finished) < 0) return -1; ret = o_stream_flush(stream->parent); diff --git a/src/lib-compression/test-compression.c b/src/lib-compression/test-compression.c index ff1658c7bf..5dbe6db94f 100644 --- a/src/lib-compression/test-compression.c +++ b/src/lib-compression/test-compression.c @@ -62,6 +62,7 @@ static void test_compression_handler(const struct compression_handler *handler) test_assert(o_stream_send(output, buf, sizeof(buf)) == sizeof(buf)); } + test_assert(o_stream_finish(output) > 0); o_stream_destroy(&output); o_stream_destroy(&file_output); sha1_result(&sha1, output_sha1);