From f2f519e20b75a0cfb21198ddaa5e24b72f92f5f8 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 26 Jan 2022 22:03:40 +0100 Subject: [PATCH] fix bogus orphaning due to expunging we cannot orphan all messages whose opposite we expunge, as that would prevent subsequent propagation of the deletion. we can do that only if the message is already known to be marked as deleted. --- src/run-tests.pl | 20 ++++++++++++++++++++ src/sync.c | 4 ++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/run-tests.pl b/src/run-tests.pl index 5a96b50..6a12616 100755 --- a/src/run-tests.pl +++ b/src/run-tests.pl @@ -1064,6 +1064,26 @@ my @X08 = ( ); test("push flags + pull deletions", \@x01, \@X08, \@O08); +my @O09 = ("", "", "Sync None\nExpunge Both\n"); +my @X09 = ( + I, 0, I, + E, "/", "", "", + F, "", "", "/", + H, "/", "", "", + J, "/", "", "", + L, "", "", "/", +); +test("noop + expunge both", \@x01, \@X09, \@O09); + +my @O0A = ("", "", "Sync None\nExpunge Near\n"); +# Sync entries are not updated/pruned, because the far side is not loaded. +my @X0A = ( + I, 0, I, + F, "", "", "/", + L, "", "", "/", +); +test("noop + expunge near side", \@x01, \@X0A, \@O0A); + # Size restriction tests my @x20 = ( diff --git a/src/sync.c b/src/sync.c index 4a46785..a2d4746 100644 --- a/src/sync.c +++ b/src/sync.c @@ -1812,11 +1812,11 @@ box_closed_p2( sync_vars_t *svars, int t ) ((srec->status & S_EXPIRED) && svars->maxuid[F] >= srec->uid[F] && svars->maxxfuid >= srec->uid[F])) { PC_JLOG( "- %u %u", (srec->uid[F], srec->uid[N]), "killing" ); srec->status = S_DEAD; - } else if (srec->uid[N]) { + } else if (srec->uid[N] && (srec->status & S_DEL(F))) { PC_JLOG( "> %u %u 0", (srec->uid[F], srec->uid[N]), "orphaning" ); srec->uid[N] = 0; } - } else if (srec->uid[F] && ((srec->status & S_DEL(F)) && (svars->state[F] & ST_DID_EXPUNGE))) { + } else if (srec->uid[F] && ((srec->status & S_DEL(F)) && (svars->state[F] & ST_DID_EXPUNGE)) && (srec->status & S_DEL(N))) { PC_JLOG( "< %u %u 0", (srec->uid[F], srec->uid[N]), "orphaning" ); srec->uid[F] = 0; }