changeset 20648:c097022d5151

fts-squat: fix Corrupted squat uidlist bug
author nikwrt <nikwrt@gmx.de>
date Tue, 29 Mar 2016 22:30:17 +0200
parents 7d7723409083
children 13a6645d1012
files src/plugins/fts-squat/fts-backend-squat.c src/plugins/fts-squat/squat-trie.c src/plugins/fts-squat/squat-trie.h src/plugins/fts-squat/squat-uidlist.c
diffstat 4 files changed, 26 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/src/plugins/fts-squat/fts-backend-squat.c	Mon Aug 15 19:22:31 2016 +0300
+++ b/src/plugins/fts-squat/fts-backend-squat.c	Tue Mar 29 22:30:17 2016 +0200
@@ -96,7 +96,7 @@
 	i_free(backend);
 }
 
-static void
+static int
 fts_backend_squat_set_box(struct squat_fts_backend *backend,
 			  struct mailbox *box)
 {
@@ -105,12 +105,22 @@
 	struct mailbox_status status;
 	const char *path;
 	enum squat_index_flags flags = 0;
+        int ret;
 
 	if (backend->box == box)
-		return;
+        {
+		if (backend->refresh) {
+                        ret = squat_trie_refresh(backend->trie);
+                        if (ret < 0)
+				return ret;
+			backend->refresh = FALSE;
+		}
+		return 0;
+	}
 	fts_backend_squat_unset_box(backend);
+	backend->refresh = FALSE;
 	if (box == NULL)
-		return;
+		return 0;
 
 	perm = mailbox_get_permissions(box);
 	storage = mailbox_get_storage(box);
@@ -137,6 +147,7 @@
 	if (backend->full_len != 0)
 		squat_trie_set_full_len(backend->trie, backend->full_len);
 	backend->box = box;
+	return squat_trie_open(backend->trie);
 }
 
 static int
@@ -146,7 +157,9 @@
 	struct squat_fts_backend *backend =
 		(struct squat_fts_backend *)_backend;
 
-	fts_backend_squat_set_box(backend, box);
+	int ret = fts_backend_squat_set_box(backend, box);
+	if (ret < 0)
+		return -1;
 	return squat_trie_get_last_uid(backend->trie, last_uid_r);
 }
 
@@ -254,9 +267,9 @@
 
 	if (fts_backend_squat_build_deinit(ctx) < 0)
 		ctx->failed = TRUE;
-	fts_backend_squat_set_box(backend, box);
-
-	if (box != NULL) {
+	if (fts_backend_squat_set_box(backend, box) < 0)
+		ctx->failed = TRUE;
+	else if (box != NULL) {
 		if (squat_trie_build_init(backend->trie, &ctx->build_ctx) < 0)
 			ctx->failed = TRUE;
 	}
@@ -439,12 +452,9 @@
 	bool first = TRUE;
 	int ret;
 
-	fts_backend_squat_set_box(backend, box);
-	if (backend->refresh) {
-		if (squat_trie_refresh(backend->trie) < 0)
-			return -1;
-		backend->refresh = FALSE;
-	}
+	ret = fts_backend_squat_set_box(backend, box);
+	if (ret < 0)
+		return -1;
 
 	for (; args != NULL; args = args->next) {
 		ret = squat_lookup_arg(backend, args, first ? FALSE : and_args,
--- a/src/plugins/fts-squat/squat-trie.c	Mon Aug 15 19:22:31 2016 +0300
+++ b/src/plugins/fts-squat/squat-trie.c	Tue Mar 29 22:30:17 2016 +0200
@@ -235,7 +235,7 @@
 	return 0;
 }
 
-static int squat_trie_open(struct squat_trie *trie)
+int squat_trie_open(struct squat_trie *trie)
 {
 	squat_trie_close(trie);
 
--- a/src/plugins/fts-squat/squat-trie.h	Mon Aug 15 19:22:31 2016 +0300
+++ b/src/plugins/fts-squat/squat-trie.h	Tue Mar 29 22:30:17 2016 +0200
@@ -26,6 +26,7 @@
 void squat_trie_set_partial_len(struct squat_trie *trie, unsigned int len);
 void squat_trie_set_full_len(struct squat_trie *trie, unsigned int len);
 
+int squat_trie_open(struct squat_trie *trie);
 int squat_trie_refresh(struct squat_trie *trie);
 
 int squat_trie_build_init(struct squat_trie *trie,
--- a/src/plugins/fts-squat/squat-uidlist.c	Mon Aug 15 19:22:31 2016 +0300
+++ b/src/plugins/fts-squat/squat-uidlist.c	Tue Mar 29 22:30:17 2016 +0200
@@ -371,7 +371,7 @@
 	}
 	if (uidlist->hdr.indexid != uidlist->trie->hdr.indexid) {
 		/* see if trie was recreated */
-		(void)squat_trie_refresh(uidlist->trie);
+		(void)squat_trie_open(uidlist->trie);
 	}
 	if (uidlist->hdr.indexid != uidlist->trie->hdr.indexid) {
 		squat_uidlist_set_corrupted(uidlist, "wrong indexid");