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.
This commit is contained in:
Oswald Buddenhagen 2022-01-26 22:03:40 +01:00
parent 3c0ad89a13
commit f2f519e20b
2 changed files with 22 additions and 2 deletions

View File

@ -1064,6 +1064,26 @@ my @X08 = (
); );
test("push flags + pull deletions", \@x01, \@X08, \@O08); 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 # Size restriction tests
my @x20 = ( my @x20 = (

View File

@ -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])) { ((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" ); PC_JLOG( "- %u %u", (srec->uid[F], srec->uid[N]), "killing" );
srec->status = S_DEAD; 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" ); PC_JLOG( "> %u %u 0", (srec->uid[F], srec->uid[N]), "orphaning" );
srec->uid[N] = 0; 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" ); PC_JLOG( "< %u %u 0", (srec->uid[F], srec->uid[N]), "orphaning" );
srec->uid[F] = 0; srec->uid[F] = 0;
} }