From fa8186c8d41aadb1b33a940e623d549b88745b9b Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Mon, 3 Jan 2022 16:53:43 +0100 Subject: [PATCH] heed M_DEAD more thoroughly this doesn't really fix anything under current conditions, as so far only Maildir driver functions that modify known messages can cause concurrent expunges to be detected, and we don't call any of these before the so far unchecked loops. --- src/drv_proxy.c | 10 ++++++++-- src/sync.c | 6 ++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/drv_proxy.c b/src/drv_proxy.c index cd0d5aa..0713cd7 100644 --- a/src/drv_proxy.c +++ b/src/drv_proxy.c @@ -272,16 +272,22 @@ static @type@proxy_@name@( store_t *gctx@decl_args@, void (*cb)( @decl_cb_args@v //# DEFINE load_box_print_fmt_cb_args , total=%d, recent=%d //# DEFINE load_box_print_pass_cb_args , total_msgs, recent_msgs //# DEFINE load_box_print_cb_args - for (message_t *msg = msgs; msg; msg = msg->next) + for (message_t *msg = msgs; msg; msg = msg->next) { + if (msg->status & M_DEAD) + continue; debug( " uid=%-5u flags=%-4s size=%-6u tuid=%." stringify(TUIDL) "s\n", msg->uid, (msg->status & M_FLAGS) ? fmt_flags( msg->flags ).str : "?", msg->size, *msg->tuid ? msg->tuid : "?" ); + } //# END //# UNDEFINE find_new_msgs_print_fmt_cb_args //# UNDEFINE find_new_msgs_print_pass_cb_args //# DEFINE find_new_msgs_print_cb_args - for (message_t *msg = msgs; msg; msg = msg->next) + for (message_t *msg = msgs; msg; msg = msg->next) { + if (msg->status & M_DEAD) + continue; debug( " uid=%-5u tuid=%." stringify(TUIDL) "s\n", msg->uid, msg->tuid ); + } //# END //# DEFINE fetch_msg_print_fmt_args , uid=%u, want_flags=%s, want_date=%s diff --git a/src/sync.c b/src/sync.c index 845a883..ba7e12b 100644 --- a/src/sync.c +++ b/src/sync.c @@ -1075,6 +1075,8 @@ box_loaded( int sts, message_t *msgs, int total_msgs, int recent_msgs, void *aux for (t = 0; t < 2; t++) { debug( "synchronizing new messages on %s\n", str_fn[t^1] ); for (tmsg = svars->msgs[t^1]; tmsg; tmsg = tmsg->next) { + if (tmsg->status & M_DEAD) + continue; srec = tmsg->srec; if (srec) { if (srec->status & S_SKIPPED) { @@ -1418,6 +1420,8 @@ msgs_copied( sync_vars_t *svars, int t ) if (!(svars->state[t] & ST_SENT_NEW)) { for (tmsg = svars->new_msgs[t]; tmsg; tmsg = tmsg->next) { + if (tmsg->status & M_DEAD) + continue; if ((srec = tmsg->srec) && (srec->status & S_PENDING)) { if (svars->drv[t]->get_memory_usage( svars->ctx[t] ) >= BufferLimit) { svars->new_msgs[t] = tmsg; @@ -1568,6 +1572,8 @@ msgs_flags_set( sync_vars_t *svars, int t ) goto skip; } for (tmsg = svars->msgs[t]; tmsg; tmsg = tmsg->next) { + if (tmsg->status & M_DEAD) + continue; if (!(tmsg->flags & F_DELETED)) { //debug( " message %u is not deleted\n", tmsg->uid ); // Too noisy continue;