+
+ /*
+ * Don't swap UID lists unless we've actually seen UIDLs.
+ * This is necessary in order to keep UIDL information
+ * from being heedlessly deleted later on.
+ *
+ * Older versions of fetchmail did
+ *
+ * free_str_list(&scratchlist);
+ *
+ * after swap. This was wrong; we need to preserve the UIDL information
+ * from unqueried hosts. Unfortunately, not doing this means that
+ * under some circumstances UIDLs can end up being stored forever --
+ * specifically, if a user description is removed from .fetchmailrc
+ * with UIDLs from that account in .fetchids, there is no way for
+ * them to ever get garbage-collected.
+ */
+ if (ctl->newsaved)
+ {
+ /* old state of mailbox may now be irrelevant */
+ if (outlevel >= O_DEBUG)
+ report(stdout, _("swapping UID lists\n"));
+ free_str_list(&ctl->oldsaved);
+ ctl->oldsaved = ctl->newsaved;
+ ctl->newsaved = (struct idlist *) NULL;
+ }
+ else if (outlevel >= O_DEBUG)
+ report(stdout, _("not swapping UID lists, no UIDs seen this query\n"));