]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
fts-squat: fix Corrupted squat uidlist bug
authornikwrt <nikwrt@gmx.de>
Tue, 29 Mar 2016 20:30:17 +0000 (22:30 +0200)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 16 Aug 2016 07:46:52 +0000 (10:46 +0300)
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

index 30781429be10598f896f3e180bbf213b1fe57494..a3e4c27f344d7adba9943bb99d70749cc18eb62c 100644 (file)
@@ -96,7 +96,7 @@ static void fts_backend_squat_deinit(struct fts_backend *_backend)
        i_free(backend);
 }
 
-static void
+static int
 fts_backend_squat_set_box(struct squat_fts_backend *backend,
                          struct mailbox *box)
 {
@@ -105,12 +105,22 @@ fts_backend_squat_set_box(struct squat_fts_backend *backend,
        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 @@ fts_backend_squat_set_box(struct squat_fts_backend *backend,
        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 @@ fts_backend_squat_get_last_uid(struct fts_backend *_backend,
        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 @@ fts_backend_squat_update_set_mailbox(struct fts_backend_update_context *_ctx,
 
        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 @@ fts_backend_squat_lookup(struct fts_backend *_backend, struct mailbox *box,
        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,
index 91111aa4f83649c5f76b5efbacd1e1c889822ebf..1763fdc652bd74e059f91bee230d4a7e76f6183d 100644 (file)
@@ -235,7 +235,7 @@ static int squat_trie_open_fd(struct squat_trie *trie)
        return 0;
 }
 
-static int squat_trie_open(struct squat_trie *trie)
+int squat_trie_open(struct squat_trie *trie)
 {
        squat_trie_close(trie);
 
index ab7e761a549d343af6e093351e93951c8288a16a..91530b86591aaac7acd5e7b80ab34f29f8109843 100644 (file)
@@ -26,6 +26,7 @@ void squat_trie_deinit(struct squat_trie **trie);
 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,
index 3037c789e8296969f98386dd042695d8febe28d9..923835ee8d21c515b051c60112685f7e1ffbfb11 100644 (file)
@@ -372,7 +372,7 @@ static int squat_uidlist_map_header(struct squat_uidlist *uidlist)
        }
        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");