File 0007-global-Call-rfc822_parser_deinit-wherever-possible.patch of Package dovecot22.24960

From 0ed696987e5e5d44e971da2a10f6275b276ece34 Mon Sep 17 00:00:00 2001
From: Timo Sirainen <timo.sirainen@dovecot.fi>
Date: Fri, 22 Dec 2017 18:58:11 +0200
Subject: [PATCH 7/7] global: Call rfc822_parser_deinit() wherever possible

---
 src/lib-mail/istream-attachment-extractor.c | 1 +
 src/lib-mail/message-address.c              | 1 +
 src/lib-mail/message-date.c                 | 1 +
 src/lib-mail/message-decoder.c              | 6 +++++-
 src/lib-mail/message-id.c                   | 1 +
 src/lib-mail/message-parser.c               | 5 ++++-
 src/lib-mail/message-part-data.c            | 8 +++++++-
 src/lib-mail/message-search.c               | 1 +
 src/lib-mail/test-rfc2231-parser.c          | 1 +
 src/lib-mail/test-rfc822-parser.c           | 2 ++
 src/plugins/fts/fts-build-mail.c            | 1 +
 src/plugins/fts/fts-parser-script.c         | 5 ++++-
 12 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/src/lib-mail/istream-attachment-extractor.c b/src/lib-mail/istream-attachment-extractor.c
index 68e6deb..28a2d93 100644
--- a/src/lib-mail/istream-attachment-extractor.c
+++ b/src/lib-mail/istream-attachment-extractor.c
@@ -87,6 +87,7 @@ static void parse_content_type(struct attachment_istream *astream,
 		(void)rfc822_parse_content_type(&parser, content_type);
 		astream->part.content_type = i_strdup(str_c(content_type));
 	} T_END;
+	rfc822_parser_deinit(&parser);
 }
 
 static void
diff --git a/src/lib-mail/message-address.c b/src/lib-mail/message-address.c
index afeef88..14cc4b5 100644
--- a/src/lib-mail/message-address.c
+++ b/src/lib-mail/message-address.c
@@ -403,6 +403,7 @@ message_address_parse_real(pool_t pool, const unsigned char *data, size_t size,
 	} else {
 		(void)parse_address_list(&ctx, max_addresses);
 	}
+	rfc822_parser_deinit(&ctx.parser);
 	return ctx.first_addr;
 }
 
diff --git a/src/lib-mail/message-date.c b/src/lib-mail/message-date.c
index b67b21e..9a15011 100644
--- a/src/lib-mail/message-date.c
+++ b/src/lib-mail/message-date.c
@@ -252,6 +252,7 @@ bool message_date_parse(const unsigned char *data, size_t size,
 		ctx.str = t_str_new(128);
 		success = message_date_parser_tokens(&ctx, timestamp_r,
 						     timezone_offset_r);
+		rfc822_parser_deinit(&ctx.parser);
 	} T_END;
 
 	return success;
diff --git a/src/lib-mail/message-decoder.c b/src/lib-mail/message-decoder.c
index e1f329e..4c283b7 100644
--- a/src/lib-mail/message-decoder.c
+++ b/src/lib-mail/message-decoder.c
@@ -117,6 +117,7 @@ enum message_cte message_decoder_parse_cte(struct message_header_line *hdr)
 			message_cte = MESSAGE_CTE_QP;
 		break;
 	}
+	rfc822_parser_deinit(&parser);
 	return message_cte;
 }
 
@@ -137,8 +138,10 @@ parse_content_type(struct message_decoder_context *ctx,
 	str = t_str_new(64);
 	ret = rfc822_parse_content_type(&parser, str);
 	ctx->content_type = i_strdup(str_c(str));
-	if (ret < 0)
+	if (ret < 0) {
+		rfc822_parser_deinit(&parser);
 		return;
+	}
 
 	rfc2231_parse(&parser, &results);
 	for (; *results != NULL; results += 2) {
@@ -147,6 +150,7 @@ parse_content_type(struct message_decoder_context *ctx,
 			break;
 		}
 	}
+	rfc822_parser_deinit(&parser);
 }
 
 static bool message_decode_header(struct message_decoder_context *ctx,
diff --git a/src/lib-mail/message-id.c b/src/lib-mail/message-id.c
index 772535b..68e2be0 100644
--- a/src/lib-mail/message-id.c
+++ b/src/lib-mail/message-id.c
@@ -39,6 +39,7 @@ static bool get_untokenized_msgid(const char **msgid_p, string_t *msgid)
 			success = TRUE;
 		}
 	}
+	rfc822_parser_deinit(&parser);
 	return success;
 }
 
diff --git a/src/lib-mail/message-parser.c b/src/lib-mail/message-parser.c
index b95448a..b1de195 100644
--- a/src/lib-mail/message-parser.c
+++ b/src/lib-mail/message-parser.c
@@ -501,8 +501,10 @@ static void parse_content_type(struct message_parser_ctx *ctx,
 
 	if (ret < 0 ||
 	    (ctx->part->flags & MESSAGE_PART_FLAG_MULTIPART) == 0 ||
-	    ctx->last_boundary != NULL)
+	    ctx->last_boundary != NULL) {
+		rfc822_parser_deinit(&parser);
 		return;
+	}
 
 	rfc2231_parse(&parser, &results);
 	for (; *results != NULL; results += 2) {
@@ -512,6 +514,7 @@ static void parse_content_type(struct message_parser_ctx *ctx,
 			break;
 		}
 	}
+	rfc822_parser_deinit(&parser);
 }
 
 static bool block_is_at_eoh(const struct message_block *block)
