From: Aki Tuomi Date: Thu, 30 Jun 2016 06:06:33 +0000 (+0300) Subject: dcrypt: Fix bugs in 0 and 1 byte payload files X-Git-Tag: 2.3.0.rc1~3370 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7a71f2326280fb300f7c45d1ba5b30af3db37f2c;p=thirdparty%2Fdovecot%2Fcore.git dcrypt: Fix bugs in 0 and 1 byte payload files --- diff --git a/src/lib-dcrypt/istream-decrypt.c b/src/lib-dcrypt/istream-decrypt.c index 4ca35880b2..ae39d0d5ab 100644 --- a/src/lib-dcrypt/istream-decrypt.c +++ b/src/lib-dcrypt/istream-decrypt.c @@ -60,7 +60,7 @@ ssize_t i_stream_decrypt_read_header_v1(struct decrypt_istream *stream, const unsigned char *digest_pos = NULL, *key_digest_pos = NULL, *key_ct_pos = NULL; - size_t pos = 7; + size_t pos = 9; size_t digest_len = 0; size_t key_ct_len = 0; size_t key_digest_size = 0; @@ -585,7 +585,8 @@ ssize_t i_stream_decrypt_read_header(struct decrypt_istream *stream, uint32_t hdr_len; if (!get_msb32(&data, end, &hdr_len)) return 0; - if ((size_t)(end-data) < hdr_len) + /* do not forget stream format */ + if ((size_t)(end-data)+1 < hdr_len) return 0; int ret; @@ -669,6 +670,13 @@ i_stream_decrypt_read(struct istream_private *stream) if (ret == -1 && (size == 0 || stream->parent->stream_errno != 0)) { stream->istream.stream_errno = stream->parent->stream_errno; + + /* file was empty */ + if (!dstream->initialized && size == 0 && stream->parent->eof) { + stream->istream.eof = TRUE; + return -1; + } + if (stream->istream.stream_errno != 0) return -1; diff --git a/src/lib-dcrypt/ostream-encrypt.c b/src/lib-dcrypt/ostream-encrypt.c index 0569253a0c..d5c20a728d 100644 --- a/src/lib-dcrypt/ostream-encrypt.c +++ b/src/lib-dcrypt/ostream-encrypt.c @@ -496,6 +496,9 @@ int o_stream_encrypt_flush(struct ostream_private *stream) const char *error; struct encrypt_ostream *estream = (struct encrypt_ostream *)stream; + /* if nothing was written, we are done */ + if (!estream->prefix_written) return o_stream_flush(stream->parent); + i_assert(!estream->finalized); estream->finalized = TRUE;