]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Don't crash if mail_index_view_sync_next() is called again after it's finished.
authorTimo Sirainen <tss@iki.fi>
Sun, 18 Jul 2004 12:31:27 +0000 (15:31 +0300)
committerTimo Sirainen <tss@iki.fi>
Sun, 18 Jul 2004 12:31:27 +0000 (15:31 +0300)
--HG--
branch : HEAD

src/lib-index/mail-index-view-sync.c
src/lib-index/mail-transaction-log-view.c

index cedb3d9dc86769e6a05b065e2a369ce894289786..13b70e17306a47082534ff651eb54f65a1b3a6de 100644 (file)
@@ -71,6 +71,10 @@ view_sync_get_expunges(struct mail_index_view *view, buffer_t **expunges_r)
        return ret;
 }
 
+#define MAIL_INDEX_VIEW_VISIBLE_SYNC_MASK \
+       (MAIL_TRANSACTION_EXPUNGE | MAIL_TRANSACTION_APPEND | \
+        MAIL_TRANSACTION_FLAG_UPDATE)
+
 int mail_index_view_sync_begin(struct mail_index_view *view,
                                enum mail_index_sync_type sync_mask,
                               struct mail_index_view_sync_ctx **ctx_r)
@@ -98,10 +102,10 @@ int mail_index_view_sync_begin(struct mail_index_view *view,
 
        /* only flags, appends and expunges can be left to be synced later */
        want_mask = mail_transaction_type_mask_get(sync_mask);
+       i_assert((want_mask & ~MAIL_INDEX_VIEW_VISIBLE_SYNC_MASK) == 0);
        mask = want_mask |
                (MAIL_TRANSACTION_TYPE_MASK ^
-                (MAIL_TRANSACTION_EXPUNGE | MAIL_TRANSACTION_APPEND |
-                 MAIL_TRANSACTION_FLAG_UPDATE));
+                MAIL_INDEX_VIEW_VISIBLE_SYNC_MASK);
 
        if (mail_transaction_log_view_set(view->log_view,
                                          view->log_file_seq,
@@ -177,6 +181,7 @@ static int mail_index_view_sync_next_trans(struct mail_index_view_sync_ctx *ctx,
                if (ret < 0)
                        return -1;
 
+               ctx->hdr = NULL;
                ctx->last_read = TRUE;
                return 1;
        }
index b185f3623979f2fdff0d8654fc35bf74c240d428..7c442ade935427a169991319188a9e62bc058edd 100644 (file)
@@ -235,6 +235,8 @@ static int log_view_get_next(struct mail_transaction_log_view *view,
 
        for (;;) {
                file = view->cur;
+               if (file == NULL)
+                       return 0;
 
                view->prev_file_seq = file->hdr.file_seq;
                view->prev_file_offset = view->cur_offset;
@@ -244,9 +246,6 @@ static int log_view_get_next(struct mail_transaction_log_view *view,
 
                view->cur = file->next;
                view->cur_offset = sizeof(struct mail_transaction_log_header);
-
-               if (view->cur == NULL)
-                       return 0;
        }
 
        data = buffer_get_data(file->buffer, &file_size);