]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
dsync: Skip autocreated mailboxes that haven't been created yet
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 3 Nov 2022 15:40:28 +0000 (17:40 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Tue, 8 Nov 2022 08:57:44 +0000 (08:57 +0000)
src/doveadm/dsync/dsync-mailbox-tree-fill.c

index c523e6bdc52dc5d0a1dfc21b83ee3e79a5894021..17c1eea0e55f907ea272545b35e9b7437109c4c4 100644 (file)
@@ -79,6 +79,7 @@ static int dsync_mailbox_tree_add(struct dsync_mailbox_tree *tree,
 {
        struct dsync_mailbox_node *node;
        struct mailbox *box;
+       enum mailbox_existence existence;
        struct mailbox_metadata metadata;
        struct mailbox_status status;
        const char *errstr;
@@ -94,8 +95,23 @@ static int dsync_mailbox_tree_add(struct dsync_mailbox_tree *tree,
 
        /* get GUID and UIDVALIDITY for selectable mailbox */
        box = mailbox_alloc(info->ns->list, info->vname, MAILBOX_FLAG_READONLY);
-       if (dsync_mailbox_tree_get_selectable(box, &metadata, &status) < 0) {
+       ret = mailbox_exists(box, FALSE, &existence);
+       if (ret == 0 && existence != MAILBOX_EXISTENCE_SELECT) {
+               /* autocreated mailbox doesn't exist yet */
+               mailbox_free(&box);
+               if (existence == MAILBOX_EXISTENCE_NOSELECT) {
+                       return !guid_128_is_empty(box_guid) ? 0 :
+                               dsync_mailbox_tree_add_exists_node(
+                                       tree, info, &node, error_r);
+               } else {
+                       return 0;
+               }
+       }
+       if (ret == 0)
+               ret = dsync_mailbox_tree_get_selectable(box, &metadata, &status);
+       if (ret < 0) {
                errstr = mailbox_get_last_internal_error(box, &error);
+               ret = 0;
                switch (error) {
                case MAIL_ERROR_NOTFOUND:
                        /* mailbox was just deleted? */