# HG changeset patch # User Timo Sirainen # Date 1292246838 0 # Node ID f3d42a99ce446deb9efec7714ff9035fb70900c6 # Parent e030df616faf216f4ea91ebb2ef88455467f1445 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. diff -r e030df616faf -r f3d42a99ce44 src/plugins/quota/quota.c --- 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;