]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-lda: Don't check for tempfail if deliver_mail() hook returns 0
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 20 Nov 2024 11:09:03 +0000 (13:09 +0200)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Fri, 17 Jan 2025 08:40:01 +0000 (10:40 +0200)
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

index 7980a64d7496ba9da432217971c829d34d353fe3..a8ea1ea3b34ca6c2b57e00d9716b7b43e9ed7b93 100644 (file)
@@ -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) {