changeset 2331:e5748645a9d6 HEAD

Don't crash if mail_index_view_sync_next() is called again after it's finished.
author Timo Sirainen <tss@iki.fi>
date Sun, 18 Jul 2004 15:31:27 +0300
parents f6c6ad1a55f9
children 7e02790ded71
files src/lib-index/mail-index-view-sync.c src/lib-index/mail-transaction-log-view.c
diffstat 2 files changed, 9 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-index/mail-index-view-sync.c	Sun Jul 18 05:31:13 2004 +0300
+++ b/src/lib-index/mail-index-view-sync.c	Sun Jul 18 15:31:27 2004 +0300
@@ -71,6 +71,10 @@
 	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 @@
 
 	/* 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 @@
 		if (ret < 0)
 			return -1;
 
+		ctx->hdr = NULL;
 		ctx->last_read = TRUE;
 		return 1;
 	}
--- a/src/lib-index/mail-transaction-log-view.c	Sun Jul 18 05:31:13 2004 +0300
+++ b/src/lib-index/mail-transaction-log-view.c	Sun Jul 18 15:31:27 2004 +0300
@@ -235,6 +235,8 @@
 
 	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 @@
 
 		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);