From dc8ecd38a7e54b8bb80ae97712a0d8ad4edcbed3 Mon Sep 17 00:00:00 2001 From: Markus Valentin Date: Fri, 30 Apr 2021 11:34:51 +0200 Subject: [PATCH] acl: Prevent crashes with acl_ignore_namespace In case a namespace was ignored for ACLs an crash could occur because of "Module context acl_storage_module missing". This panic is prevented by this change. --- src/plugins/acl/acl-mailbox-list.c | 7 ++++++- src/plugins/acl/acl-mailbox.c | 2 +- src/plugins/acl/acl-plugin.h | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/plugins/acl/acl-mailbox-list.c b/src/plugins/acl/acl-mailbox-list.c index 4158b6c5a3..579f43bf2f 100644 --- a/src/plugins/acl/acl-mailbox-list.c +++ b/src/plugins/acl/acl-mailbox-list.c @@ -64,6 +64,9 @@ int acl_mailbox_list_have_right(struct mailbox_list *list, const char *name, struct acl_object *aclobj; int ret, ret2; + if (alist->ignore_acls) + return 1; + aclobj = !parent ? acl_object_init_from_name(backend, name) : acl_object_init_from_parent(backend, name); @@ -555,6 +558,8 @@ static void acl_mailbox_list_init_default(struct mailbox_list *list) v->iter_init = acl_mailbox_list_iter_init; v->iter_next = acl_mailbox_list_iter_next; v->iter_deinit = acl_mailbox_list_iter_deinit; + if (acl_namespace_is_ignored(list)) + alist->ignore_acls = TRUE; MODULE_CONTEXT_SET(list, acl_mailbox_list_module, alist); } @@ -605,7 +610,7 @@ void acl_mailbox_list_created(struct mailbox_list *list) /* this namespace is empty. don't attempt to lookup ACLs, because they're not going to work anyway and we could crash doing it. */ - } else if (!acl_namespace_is_ignored(list)) { + } else { acl_mailbox_list_init_default(list); } } diff --git a/src/plugins/acl/acl-mailbox.c b/src/plugins/acl/acl-mailbox.c index 877dba85f5..e0fe9a6051 100644 --- a/src/plugins/acl/acl-mailbox.c +++ b/src/plugins/acl/acl-mailbox.c @@ -617,7 +617,7 @@ void acl_mailbox_allocated(struct mailbox *box) return; } - if (mail_namespace_is_shared_user_root(box->list->ns)) { + if (mail_namespace_is_shared_user_root(box->list->ns) || alist->ignore_acls) { /* this is the root shared namespace, which itself doesn't have any existing mailboxes. */ ignore_acls = TRUE; diff --git a/src/plugins/acl/acl-plugin.h b/src/plugins/acl/acl-plugin.h index 96ed1e924d..6acfe897ac 100644 --- a/src/plugins/acl/acl-plugin.h +++ b/src/plugins/acl/acl-plugin.h @@ -39,6 +39,7 @@ struct acl_mailbox_list { struct acl_storage_rights_context rights; time_t last_shared_add_check; + bool ignore_acls; }; struct acl_mailbox { -- 2.47.3