]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
acl: Prevent crashes with acl_ignore_namespace
authorMarkus Valentin <markus.valentin@open-xchange.com>
Fri, 30 Apr 2021 09:34:51 +0000 (11:34 +0200)
committermarkus.valentin <markus.valentin@open-xchange.com>
Wed, 12 May 2021 11:37:53 +0000 (11:37 +0000)
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
src/plugins/acl/acl-mailbox.c
src/plugins/acl/acl-plugin.h

index 4158b6c5a350a8637829afbbddf8d9fd470213ea..579f43bf2f892c20bf7227e111ab6a54a71cd9f4 100644 (file)
@@ -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);
        }
 }
index b682ddcd86d638484f560b7842d838ecf6445aba..57ff423483a854ad403cba3646eb41e245d107c8 100644 (file)
@@ -611,7 +611,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;
index 96ed1e924d75a65031ccd611b9aaa56a3495d376..6acfe897acd75756365707704222f7e93c0d8b64 100644 (file)
@@ -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 {