From: Timo Sirainen Date: Sun, 18 Jul 2004 12:31:27 +0000 (+0300) Subject: Don't crash if mail_index_view_sync_next() is called again after it's finished. X-Git-Tag: 1.1.alpha1~3775 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d6f50f100ce17fa4b3a89e9567a5ff993b38b872;p=thirdparty%2Fdovecot%2Fcore.git Don't crash if mail_index_view_sync_next() is called again after it's finished. --HG-- branch : HEAD --- diff --git a/src/lib-index/mail-index-view-sync.c b/src/lib-index/mail-index-view-sync.c index cedb3d9dc8..13b70e1730 100644 --- a/src/lib-index/mail-index-view-sync.c +++ b/src/lib-index/mail-index-view-sync.c @@ -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; } diff --git a/src/lib-index/mail-transaction-log-view.c b/src/lib-index/mail-transaction-log-view.c index b185f36239..7c442ade93 100644 --- a/src/lib-index/mail-transaction-log-view.c +++ b/src/lib-index/mail-transaction-log-view.c @@ -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);