From ef25ce69cee80a955491f637ec8e5e8c0d6cb997 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan@rename-it.nl>
Date: Tue, 19 Apr 2016 00:27:09 +0200
Subject: [PATCH] imapsieve plugin: Do not initialize mailbox rules until they
 are needed.

Otherwise, these would be re-parsed every time a new mail_user is created (e.g. when opening a mail as raw).
---
 src/plugins/imapsieve/imap-sieve-storage.c | 24 ++++++++++++++--------
 1 file changed, 15 insertions(+), 9 deletions(-)

diff --git a/src/plugins/imapsieve/imap-sieve-storage.c b/src/plugins/imapsieve/imap-sieve-storage.c
index b616d8d93..3d74cbf89 100644
--- a/src/plugins/imapsieve/imap-sieve-storage.c
+++ b/src/plugins/imapsieve/imap-sieve-storage.c
@@ -814,10 +814,18 @@ static void
 imap_sieve_mailbox_rules_init(struct mail_user *user)
 {
 	struct imap_sieve_user *isuser = IMAP_SIEVE_USER_CONTEXT(user);
-	string_t *identifier = t_str_new(256);
+	string_t *identifier;
 	unsigned int i = 0;
 	size_t prefix_len;
 
+	if (hash_table_is_created(isuser->mbox_rules))
+		return;
+
+	hash_table_create(&isuser->mbox_rules, default_pool, 0,
+		imap_sieve_mailbox_rule_hash, imap_sieve_mailbox_rule_cmp);
+	i_array_init(&isuser->mbox_patterns, 8);
+
+	identifier = t_str_new(256);
 	str_append(identifier, "imapsieve_mailbox");
 	prefix_len = str_len(identifier);
 
@@ -1026,6 +1034,8 @@ imap_sieve_mailbox_rules_get(struct mail_user *user,
 {
 	const char *dst_name, *src_name;
 
+	imap_sieve_mailbox_rules_init(user);
+
 	imap_sieve_mailbox_rules_match_patterns
 		(user, dst_box, src_box, cause, rules);
 
@@ -1056,8 +1066,10 @@ static void imap_sieve_user_deinit(struct mail_user *user)
 	if (isuser->isieve != NULL)
 		imap_sieve_deinit(&isuser->isieve);
 
-	hash_table_destroy(&isuser->mbox_rules);
-	array_free(&isuser->mbox_patterns);
+	if (hash_table_is_created(isuser->mbox_rules))
+		hash_table_destroy(&isuser->mbox_rules);
+	if (array_is_created(&isuser->mbox_patterns))
+		array_free(&isuser->mbox_patterns);
 
 	isuser->module_ctx.super.deinit(user);
 }
@@ -1072,12 +1084,6 @@ static void imap_sieve_user_created(struct mail_user *user)
 	user->vlast = &isuser->module_ctx.super;
 	v->deinit = imap_sieve_user_deinit;
 	MODULE_CONTEXT_SET(user, imap_sieve_user_module, isuser);
-
-	hash_table_create(&isuser->mbox_rules, default_pool, 0,
-		imap_sieve_mailbox_rule_hash, imap_sieve_mailbox_rule_cmp);
-	i_array_init(&isuser->mbox_patterns, 8);
-
-	imap_sieve_mailbox_rules_init(user);
 }
 
 /*
-- 
GitLab