From: Aki Tuomi Date: Mon, 6 Jul 2020 16:55:10 +0000 (+0300) Subject: lib-compression: istream-xz - Fix header reading X-Git-Tag: 2.3.13~447 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ba73b7f0ea5b9ef8ed95027192d8fa487705fa42;p=thirdparty%2Fdovecot%2Fcore.git lib-compression: istream-xz - Fix header reading If file was smaller than xz magic size, we would get EPIPE instead of EINVAL. --- diff --git a/src/lib-compression/istream-lzma.c b/src/lib-compression/istream-lzma.c index faee8a8217..63509556eb 100644 --- a/src/lib-compression/istream-lzma.c +++ b/src/lib-compression/istream-lzma.c @@ -19,6 +19,7 @@ struct lzma_istream { uoff_t eof_offset; struct stat last_parent_statbuf; + bool hdr_read:1; bool log_errors:1; bool marked:1; bool strm_closed:1; @@ -119,7 +120,8 @@ static ssize_t i_stream_lzma_read(struct istream_private *stream) ret = lzma_code(&zstream->strm, LZMA_FINISH); if (ret != LZMA_STREAM_END) if (lzma_handle_error(zstream, ret) == 0) - stream->istream.stream_errno = EPIPE; + stream->istream.stream_errno = + zstream->hdr_read ? EPIPE : EINVAL; stream->istream.eof = TRUE; } return -1; @@ -135,6 +137,8 @@ static ssize_t i_stream_lzma_read(struct istream_private *stream) zstream->strm.next_out = stream->w_buffer + stream->pos; zstream->strm.avail_out = out_size; + if (!zstream->hdr_read && size > LZMA_STREAM_HEADER_SIZE) + zstream->hdr_read = TRUE; ret = lzma_code(&zstream->strm, LZMA_RUN); out_size -= zstream->strm.avail_out;