Skip to content

Commit

Permalink
lmtp: Trigger autoexpunging only for the last RCPT TO.
Browse files Browse the repository at this point in the history
Otherwise if the autoexpunging takes a long time, the LMTP client could
disconnect due to a timeout. The mails would still eventually get delivered
though, so it would result in duplicate mails being delivered.

An alternative to this would be to keep all the mail_users referenced until
the delivery is finished and then autoexpunge all of them at the end. It
increases memory usage though and complicates the code, so at least for now
it's not implemented.
  • Loading branch information
sirainen committed Mar 27, 2017
1 parent 70d0076 commit bc72ba6
Showing 1 changed file with 9 additions and 2 deletions.
11 changes: 9 additions & 2 deletions src/lmtp/commands.c
Expand Up @@ -928,6 +928,11 @@ client_deliver(struct client *client, const struct mail_recipient *rcpt,
return ret;
}

static bool client_rcpt_to_is_last(struct client *client)
{
return client->state.rcpt_idx >= array_count(&client->state.rcpt_to);
}

static bool client_deliver_next(struct client *client, struct mail *src_mail,
struct mail_deliver_session *session)
{
Expand All @@ -947,7 +952,8 @@ static bool client_deliver_next(struct client *client, struct mail *src_mail,
return TRUE;
/* failed. try the next one. */
if (client->state.dest_user != NULL) {
mail_user_autoexpunge(client->state.dest_user);
if (client_rcpt_to_is_last(client))
mail_user_autoexpunge(client->state.dest_user);
mail_user_unref(&client->state.dest_user);
}
}
Expand Down Expand Up @@ -1038,7 +1044,8 @@ client_input_data_write_local(struct client *client, struct istream *input)
while (client_deliver_next(client, src_mail, session)) {
if (client->state.first_saved_mail == NULL ||
client->state.first_saved_mail == src_mail) {
mail_user_autoexpunge(client->state.dest_user);
if (client_rcpt_to_is_last(client))
mail_user_autoexpunge(client->state.dest_user);
mail_user_unref(&client->state.dest_user);
} else {
/* use the first saved message to save it elsewhere too.
Expand Down

0 comments on commit bc72ba6

Please sign in to comment.