From 28b3968dd1fe90c061c1dc0d74e64fa88f99af89 Mon Sep 17 00:00:00 2001 From: Wietse Venema Date: Thu, 12 Mar 2020 00:00:00 -0500 Subject: [PATCH] postfix-3.5.0-RC2 --- postfix/HISTORY | 7 +++++++ postfix/src/global/mail_version.h | 4 ++-- postfix/src/smtpd/smtpd.c | 8 ++++++-- postfix/src/smtpd/smtpd.h | 1 + 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/postfix/HISTORY b/postfix/HISTORY index e7579aff1..e3e1ab640 100644 --- a/postfix/HISTORY +++ b/postfix/HISTORY @@ -24653,3 +24653,10 @@ Apologies for any names omitted. Cleanup: harmless memory leak in postconf. File: postconf/postconf_master.c. + +20200312 + + Bugfix (introduced: Postfix 2.3): panic with Postfix + multi-Milter configuration during MAIL FROM. Milter client + state was not properly reset after one of the Milters failed. + Reported by WeiYu Wu. diff --git a/postfix/src/global/mail_version.h b/postfix/src/global/mail_version.h index 0cfe0a5ca..a13af0767 100644 --- a/postfix/src/global/mail_version.h +++ b/postfix/src/global/mail_version.h @@ -20,8 +20,8 @@ * Patches change both the patchlevel and the release date. Snapshots have no * patchlevel; they change the release date only. */ -#define MAIL_RELEASE_DATE "20200308" -#define MAIL_VERSION_NUMBER "3.5-RC1" +#define MAIL_RELEASE_DATE "20200312" +#define MAIL_VERSION_NUMBER "3.5.0-RC2" #ifdef SNAPSHOT #define MAIL_VERSION_DATE "-" MAIL_RELEASE_DATE diff --git a/postfix/src/smtpd/smtpd.c b/postfix/src/smtpd/smtpd.c index f9b766049..2059bd5e2 100644 --- a/postfix/src/smtpd/smtpd.c +++ b/postfix/src/smtpd/smtpd.c @@ -2615,6 +2615,7 @@ static int mail_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv) } if (state->milters != 0 && (state->saved_flags & MILTER_SKIP_FLAGS) == 0) { + state->flags |= SMTPD_FLAG_NEED_MILTER_ABORT; PUSH_STRING(saved_sender, state->sender, STR(state->addr_buf)); err = milter_mail_event(state->milters, milter_argv(state, argc - 2, argv + 2)); @@ -2730,11 +2731,14 @@ static void mail_reset(SMTPD_STATE *state) state->queue_id = 0; } if (state->sender) { - if (state->milters != 0) - milter_abort(state->milters); myfree(state->sender); state->sender = 0; } + /* WeiYu Wu: need to undo milter_mail_event() state change. */ + if (state->flags & SMTPD_FLAG_NEED_MILTER_ABORT) { + milter_abort(state->milters); + state->flags &= ~SMTPD_FLAG_NEED_MILTER_ABORT; + } if (state->verp_delims) { myfree(state->verp_delims); state->verp_delims = 0; diff --git a/postfix/src/smtpd/smtpd.h b/postfix/src/smtpd/smtpd.h index ae194035c..490cda2fa 100644 --- a/postfix/src/smtpd/smtpd.h +++ b/postfix/src/smtpd/smtpd.h @@ -206,6 +206,7 @@ typedef struct { #define SMTPD_FLAG_ILL_PIPELINING (1<<1) /* inappropriate pipelining */ #define SMTPD_FLAG_AUTH_USED (1<<2) /* don't reuse SASL state */ #define SMTPD_FLAG_SMTPUTF8 (1<<3) /* RFC 6531/2 transaction */ +#define SMTPD_FLAG_NEED_MILTER_ABORT (1<<4) /* undo milter_mail_event() */ /* Security: don't reset SMTPD_FLAG_AUTH_USED. */ #define SMTPD_MASK_MAIL_KEEP \