diff src/lib-storage/index/index-search.c @ 3795:e6c42de08336 HEAD

Allow message_body_search() to return "message_part is broken" error. If it happens, clear cache and try again with parsed message_part.
author Timo Sirainen <tss@iki.fi>
date Sat, 31 Dec 2005 15:43:13 +0200
parents b75125eced7f
children 55df57c028d4
line wrap: on
line diff
--- a/src/lib-storage/index/index-search.c	Sat Dec 31 15:14:38 2005 +0200
+++ b/src/lib-storage/index/index-search.c	Sat Dec 31 15:43:13 2005 +0200
@@ -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;
+
+__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);
 
-		if (ret < 0) {
-			ctx->index_ctx->error = unknown_charset ?
-				TXT_UNKNOWN_CHARSET : TXT_INVALID_SEARCH_KEY;
+	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);
-	}
+	ARG_SET_RESULT(arg, ret > 0);
 }
 
 static int search_arg_match_text(struct mail_search_arg *args,