Mercurial > dovecot > core-2.2
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");