]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
dcrypt: Fix bugs in 0 and 1 byte payload files
authorAki Tuomi <aki.tuomi@dovecot.fi>
Thu, 30 Jun 2016 06:06:33 +0000 (09:06 +0300)
committerAki Tuomi <aki.tuomi@dovecot.fi>
Thu, 30 Jun 2016 06:34:18 +0000 (09:34 +0300)
src/lib-dcrypt/istream-decrypt.c
src/lib-dcrypt/ostream-encrypt.c

index 4ca35880b222738369d00a4b318da776bbb14a57..ae39d0d5ab01b98e59993f2990fa3297562e5def 100644 (file)
@@ -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;
 
index 0569253a0ca8a948f7bdf41e1c149ba664526787..d5c20a728df3a92218356600e9256405af01683c 100644 (file)
@@ -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;