Skip to content

Commit c1c8ede

Browse files
committed
imapmemserver: fix dynamic NumSet handling in nested search criteria
1 parent 5a52b99 commit c1c8ede

File tree

1 file changed

+19
-6
lines changed

1 file changed

+19
-6
lines changed

imapserver/imapmemserver/mailbox.go

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -312,12 +312,7 @@ func (mbox *MailboxView) Search(numKind imapserver.NumKind, criteria *imap.Searc
312312
mbox.mutex.Lock()
313313
defer mbox.mutex.Unlock()
314314

315-
for _, seqSet := range criteria.SeqNum {
316-
mbox.staticNumSet(seqSet)
317-
}
318-
for _, uidSet := range criteria.UID {
319-
mbox.staticNumSet(uidSet)
320-
}
315+
mbox.staticSearchCriteria(criteria)
321316

322317
data := imap.SearchData{UID: numKind == imapserver.NumKindUID}
323318

@@ -363,6 +358,24 @@ func (mbox *MailboxView) Search(numKind imapserver.NumKind, criteria *imap.Searc
363358
return &data, nil
364359
}
365360

361+
func (mbox *MailboxView) staticSearchCriteria(criteria *imap.SearchCriteria) {
362+
for _, seqSet := range criteria.SeqNum {
363+
mbox.staticNumSet(seqSet)
364+
}
365+
for _, uidSet := range criteria.UID {
366+
mbox.staticNumSet(uidSet)
367+
}
368+
369+
for i := range criteria.Not {
370+
mbox.staticSearchCriteria(&criteria.Not[i])
371+
}
372+
for i := range criteria.Or {
373+
for j := range criteria.Or[i] {
374+
mbox.staticSearchCriteria(&criteria.Or[i][j])
375+
}
376+
}
377+
}
378+
366379
func (mbox *MailboxView) Store(w *imapserver.FetchWriter, numSet imap.NumSet, flags *imap.StoreFlags, options *imap.StoreOptions) error {
367380
mbox.forEach(numSet, func(seqNum uint32, msg *message) {
368381
msg.store(flags)

0 commit comments

Comments
 (0)