From 3c18b2025ef12296a280a34bde63652cf8333a1a Mon Sep 17 00:00:00 2001 From: Aki Tuomi Date: Sun, 14 Jan 2018 20:40:11 +0200 Subject: [PATCH] quota: Contexts are now required or checked Satisfied static analyzers --- src/plugins/quota/quota-storage.c | 45 ++++++++++++++++++------------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/src/plugins/quota/quota-storage.c b/src/plugins/quota/quota-storage.c index e229169be8..09b428cb0a 100644 --- a/src/plugins/quota/quota-storage.c +++ b/src/plugins/quota/quota-storage.c @@ -15,8 +15,10 @@ #define QUOTA_CONTEXT(obj) \ MODULE_CONTEXT(obj, quota_storage_module) +#define QUOTA_CONTEXT_REQUIRE(obj) \ + MODULE_CONTEXT_REQUIRE(obj, quota_storage_module) #define QUOTA_MAIL_CONTEXT(obj) \ - MODULE_CONTEXT(obj, quota_mail_module) + MODULE_CONTEXT_REQUIRE(obj, quota_mail_module) #define QUOTA_LIST_CONTEXT(obj) \ MODULE_CONTEXT(obj, quota_mailbox_list_module) @@ -73,10 +75,10 @@ static void quota_set_storage_error(struct quota_transaction_context *qt, static void quota_mail_expunge(struct mail *_mail) { struct mail_private *mail = (struct mail_private *)_mail; - struct quota_mailbox *qbox = QUOTA_CONTEXT(_mail->box); + struct quota_mailbox *qbox = QUOTA_CONTEXT_REQUIRE(_mail->box); struct quota_user *quser = QUOTA_USER_CONTEXT(_mail->box->storage->user); union mail_module_context *qmail = QUOTA_MAIL_CONTEXT(mail); - struct quota_transaction_context *qt = QUOTA_CONTEXT(_mail->transaction); + struct quota_transaction_context *qt = QUOTA_CONTEXT_REQUIRE(_mail->transaction); uoff_t size; int ret; @@ -117,7 +119,7 @@ static int quota_get_status(struct mailbox *box, enum mailbox_status_items items, struct mailbox_status *status_r) { - struct quota_mailbox *qbox = QUOTA_CONTEXT(box); + struct quota_mailbox *qbox = QUOTA_CONTEXT_REQUIRE(box); struct quota_transaction_context *qt; int ret = 0; @@ -148,7 +150,7 @@ quota_mailbox_transaction_begin(struct mailbox *box, enum mailbox_transaction_flags flags, const char *reason) { - struct quota_mailbox *qbox = QUOTA_CONTEXT(box); + struct quota_mailbox *qbox = QUOTA_CONTEXT_REQUIRE(box); struct mailbox_transaction_context *t; struct quota_transaction_context *qt; @@ -164,8 +166,8 @@ static int quota_mailbox_transaction_commit(struct mailbox_transaction_context *ctx, struct mail_transaction_commit_changes *changes_r) { - struct quota_mailbox *qbox = QUOTA_CONTEXT(ctx->box); - struct quota_transaction_context *qt = QUOTA_CONTEXT(ctx); + struct quota_mailbox *qbox = QUOTA_CONTEXT_REQUIRE(ctx->box); + struct quota_transaction_context *qt = QUOTA_CONTEXT_REQUIRE(ctx); i_assert(qt->tmp_mail == NULL); @@ -181,8 +183,8 @@ quota_mailbox_transaction_commit(struct mailbox_transaction_context *ctx, static void quota_mailbox_transaction_rollback(struct mailbox_transaction_context *ctx) { - struct quota_mailbox *qbox = QUOTA_CONTEXT(ctx->box); - struct quota_transaction_context *qt = QUOTA_CONTEXT(ctx); + struct quota_mailbox *qbox = QUOTA_CONTEXT_REQUIRE(ctx->box); + struct quota_transaction_context *qt = QUOTA_CONTEXT_REQUIRE(ctx); i_assert(qt->tmp_mail == NULL); @@ -216,6 +218,7 @@ quota_move_requires_check(struct mailbox *dest_box, struct mailbox *src_box) struct quota_user *quser = QUOTA_USER_CONTEXT(src_ns->user); struct quota_root *const *rootp; + i_assert(quser != NULL); array_foreach(&quser->quota->roots, rootp) { bool have_src_quota, have_dest_quota; @@ -240,7 +243,7 @@ quota_move_requires_check(struct mailbox *dest_box, struct mailbox *src_box) static int quota_check(struct mail_save_context *ctx, struct mailbox *src_box) { struct mailbox_transaction_context *t = ctx->transaction; - struct quota_transaction_context *qt = QUOTA_CONTEXT(t); + struct quota_transaction_context *qt = QUOTA_CONTEXT_REQUIRE(t); enum quota_alloc_result ret; i_assert(!ctx->moving || src_box != NULL); @@ -277,8 +280,8 @@ static int quota_copy(struct mail_save_context *ctx, struct mail *mail) { struct mailbox_transaction_context *t = ctx->transaction; - struct quota_transaction_context *qt = QUOTA_CONTEXT(t); - struct quota_mailbox *qbox = QUOTA_CONTEXT(t->box); + struct quota_transaction_context *qt = QUOTA_CONTEXT_REQUIRE(t); + struct quota_mailbox *qbox = QUOTA_CONTEXT_REQUIRE(t->box); /* we always want to know the mail size */ mail_add_temp_wanted_fields(ctx->dest_mail, MAIL_FETCH_PHYSICAL_SIZE, NULL); @@ -306,8 +309,8 @@ static int quota_save_begin(struct mail_save_context *ctx, struct istream *input) { struct mailbox_transaction_context *t = ctx->transaction; - struct quota_transaction_context *qt = QUOTA_CONTEXT(t); - struct quota_mailbox *qbox = QUOTA_CONTEXT(t->box); + struct quota_transaction_context *qt = QUOTA_CONTEXT_REQUIRE(t); + struct quota_mailbox *qbox = QUOTA_CONTEXT_REQUIRE(t->box); const char *error; uoff_t size; @@ -357,7 +360,7 @@ quota_save_begin(struct mail_save_context *ctx, struct istream *input) static int quota_save_finish(struct mail_save_context *ctx) { - struct quota_mailbox *qbox = QUOTA_CONTEXT(ctx->transaction->box); + struct quota_mailbox *qbox = QUOTA_CONTEXT_REQUIRE(ctx->transaction->box); struct mailbox *src_box; if (qbox->module_ctx.super.save_finish(ctx) < 0) @@ -392,7 +395,7 @@ static void quota_mailbox_sync_commit(struct quota_mailbox *qbox) static void quota_mailbox_sync_notify(struct mailbox *box, uint32_t uid, enum mailbox_sync_type sync_type) { - struct quota_mailbox *qbox = QUOTA_CONTEXT(box); + struct quota_mailbox *qbox = QUOTA_CONTEXT_REQUIRE(box); struct index_mailbox_context *ibox = INDEX_STORAGE_CONTEXT(box); struct quota_user *quser = QUOTA_USER_CONTEXT(box->storage->user); const uint32_t *uids; @@ -400,6 +403,7 @@ static void quota_mailbox_sync_notify(struct mailbox *box, uint32_t uid, unsigned int i, count; uoff_t size; + i_assert(quser != NULL); if (qbox->module_ctx.super.sync_notify != NULL) qbox->module_ctx.super.sync_notify(box, uid, sync_type); @@ -498,7 +502,7 @@ static void quota_mailbox_sync_notify(struct mailbox *box, uint32_t uid, static int quota_mailbox_sync_deinit(struct mailbox_sync_context *ctx, struct mailbox_sync_status *status_r) { - struct quota_mailbox *qbox = QUOTA_CONTEXT(ctx->box); + struct quota_mailbox *qbox = QUOTA_CONTEXT_REQUIRE(ctx->box); int ret; ret = qbox->module_ctx.super.sync_deinit(ctx, status_r); @@ -523,9 +527,10 @@ static void quota_roots_flush(struct quota *quota) static void quota_mailbox_close(struct mailbox *box) { - struct quota_mailbox *qbox = QUOTA_CONTEXT(box); + struct quota_mailbox *qbox = QUOTA_CONTEXT_REQUIRE(box); struct quota_user *quser = QUOTA_USER_CONTEXT(box->storage->user); + i_assert(quser != NULL); /* sync_notify() may be called outside sync_begin()..sync_deinit(). make sure we apply changes at close time at latest. */ quota_mailbox_sync_commit(qbox); @@ -542,7 +547,7 @@ static void quota_mailbox_close(struct mailbox *box) static void quota_mailbox_free(struct mailbox *box) { - struct quota_mailbox *qbox = QUOTA_CONTEXT(box); + struct quota_mailbox *qbox = QUOTA_CONTEXT_REQUIRE(box); if (array_is_created(&qbox->expunge_uids)) { array_free(&qbox->expunge_uids); @@ -587,6 +592,7 @@ static void quota_mailbox_list_deinit(struct mailbox_list *list) { struct quota_mailbox_list *qlist = QUOTA_LIST_CONTEXT(list); + i_assert(qlist != NULL); quota_remove_user_namespace(list->ns); qlist->module_ctx.super.deinit(list); } @@ -601,6 +607,7 @@ struct quota *quota_get_mail_user_quota(struct mail_user *user) static void quota_user_deinit(struct mail_user *user) { struct quota_user *quser = QUOTA_USER_CONTEXT(user); + i_assert(quser != NULL); struct quota_settings *quota_set = quser->quota->set; quota_deinit(&quser->quota);