fix bug in imapserver with matching if a uid is in a uidset

for a uid set, the syntax <num>:* must be interpreted as <num>:<maxuid>. a
wrong check turned the uid set into <maxuid>:<maxuid>. that check was meant for
the case where <num> is higher than <maxuid>, in which case num must be
replaced with maxuid.

this affected "uid expunge" with a uid set, possibly causing messages marked
for deletion not to be actually removed, and this affected "search" with the
uid parameter, possibly not returning all messages that were searched for.

found while writing tests for upcoming condstore/qresync extensions.
This commit is contained in:
Mechiel Lukkien 2023-06-29 21:37:17 +02:00
parent 590ed0b81d
commit 1e049a087d
No known key found for this signature in database
2 changed files with 4 additions and 1 deletions

View file

@ -63,7 +63,7 @@ func (ss numSet) containsUID(uid store.UID, uids []store.UID, searchResult []sto
last = store.UID(r.last.number)
if r.last.star {
last = uids[len(uids)-1]
if last > first {
if first > last {
first = last
}
} else if r.first.star && last < first {

View file

@ -48,6 +48,9 @@ func TestNumSetContains(t *testing.T) {
check(!ss2.containsUID(2, []store.UID{4, 5}, nil))
check(!ss2.containsUID(2, []store.UID{1}, nil))
check(ss2.containsUID(2, []store.UID{2, 6}, nil))
check(ss2.containsUID(6, []store.UID{2, 6}, nil))
// *:2
ss3 := numSet{false, []numRange{{*star, num(2)}}}
check(ss3.containsSeq(1, []store.UID{2}, nil))