From: Stephan Bosch Date: Thu, 13 Feb 2025 01:19:36 +0000 (+0100) Subject: quota: quota-util - Add quota_used_apply_expunged() X-Git-Tag: 2.4.1~137 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fc9aee40d189cb7f1b541257f12c709e5f5d9f54;p=thirdparty%2Fdovecot%2Fcore.git quota: quota-util - Add quota_used_apply_expunged() --- diff --git a/src/plugins/quota/quota-private.h b/src/plugins/quota/quota-private.h index ec53087a08..f532e83340 100644 --- a/src/plugins/quota/quota-private.h +++ b/src/plugins/quota/quota-private.h @@ -167,6 +167,7 @@ bool quota_warning_match(const struct quota_root_settings *w, int quota_get_mail_size(struct quota_transaction_context *ctx, struct mail *mail, uoff_t *size_r); +void quota_used_apply_expunged(int64_t *used, uint64_t expunged); bool quota_transaction_is_over(struct quota_transaction_context *ctx, uoff_t size); bool quota_root_is_over(struct quota_transaction_context *ctx, struct quota_transaction_root_context *root, diff --git a/src/plugins/quota/quota-util.c b/src/plugins/quota/quota-util.c index 64c8e9eb58..4435f9417f 100644 --- a/src/plugins/quota/quota-util.c +++ b/src/plugins/quota/quota-util.c @@ -119,6 +119,29 @@ quota_is_over(uoff_t alloc, int64_t used, uint64_t ceil, uint64_t over, return FALSE; } +void quota_used_apply_expunged(int64_t *used, uint64_t expunged) +{ + int64_t exp_signed; + int64_t exp_overflow; + + if (expunged < (uint64_t)INT64_MAX) { + exp_overflow = 0; + exp_signed = (int64_t)expunged; + } else { + exp_overflow = (int64_t)(expunged - INT64_MAX); + exp_signed = INT64_MAX; + } + + if (INT64_MIN + exp_signed > *used) + *used = INT64_MIN; + else + *used -= exp_signed; + if (INT64_MIN + (int64_t)exp_overflow > *used) + *used = INT64_MIN; + else + *used -= exp_overflow; +} + bool quota_transaction_is_over(struct quota_transaction_context *ctx, uoff_t size) {