]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
virtual: Skip nonexistent mailboxes also in race conditions
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 19 Dec 2025 11:28:05 +0000 (13:28 +0200)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 19 Dec 2025 11:28:05 +0000 (13:28 +0200)
If mailbox is deleted between mailbox listing and when it's opened, it
shows up as nonexistent. It should be ignored rather than failing.

src/plugins/virtual/virtual-config.c

index c1e03d6d62cddc2cca9c832d4d37f833eb32f6d2..f448c81d7d7307cb9111e06607441b281788418a 100644 (file)
@@ -343,17 +343,22 @@ static int virtual_config_box_metadata_match(struct mailbox *box,
 {
        struct imap_metadata_transaction *imtrans;
        struct mail_attribute_value value;
+       enum mail_error mail_error = MAIL_ERROR_NONE;
        int ret;
 
        imtrans = imap_metadata_transaction_begin(box);
        ret = imap_metadata_get(imtrans, bbox->metadata_entry, &value);
        if (ret < 0)
-               *error_r = t_strdup(imap_metadata_transaction_get_last_error(imtrans, NULL));
+               *error_r = t_strdup(imap_metadata_transaction_get_last_error(imtrans, &mail_error));
        if (ret > 0)
                ret = wildcard_match(value.value, bbox->metadata_value) ? 1 : 0;
        if (ret >= 0 && bbox->negative_match)
                ret = ret > 0 ? 0 : 1;
        (void)imap_metadata_transaction_commit(&imtrans, NULL, NULL);
+       if (ret < 0 && mail_error == MAIL_ERROR_NOTFOUND) {
+               /* Ignore nonexistent / \NoSelect mailboxes */
+               ret = 0;
+       }
        return ret;
 }