]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imap: imap_search_seqset_iter_next() - Assert-crash if iteration doesn't progress
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 19 May 2020 15:31:31 +0000 (18:31 +0300)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 26 May 2020 16:32:40 +0000 (19:32 +0300)
This can be done easily with seq_range_array_remove_seq_range(). This is
cleaner to use than invert+intersect. I originally didn't notice that
this function existed.

src/imap/imap-search-args.c

index 1ff8b2d32afa2d1aac9850bf346fe046dd788cac..7f6552c32a2d948b2f8caddbbea79c1d66e35a3e 100644 (file)
@@ -310,14 +310,14 @@ void imap_search_seqset_iter_deinit(struct imap_search_seqset_iter **_iter)
 
 bool imap_search_seqset_iter_next(struct imap_search_seqset_iter *iter)
 {
-       if (!array_is_created(&iter->seqset_left))
+       if (!array_is_created(&iter->seqset_left) ||
+           array_count(&iter->seqset_left) == 0)
                return FALSE;
 
        /* remove the last batch of searched mails from seqset_left */
-       seq_range_array_invert(&iter->search_args->args->value.seqset,
-                              1, UINT32_MAX);
-       seq_range_array_intersect(&iter->seqset_left,
-                                 &iter->search_args->args->value.seqset);
+       if (seq_range_array_remove_seq_range(&iter->seqset_left,
+                       &iter->search_args->args->value.seqset) == 0)
+               i_unreached();
        imap_search_seqset_next_batch(iter);
        return array_count(&iter->search_args->args->value.seqset) > 0;
 }