dovecot-1.2: threading left search parameters broken when return...

dovecot at dovecot.org dovecot at dovecot.org
Thu Jun 12 02:54:46 EEST 2008


details:   http://hg.dovecot.org/dovecot-1.2/rev/c6a49099a4fc
changeset: 7833:c6a49099a4fc
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Jun 12 02:54:39 2008 +0300
description:
threading left search parameters broken when returning.

diffstat:

1 file changed, 15 insertions(+), 14 deletions(-)
src/lib-storage/index/index-thread.c |   29 +++++++++++++++--------------

diffs (96 lines):

diff -r e1c13a782399 -r c6a49099a4fc src/lib-storage/index/index-thread.c
--- a/src/lib-storage/index/index-thread.c	Thu Jun 12 02:24:03 2008 +0300
+++ b/src/lib-storage/index/index-thread.c	Thu Jun 12 02:54:39 2008 +0300
@@ -26,6 +26,7 @@ struct mail_thread_context {
 	struct mailbox_transaction_context *t;
 
 	struct mail_search_context *search;
+	struct mail_search_args *search_args;
 	struct mail_search_arg tmp_search_arg;
 };
 
@@ -178,9 +179,9 @@ static bool
 static bool
 mail_thread_try_use_hash(struct mail_thread_context *ctx,
 			 struct mail_hash *hash,
-			 const struct mailbox_status *status, bool reset,
-			 struct mail_search_args *search_args)
-{
+			 const struct mailbox_status *status, bool reset)
+{
+	struct mail_search_args *search_args = ctx->search_args;
 	struct mail_search_arg *limit_arg = NULL;
 	const struct mail_hash_header *hdr;
 	struct mail_hash_transaction *hash_trans;
@@ -309,8 +310,7 @@ again:
 }
 
 static void
-mail_thread_update_init(struct mail_thread_context *ctx,
-			struct mail_search_args *search_args, bool reset)
+mail_thread_update_init(struct mail_thread_context *ctx, bool reset)
 {
 	struct mail_thread_mailbox *tbox = MAIL_THREAD_CONTEXT(ctx->box);
 	struct mail_hash *hash = NULL;
@@ -319,8 +319,7 @@ mail_thread_update_init(struct mail_thre
 	unsigned int count;
 
 	mailbox_get_status(ctx->box, STATUS_MESSAGES | STATUS_UIDNEXT, &status);
-	if (mail_thread_try_use_hash(ctx, tbox->hash, &status,
-				     reset, search_args))
+	if (mail_thread_try_use_hash(ctx, tbox->hash, &status, reset))
 		hash = tbox->hash;
 	else {
 		/* fallback to using in-memory hash */
@@ -343,7 +342,7 @@ mail_thread_update_init(struct mail_thre
 
 	/* initialize searching */
 	ctx->t = mailbox_transaction_begin(ctx->box, 0);
-	ctx->search = mailbox_search_init(ctx->t, search_args, NULL);
+	ctx->search = mailbox_search_init(ctx->t, ctx->search_args, NULL);
 	ctx->thread_ctx.tmp_mail = mail_alloc(ctx->t, 0, NULL);
 
 	hdr = mail_hash_get_header(ctx->thread_ctx.hash_trans);
@@ -357,10 +356,8 @@ mail_thread_update_init(struct mail_thre
 		     I_MAX(hdr->record_count, status.messages));
 }
 
-
 static int
-mail_thread_update(struct mail_thread_context *ctx,
-		   struct mail_search_args *search_args, bool reset)
+mail_thread_update(struct mail_thread_context *ctx, bool reset)
 {
 	static const char *wanted_headers[] = {
 		HDR_MESSAGE_ID, HDR_IN_REPLY_TO, HDR_REFERENCES, HDR_SUBJECT,
@@ -374,7 +371,7 @@ mail_thread_update(struct mail_thread_co
 	uint32_t prev_uid;
 	int ret = 0;
 
-	mail_thread_update_init(ctx, search_args, reset);
+	mail_thread_update_init(ctx, reset);
 	box = mailbox_transaction_get_mailbox(ctx->t);
 
 	hdr = mail_hash_get_header(ctx->thread_ctx.hash_trans);
@@ -419,8 +416,9 @@ int mail_thread_init(struct mailbox *box
 	ctx = i_new(struct mail_thread_context, 1);
 	tbox->ctx = &ctx->thread_ctx;
 	ctx->box = box;
-
-	while ((ret = mail_thread_update(ctx, args, reset)) < 0) {
+	ctx->search_args = args;
+
+	while ((ret = mail_thread_update(ctx, reset)) < 0) {
 		if (ctx->thread_ctx.hash == tbox->hash) {
 			/* failed with in-memory hash */
 			mail_thread_deinit(&ctx);
@@ -454,6 +452,9 @@ void mail_thread_deinit(struct mail_thre
 	int ret;
 
 	*_ctx = NULL;
+
+	if (ctx->search_args->args == &ctx->tmp_search_arg)
+		ctx->search_args->args = ctx->tmp_search_arg.next;
 
 	mail_hash_transaction_end(&ctx->thread_ctx.hash_trans);
 


More information about the dovecot-cvs mailing list