]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
virtual: Clamp backend uids to available uids in virtual_get_virtual_uids
authorAki Tuomi <aki.tuomi@dovecot.fi>
Mon, 25 Jun 2018 10:13:43 +0000 (13:13 +0300)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Mon, 25 Jun 2018 10:54:54 +0000 (10:54 +0000)
src/plugins/virtual/virtual-storage.c

index 7ba737f3458850ac3b3738a31079e98aea571f37..9169dbfbf8ea554e67a68ca447f6ab2f80a1c02b 100644 (file)
@@ -738,6 +738,16 @@ static void virtual_notify_changes(struct mailbox *box)
        }
 }
 
+static void
+virtual_uidmap_to_uid_array(struct virtual_backend_box *bbox,
+                           ARRAY_TYPE(seq_range) *uids_r)
+{
+       const struct virtual_backend_uidmap *uid;
+       array_foreach(&bbox->uids, uid) {
+               seq_range_array_add(uids_r, uid->real_uid);
+       }
+}
+
 static void
 virtual_get_virtual_uids(struct mailbox *box,
                         struct mailbox *backend_mailbox,
@@ -747,6 +757,7 @@ virtual_get_virtual_uids(struct mailbox *box,
        struct virtual_mailbox *mbox = (struct virtual_mailbox *)box;
        struct virtual_backend_box *bbox;
        const struct virtual_backend_uidmap *uids;
+       ARRAY_TYPE(seq_range) uid_range;
        struct seq_range_iter iter;
        unsigned int n, i, count;
        uint32_t uid;
@@ -762,7 +773,12 @@ virtual_get_virtual_uids(struct mailbox *box,
                return;
 
        uids = array_get(&bbox->uids, &count); i = 0;
-       seq_range_array_iter_init(&iter, backend_uids); n = 0;
+
+       t_array_init(&uid_range, 8);
+       virtual_uidmap_to_uid_array(bbox, &uid_range);
+       seq_range_array_intersect(&uid_range, backend_uids);
+
+       seq_range_array_iter_init(&iter, &uid_range); n = 0;
        while (seq_range_array_iter_nth(&iter, n++, &uid)) {
                while (i < count && uids[i].real_uid < uid) i++;
                if (i < count && uids[i].real_uid == uid) {