From: Timo Sirainen Date: Wed, 20 Nov 2024 11:09:03 +0000 (+0200) Subject: lib-lda: Don't check for tempfail if deliver_mail() hook returns 0 X-Git-Tag: 2.4.0~231 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c8a122cfb8091d1cc4f7cc17206327e774df4a23;p=thirdparty%2Fdovecot%2Fcore.git 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. --- 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) {