From: Wietse Venema Date: Sat, 4 Feb 2012 05:00:00 +0000 (-0500) Subject: postfix-2.5.17 X-Git-Tag: v2.5.17^0 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fheads%2Fpostfix-2.5;p=thirdparty%2Fpostfix.git postfix-2.5.17 --- diff --git a/postfix/HISTORY b/postfix/HISTORY index 601bc62c4..19443dc35 100644 --- a/postfix/HISTORY +++ b/postfix/HISTORY @@ -14773,3 +14773,37 @@ Apologies for any names omitted. checks to unknown message subtypes such as message/global*. File: global/mime_state.c. +20111024 + + Bugfix (introduced: Postfix 2.3): while the Postfix SMTP + client's protocol parser uses the last SMTP reply line as + intended, the error processing routine was taking information + from the beginning of the response. This was causing "Protocol + error" bounces with postscreen responses on Postfix < 2.6. + Reported by Ralf Hildebrandt. File: smtp/smtp_trouble.c. + +20111226 + + Bugfix (introduced 20110426): after lookup error with + mailbox_transport_maps, mailbox_command_maps or + fallback_transport_maps, the local delivery agent did not + log the problem before deferring mail, and produced no defer + logfile record. Files: local/mailbox.c, local/unknown.c. + +20120130 + + Bugfix (introduced: Postfix 2.3): the trace service did not + distinguish between DSN SUCCESS notifications for a non-bounce + or a bounce message, and replied to mail from <>. This code + pre-dates DSN support and should have been updated when it + was re-purposed to handle DSN SUCCESS notifications. Problem + reported by Sabahattin Gucukoglu. File: + bounce/bounce_trace_service.c. + +20120202 + + Bugfix (introduced: Postfix 2.3): the "change header" milter + request could replace the wrong header. A long header name + could match a shorter one, because a length check was done + on the wrong string. Reported by Vladimir Vassiliev. File: + cleanup/cleanup_milter.c. diff --git a/postfix/src/bounce/bounce_trace_service.c b/postfix/src/bounce/bounce_trace_service.c index 78d1b9362..3b77ec6fe 100644 --- a/postfix/src/bounce/bounce_trace_service.c +++ b/postfix/src/bounce/bounce_trace_service.c @@ -83,8 +83,39 @@ int bounce_trace_service(int flags, char *service, char *queue_name, BOUNCE_INFO *bounce_info; int bounce_status = 1; VSTREAM *bounce; - VSTRING *new_id = vstring_alloc(10); + int notify_mask = name_mask(VAR_NOTIFY_CLASSES, mail_error_masks, + var_notify_classes); + VSTRING *new_id; int count; + const char *sender; + + /* + * For consistency with fail/delay notifications, send notification for a + * non-bounce message as a single-bounce message, send notification for a + * single-bounce message as a double-bounce message, and drop requests to + * send notification for a double-bounce message. + */ +#define NULL_SENDER MAIL_ADDR_EMPTY /* special address */ + + if (strcasecmp(recipient, mail_addr_double_bounce()) == 0) { + msg_info("%s: not sending trace/success notification for " + "double-bounce message", queue_id); + return (0); + } else if (*recipient == 0) { + if ((notify_mask & MAIL_ERROR_2BOUNCE) != 0) { + recipient = var_2bounce_rcpt; + sender = mail_addr_double_bounce(); + } else { + msg_info("%s: not sending trace/success notification " + "for single-bounce message", queue_id); + if (mail_queue_remove(service, queue_id) && errno != ENOENT) + msg_fatal("remove %s %s: %m", service, queue_id); + return (0); + } + } else { + /* Always send notification for non-bounce message. */ + sender = NULL_SENDER; + } /* * Initialize. Open queue file, bounce log, etc. @@ -126,7 +157,6 @@ int bounce_trace_service(int flags, char *service, char *queue_name, bounce_mail_free(bounce_info); return (0); } -#define NULL_SENDER MAIL_ADDR_EMPTY /* special address */ #define NULL_TRACE_FLAGS 0 /* @@ -139,7 +169,8 @@ int bounce_trace_service(int flags, char *service, char *queue_name, * there are fewer potential left-over files to remove up when we create * a new queue file. */ - if ((bounce = post_mail_fopen_nowait(NULL_SENDER, recipient, + new_id = vstring_alloc(10); + if ((bounce = post_mail_fopen_nowait(sender, recipient, INT_FILT_BOUNCE, NULL_TRACE_FLAGS, new_id)) != 0) { diff --git a/postfix/src/cleanup/cleanup_milter.c b/postfix/src/cleanup/cleanup_milter.c index c9423c73e..991df70f2 100644 --- a/postfix/src/cleanup/cleanup_milter.c +++ b/postfix/src/cleanup/cleanup_milter.c @@ -520,8 +520,7 @@ static off_t cleanup_find_header_start(CLEANUP_STATE *state, ssize_t index, /* Reset the saved PTR record and update last_type. */ ; else if ((header_label == 0 || (strncasecmp(header_label, STR(buf), len) == 0 - && (IS_SPACE_TAB(STR(buf)[len]) - || STR(buf)[len] == ':'))) + && (strlen(header_label) == len))) && --index == 0) { /* If we have a saved PTR record, it points to start of header. */ break; diff --git a/postfix/src/global/mail_version.h b/postfix/src/global/mail_version.h index c5c7c49b9..1ee8fe5fa 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 "20111024" -#define MAIL_VERSION_NUMBER "2.5.16" +#define MAIL_RELEASE_DATE "20120204" +#define MAIL_VERSION_NUMBER "2.5.17" #ifdef SNAPSHOT # define MAIL_VERSION_DATE "-" MAIL_RELEASE_DATE diff --git a/postfix/src/local/mailbox.c b/postfix/src/local/mailbox.c index 58b01f79f..89c739274 100644 --- a/postfix/src/local/mailbox.c +++ b/postfix/src/local/mailbox.c @@ -289,7 +289,8 @@ int deliver_mailbox(LOCAL_STATE state, USER_ATTR usr_attr, int *statusp) } else if (dict_errno != 0) { /* Details in the logfile. */ dsb_simple(state.msg_attr.why, "4.3.0", "table lookup failure"); - *statusp = DEL_STAT_DEFER; + *statusp = defer_append(BOUNCE_FLAGS(state.request), + BOUNCE_ATTR(state.msg_attr)); return (YES); } if (*var_mailbox_transport) { @@ -333,7 +334,8 @@ int deliver_mailbox(LOCAL_STATE state, USER_ATTR usr_attr, int *statusp) } else if (dict_errno != 0) { /* Details in the logfile. */ dsb_simple(state.msg_attr.why, "4.3.0", "table lookup failure"); - status = DEL_STAT_DEFER; + status = defer_append(BOUNCE_FLAGS(state.request), + BOUNCE_ATTR(state.msg_attr)); } else if (*var_mailbox_command) { status = deliver_command(state, usr_attr, var_mailbox_command); } else if (*var_home_mailbox && LAST_CHAR(var_home_mailbox) == '/') { diff --git a/postfix/src/local/unknown.c b/postfix/src/local/unknown.c index eb5bbf250..57e49af84 100644 --- a/postfix/src/local/unknown.c +++ b/postfix/src/local/unknown.c @@ -120,7 +120,8 @@ int deliver_unknown(LOCAL_STATE state, USER_ATTR usr_attr) } else if (dict_errno != 0) { /* Details in the logfile. */ dsb_simple(state.msg_attr.why, "4.3.0", "table lookup failure"); - return (DEL_STAT_DEFER); + return (defer_append(BOUNCE_FLAGS(state.request), + BOUNCE_ATTR(state.msg_attr))); } if (*var_fallback_transport) { state.msg_attr.rcpt.offset = -1L; diff --git a/postfix/src/smtp/smtp_trouble.c b/postfix/src/smtp/smtp_trouble.c index c8036ffb3..30de87499 100644 --- a/postfix/src/smtp/smtp_trouble.c +++ b/postfix/src/smtp/smtp_trouble.c @@ -288,7 +288,7 @@ static void vsmtp_fill_dsn(SMTP_STATE *state, const char *mta_name, * cycles. */ VSTRING_RESET(why->reason); - if (mta_name && reply && reply[0] != '4' && reply[0] != '5') { + if (mta_name && status && status[0] != '4' && status[0] != '5') { vstring_strcpy(why->reason, "Protocol error: "); status = "5.5.0"; }