diff --git a/src/lib-mail/message-part-data.c b/src/lib-mail/message-part-data.c
index 7f13244..35f35a0 100644
--- a/src/lib-mail/message-part-data.c
+++ b/src/lib-mail/message-part-data.c
@@ -309,6 +309,7 @@ parse_content_type(struct message_part_data *data,
 	parse_mime_parameters(&parser, pool,
 		&data->content_type_params,
 		&data->content_type_params_count);
+	rfc822_parser_deinit(&parser);
 }
 
 static void
@@ -327,6 +328,7 @@ parse_content_transfer_encoding(struct message_part_data *data,
 		data->content_transfer_encoding =
 			p_strdup(pool, str_c(str));
 	}
+	rfc822_parser_deinit(&parser);
 }
 
 static void
@@ -340,13 +342,16 @@ parse_content_disposition(struct message_part_data *data,
 	rfc822_skip_lwsp(&parser);
 
 	str = t_str_new(256);
-	if (rfc822_parse_mime_token(&parser, str) < 0)
+	if (rfc822_parse_mime_token(&parser, str) < 0) {
+		rfc822_parser_deinit(&parser);
 		return;
+	}
 	data->content_disposition = p_strdup(pool, str_c(str));
 
 	parse_mime_parameters(&parser, pool,
 		&data->content_disposition_params,
 		&data->content_disposition_params_count);
+	rfc822_parser_deinit(&parser);
 }
 
 static void
@@ -379,6 +384,7 @@ parse_content_language(struct message_part_data *data,
 		parser.data++;
 		rfc822_skip_lwsp(&parser);
 	}
+	rfc822_parser_deinit(&parser);
 
 	if (array_count(&langs) > 0) {
 		array_append_zero(&langs);
diff --git a/src/lib-mail/message-search.c b/src/lib-mail/message-search.c
index 73509ee..8cd4e1c 100644
--- a/src/lib-mail/message-search.c
+++ b/src/lib-mail/message-search.c
@@ -61,6 +61,7 @@ static void parse_content_type(struct message_search_context *ctx,
 	ctx->content_type_text =
 		strncasecmp(str_c(content_type), "text/", 5) == 0 ||
 		strncasecmp(str_c(content_type), "message/", 8) == 0;
+	rfc822_parser_deinit(&parser);
 }
 
 static void handle_header(struct message_search_context *ctx,
diff --git a/src/lib-mail/test-rfc2231-parser.c b/src/lib-mail/test-rfc2231-parser.c
index 085d126..cc32dec 100644
--- a/src/lib-mail/test-rfc2231-parser.c
+++ b/src/lib-mail/test-rfc2231-parser.c
@@ -36,6 +36,7 @@ static void test_rfc2231_parser(void)
 	test_assert(rfc2231_parse(&parser, &result) == 0);
 	for (i = 0; output[i] != NULL && result[i] != NULL; i++)
 		test_assert(strcmp(output[i], result[i]) == 0);
+	rfc822_parser_deinit(&parser);
 	test_assert(output[i] == NULL && result[i] == NULL);
 	test_end();
 }
diff --git a/src/lib-mail/test-rfc822-parser.c b/src/lib-mail/test-rfc822-parser.c
index 29102fc..a758fa6 100644
--- a/src/lib-mail/test-rfc822-parser.c
+++ b/src/lib-mail/test-rfc822-parser.c
@@ -31,6 +31,7 @@ static void test_rfc822_parse_quoted_string(void)
 		test_assert_idx(rfc822_parse_quoted_string(&parser, str) == tests[i].ret, i);
 		test_assert_idx(tests[i].ret < 0 ||
 				strcmp(tests[i].output, str_c(str)) == 0, i);
+		rfc822_parser_deinit(&parser);
 		str_truncate(str, 0);
 	}
 	test_end();
@@ -60,6 +61,7 @@ static void test_rfc822_parse_content_param(void)
 		test_assert_idx(strcmp(output[i].value, value) == 0, i);
 		i++;
 	}
+	rfc822_parser_deinit(&parser);
 	test_assert(ret == 0);
 	test_assert(i == N_ELEMENTS(output));
 	test_end();
diff --git a/src/plugins/fts/fts-build-mail.c b/src/plugins/fts/fts-build-mail.c
index 3a64032..5c6293e 100644
--- a/src/plugins/fts/fts-build-mail.c
+++ b/src/plugins/fts/fts-build-mail.c
@@ -56,6 +56,7 @@ static void fts_build_parse_content_type(struct fts_mail_build_context *ctx,
 		(void)rfc822_parse_content_type(&parser, content_type);
 		ctx->content_type = str_lcase(i_strdup(str_c(content_type)));
 	} T_END;
+	rfc822_parser_deinit(&parser);
 }
 
 static void
diff --git a/src/plugins/fts/fts-parser-script.c b/src/plugins/fts/fts-parser-script.c
index 5eab69e..422b8dc 100644
--- a/src/plugins/fts/fts-parser-script.c
+++ b/src/plugins/fts/fts-parser-script.c
@@ -173,8 +173,10 @@ static void parse_content_disposition(const char *content_disposition,
 
 	/* type; param; param; .. */
 	str = t_str_new(32);
-	if (rfc822_parse_mime_token(&parser, str) < 0)
+	if (rfc822_parse_mime_token(&parser, str) < 0) {
+		rfc822_parser_deinit(&parser);
 		return;
+	}
 
 	rfc2231_parse(&parser, &results);
 	filename2 = NULL;
@@ -191,6 +193,7 @@ static void parse_content_disposition(const char *content_disposition,
 		   much about the filename actually, just about its extension */
 		*filename_r = filename2;
 	}
+	rfc822_parser_deinit(&parser);
 }
 
 static struct fts_parser *
-- 
2.1.4

openSUSE Build Service is sponsored by