From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 8B5941F5AE for ; Tue, 16 Jun 2020 06:19:08 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH] imap: fix UID-offset-to-MSN mapping bugs Date: Tue, 16 Jun 2020 06:19:08 +0000 Message-Id: <20200616061908.28690-1-e@yhbt.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: We need to clear the UID-offset-to-MSN mapping when leaving mailboxes via EXAMINE/SELECT/CLOSE. Furthermore, uo2m_last_uid() needs to account for tiny mailboxes where the scalar representation of {uo2m} may be evaluated to `false' in a boolean context. --- lib/PublicInbox/IMAP.pm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/PublicInbox/IMAP.pm b/lib/PublicInbox/IMAP.pm index dd983dfd..8388d30e 100644 --- a/lib/PublicInbox/IMAP.pm +++ b/lib/PublicInbox/IMAP.pm @@ -166,7 +166,7 @@ sub cmd_login ($$$$) { sub cmd_close ($$) { my ($self, $tag) = @_; - delete $self->{uid_base}; + delete @$self{qw(uid_base uo2m)}; delete $self->{ibx} ? "$tag OK Close done\r\n" : "$tag BAD No mailbox\r\n"; } @@ -220,7 +220,7 @@ sub uo2m_hibernate ($) { sub uo2m_last_uid ($) { my ($self) = @_; - my $uo2m = $self->{uo2m} or die 'BUG: uo2m_last_uid w/o {uo2m}'; + defined(my $uo2m = $self->{uo2m}) or die 'BUG: uo2m_last_uid w/o {uo2m}'; (ref($uo2m) ? @$uo2m : (length($uo2m) >> 1)) + $self->{uid_base}; } @@ -415,6 +415,7 @@ sub cmd_examine ($$$) { my ($ibx, $exists, $uidnext, $base) = inbox_lookup($self, $mailbox); return "$tag NO Mailbox doesn't exist: $mailbox\r\n" if !$ibx; $self->{uid_base} = $base; + delete $self->{uo2m}; # XXX: do we need this? RFC 5162/7162 my $ret = $self->{ibx} ? "* OK [CLOSED] previous closed\r\n" : '';