From 47250d067af58e1bca18e374bb3fb871a1f28285 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Wed, 20 Nov 2024 13:09:03 +0200 Subject: [PATCH] lib-lda: Don't check for tempfail if deliver_mail() hook returns 0 This fixes plugins that want lib-lda to continue saving the mail by returning 0. This may have wrongly caused temporary failure, depending on what happened to be in mail_storage's error. --- src/lib-lda/mail-deliver.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/lib-lda/mail-deliver.c b/src/lib-lda/mail-deliver.c index 7980a64d74..a8ea1ea3b3 100644 --- a/src/lib-lda/mail-deliver.c +++ b/src/lib-lda/mail-deliver.c @@ -542,17 +542,24 @@ mail_do_deliver(struct mail_deliver_context *ctx, else { ctx->dup_db = mail_duplicate_db_init(ctx->rcpt_user, DUPLICATE_DB_NAME); - if (deliver_mail(ctx, storage_r) <= 0) { + ret = deliver_mail(ctx, storage_r); + mail_duplicate_db_deinit(&ctx->dup_db); + if (ret > 0) { + /* success. message may or may not have been saved. */ + ret = 0; + } else if (ctx->saved_mail) { /* if message was saved, don't bounce it even though the script failed later. */ - ret = ctx->saved_mail ? 0 : -1; - } else { - /* success. message may or may not have been saved. */ ret = 0; + } else if (ret == 0) { + /* message wasn't delivered yet. */ + ret = -1; + } else if (ret < 0) { + /* delivery failed. */ + if (mail_deliver_is_tempfailed(ctx, *storage_r)) + return -1; + ret = -1; } - mail_duplicate_db_deinit(&ctx->dup_db); - if (ret < 0 && mail_deliver_is_tempfailed(ctx, *storage_r)) - return -1; } if (ret < 0 && !ctx->tried_default_save) { -- 2.47.3