Mercurial > dovecot > original-hg > dovecot-1.2
changeset 7377:f435be3e3def HEAD
If the SEARCH TEXT/BODY command contained more parameters, we could have
returned too many/little replies.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 08 Mar 2008 04:04:20 +0200 |
parents | 1307a1702e5e |
children | 1570eb502366 |
files | src/plugins/fts/fts-storage.c |
diffstat | 1 files changed, 16 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/src/plugins/fts/fts-storage.c Sat Mar 08 04:03:45 2008 +0200 +++ b/src/plugins/fts/fts-storage.c Sat Mar 08 04:04:20 2008 +0200 @@ -423,18 +423,19 @@ if (!fctx->seqs_set) return fbox->module_ctx.super.search_next_update_seq(ctx); + wanted_seq = ctx->seq + 1; /* fts_search_lookup() was called successfully */ - do { + for (;;) { def_range = array_get_modifiable(&fctx->definite_seqs, &def_count); maybe_range = array_get_modifiable(&fctx->maybe_seqs, &maybe_count); /* if we're ahead of current positions, skip them */ while (fctx->definite_idx < def_count && - ctx->seq > def_range[fctx->definite_idx].seq2) + wanted_seq > def_range[fctx->definite_idx].seq2) fctx->definite_idx++; while (fctx->maybe_idx < maybe_count && - ctx->seq > maybe_range[fctx->maybe_idx].seq2) + wanted_seq > maybe_range[fctx->maybe_idx].seq2) fctx->maybe_idx++; /* use whichever is lower of definite/maybe */ @@ -457,20 +458,25 @@ range = def_range + fctx->definite_idx; i_assert(range->seq1 <= range->seq2); - if (ctx->seq > range->seq1) { + if (wanted_seq > range->seq1) { /* current sequence is already larger than where range begins, so use the current sequence. */ - range->seq1 = ctx->seq+1; + range->seq1 = wanted_seq+1; } else { - ctx->seq = range->seq1 - 1; - if (++range->seq1 > range->seq2) - range->seq2 = 0; + wanted_seq = range->seq1; + range->seq1++; } + if (range->seq1 > range->seq2) + range->seq2 = 0; /* ctx->seq points to previous sequence we want */ - wanted_seq = ctx->seq + 1; + ctx->seq = wanted_seq - 1; ret = fbox->module_ctx.super.search_next_update_seq(ctx); - } while (ret > 0 && wanted_seq != ctx->seq); + if (ret <= 0 || wanted_seq == ctx->seq) + break; + wanted_seq = ctx->seq; + mail_search_args_reset(ctx->args, FALSE); + } if (!use_maybe) { /* we have definite results, update args */