[dovecot-cvs] dovecot/src/lib-storage/index index-search.c, 1.104, 1.105

cras at dovecot.org cras at dovecot.org
Sat Dec 31 15:43:16 EET 2005


Update of /var/lib/cvs/dovecot/src/lib-storage/index
In directory talvi:/tmp/cvs-serv29539/lib-storage/index

Modified Files:
	index-search.c 
Log Message:
Allow message_body_search() to return "message_part is broken" error. If it
happens, clear cache and try again with parsed message_part.



Index: index-search.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/index-search.c,v
retrieving revision 1.104
retrieving revision 1.105
diff -u -d -r1.104 -r1.105
--- index-search.c	3 Jul 2005 21:09:40 -0000	1.104
+++ index-search.c	31 Dec 2005 13:43:14 -0000	1.105
@@ -438,25 +438,47 @@
 static void search_body(struct mail_search_arg *arg, void *context)
 {
 	struct search_body_context *ctx = context;
-	int ret, unknown_charset;
+        enum message_body_search_error error;
+	int ret, retry = FALSE;
 
 	if (ctx->index_ctx->error != NULL)
 		return;
 
-	if (arg->type == SEARCH_TEXT || arg->type == SEARCH_BODY) {
-		i_stream_seek(ctx->input, 0);
-		ret = message_body_search(arg->value.str,
-					  ctx->index_ctx->charset,
-					  &unknown_charset, ctx->input,
-					  ctx->part, arg->type == SEARCH_TEXT);
+	if (arg->type != SEARCH_TEXT && arg->type != SEARCH_BODY)
+		return;
 
-		if (ret < 0) {
-			ctx->index_ctx->error = unknown_charset ?
-				TXT_UNKNOWN_CHARSET : TXT_INVALID_SEARCH_KEY;
-		}
+__retry:
+	i_stream_seek(ctx->input, 0);
+	ret = message_body_search(arg->value.str, ctx->index_ctx->charset,
+				  ctx->input, ctx->part,
+				  arg->type == SEARCH_TEXT, &error);
 
-		ARG_SET_RESULT(arg, ret > 0);
+	if (ret < 0) {
+		switch (error) {
+		case MESSAGE_BODY_SEARCH_ERROR_UNKNOWN_CHARSET:
+			ctx->index_ctx->error = TXT_UNKNOWN_CHARSET;
+			break;
+		case MESSAGE_BODY_SEARCH_ERROR_INVALID_KEY:
+			ctx->index_ctx->error = TXT_INVALID_SEARCH_KEY;
+			break;
+		case MESSAGE_BODY_SEARCH_ERROR_MESSAGE_PART_BROKEN:
+			if (retry)
+				i_panic("Couldn't fix broken body structure");
+
+			mail_cache_set_corrupted(ctx->index_ctx->ibox->cache,
+				"Broken message structure for mail UID %u",
+				ctx->index_ctx->mail->uid);
+
+			/* get the body parts, and try again */
+			ctx->index_ctx->imail->data.parts = NULL;
+			ctx->part = mail_get_parts(ctx->index_ctx->mail);
+
+			retry = TRUE;
+			goto __retry;
+		}
 	}
+
+	ARG_SET_RESULT(arg, ret > 0);
 }
 
 static int search_arg_match_text(struct mail_search_arg *args,



More information about the dovecot-cvs mailing list