]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Check that UID is set before caching
authorAki Tuomi <aki.tuomi@dovecot.fi>
Tue, 6 Sep 2016 06:24:06 +0000 (09:24 +0300)
committerGitLab <gitlab@git.dovecot.net>
Wed, 7 Sep 2016 09:08:37 +0000 (12:08 +0300)
src/lib-storage/index/index-mail-binary.c

index 9056cd28c6ca0475fe4eb8b40fee2c3731581d13..670a7fe0be534fcd14846a0e706118888dd7f985 100644 (file)
@@ -367,6 +367,7 @@ index_mail_read_binary_to_cache(struct mail *_mail,
        struct index_mail *mail = (struct index_mail *)_mail;
        struct mail_binary_cache *cache = &_mail->box->storage->binary_cache;
        struct binary_ctx ctx;
+       struct istream *is;
 
        memset(&ctx, 0, sizeof(ctx));
        ctx.mail = _mail;
@@ -381,26 +382,18 @@ index_mail_read_binary_to_cache(struct mail *_mail,
                return -1;
        }
 
-       cache->to = timeout_add(MAIL_BINARY_CACHE_EXPIRE_MSECS,
-                               mail_storage_free_binary_cache,
-                               _mail->box->storage);
-       cache->box = _mail->box;
-       cache->uid = _mail->uid;
-       cache->orig_physical_pos = part->physical_pos;
-       cache->include_hdr = include_hdr;
-
        if (array_count(&ctx.blocks) != 0) {
-               cache->input = i_streams_merge(blocks_get_streams(&ctx),
+               is = i_streams_merge(blocks_get_streams(&ctx),
                                               IO_BLOCK_SIZE,
                                               fd_callback, _mail);
        } else {
-               cache->input = i_stream_create_from_data("", 0);
+               is = i_stream_create_from_data("", 0);
        }
-       i_stream_set_name(cache->input, t_strdup_printf(
+       i_stream_set_name(is, t_strdup_printf(
                "<binary stream of mailbox %s UID %u>",
                _mail->box->vname, _mail->uid));
-       if (blocks_count_lines(&ctx, cache->input) < 0) {
-               if (cache->input->stream_errno == EINVAL) {
+       if (blocks_count_lines(&ctx, is) < 0) {
+               if (is->stream_errno == EINVAL) {
                        /* MIME part contains invalid data */
                        mail_storage_set_error(_mail->box->storage,
                                               MAIL_ERROR_INVALIDDATA,
@@ -408,21 +401,34 @@ index_mail_read_binary_to_cache(struct mail *_mail,
                } else {
                        mail_storage_set_critical(_mail->box->storage,
                                "read(%s) failed: %s",
-                               i_stream_get_name(cache->input),
-                               i_stream_get_error(cache->input));
+                               i_stream_get_name(is),
+                               i_stream_get_error(is));
                }
-               mail_storage_free_binary_cache(_mail->box->storage);
+               i_stream_unref(&is);
                binary_streams_free(&ctx);
                return -1;
        }
-       i_assert(!i_stream_have_bytes_left(cache->input));
-       cache->size = cache->input->v_offset;
-       i_stream_seek(cache->input, 0);
+
+       if (_mail->uid > 0) {
+               cache->to = timeout_add(MAIL_BINARY_CACHE_EXPIRE_MSECS,
+                                       mail_storage_free_binary_cache,
+                                       _mail->box->storage);
+               cache->box = _mail->box;
+               cache->uid = _mail->uid;
+               cache->orig_physical_pos = part->physical_pos;
+               cache->include_hdr = include_hdr;
+               cache->input = is;
+       }
+
+       i_assert(!i_stream_have_bytes_left(is));
+       cache->size = is->v_offset;
+       i_stream_seek(is, 0);
 
        if (part->parent == NULL && include_hdr &&
            mail->data.bin_parts == NULL) {
                binary_parts_update(&ctx, part, &mail->data.bin_parts);
-               binary_parts_cache(&ctx);
+               if (_mail->uid > 0)
+                       binary_parts_cache(&ctx);
        }
        binary_streams_free(&ctx);