From 74e31aec6f66f695850bacf6379a034ea49a1d28 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 19 Feb 2021 05:09:53 -0700 Subject: net_reader: handle single-message IMAP mailboxes Due to an off-by-one error, we were unable to read mailboxes with only a single message of UID:1. Without this fix, the message with UID:1 could only be read after UID:2 was created; so there's no permanent data loss as long as a new message showed up. This affects all releases of public-inbox-watch with IMAP support, though it probably went unnoticed because single message inboxes are rare. --- lib/PublicInbox/NetReader.pm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/PublicInbox/NetReader.pm b/lib/PublicInbox/NetReader.pm index 61ea538b..22ba4be7 100644 --- a/lib/PublicInbox/NetReader.pm +++ b/lib/PublicInbox/NetReader.pm @@ -353,17 +353,18 @@ sub _imap_fetch_all ($$$) { PublicInbox::IMAPTracker->new($url) : 0; my ($l_uidval, $l_uid) = $itrk ? $itrk->get_last : (); $l_uidval //= $r_uidval; # first time - $l_uid //= 1; + $l_uid //= 0; if ($l_uidval != $r_uidval) { return "E: $url UIDVALIDITY mismatch\n". "E: local=$l_uidval != remote=$r_uidval"; } my $r_uid = $r_uidnext - 1; - if ($l_uid != 1 && $l_uid > $r_uid) { + if ($l_uid > $r_uid) { return "E: $url local UID exceeds remote ($l_uid > $r_uid)\n". "E: $url strangely, UIDVALIDLITY matches ($l_uidval)\n"; } return if $l_uid >= $r_uid; # nothing to do + $l_uid ||= 1; warn "# $url fetching UID $l_uid:$r_uid\n" unless $self->{quiet}; $mic->Uid(1); # the default, we hope -- cgit v1.2.3-24-ge0c7