changeset 12562:f3d42a99ce44

quota: Quota warnings could have been executed at incorrect times with some configs. If target mailbox had quota ignored, the warning was sent if the mail would have otherwise exceeded the warning threshold. Same when using multiple quota roots where all of the roots weren't used for the target mailbox.
author Timo Sirainen <tss@iki.fi>
date Mon, 13 Dec 2010 13:27:18 +0000
parents e030df616faf
children cde0d403c6ff
files src/plugins/quota/quota.c
diffstat 1 files changed, 9 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/plugins/quota/quota.c	Thu Dec 09 20:49:53 2010 +0000
+++ b/src/plugins/quota/quota.c	Mon Dec 13 13:27:18 2010 +0000
@@ -1092,9 +1092,12 @@
 	if (ctx->failed)
 		ret = -1;
 	else if (ctx->bytes_used != 0 || ctx->count_used != 0 ||
-		 ctx->recalculate) {
+		 ctx->recalculate) T_BEGIN {
+		ARRAY_DEFINE(warn_roots, struct quota_root *);
+
 		mailbox_name = mailbox_get_vname(ctx->box);
 		roots = array_get(&ctx->quota->roots, &count);
+		t_array_init(&warn_roots, count);
 		for (i = 0; i < count; i++) {
 			if (!quota_root_is_visible(roots[i], ctx->box, FALSE))
 				continue;
@@ -1108,13 +1111,15 @@
 
 			if (roots[i]->backend.v.update(roots[i], ctx) < 0)
 				ret = -1;
+			else
+				array_append(&warn_roots, &roots[i], 1);
 		}
 		/* execute quota warnings after all updates. this makes it
 		   work correctly regardless of whether backend.get_resource()
 		   returns updated values before backend.update() or not */
-		for (i = 0; i < count; i++)
-			quota_warnings_execute(ctx, roots[i]);
-	}
+		array_foreach(&warn_roots, roots)
+			quota_warnings_execute(ctx, *roots);
+	} T_END;
 
 	i_free(ctx);
 	return ret;