From: Wietse Venema Date: Sat, 24 Jul 2021 05:00:00 +0000 (-0500) Subject: postfix-3.5.12 X-Git-Tag: v3.5.12^0 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ffcbee68bed25490189f3e787eb446bb67021af6;p=thirdparty%2Fpostfix.git postfix-3.5.12 --- diff --git a/postfix/HISTORY b/postfix/HISTORY index 9c36cb4a9..a0fd045b2 100644 --- a/postfix/HISTORY +++ b/postfix/HISTORY @@ -24948,3 +24948,42 @@ Apologies for any names omitted. an earlier supported version, or when sharing Postfix 3.6 configuration files with an earlier supported Postfix version. File: global/mail_params.c. + +20210615 + + Bugfix (introduced: Postfix 3.4): the texthash: map + implementation did not support "postmap -F" behavior. + Reported by Christopher Gurnee, who also found the missing + code in the postmap source. File: util/dict_thash.c. + +20210623 + + Bugfix (introduced: 1999, Postfix 2.11) latent false "Result too + large" (ERANGE) errors because an strtol() call had no 'errno + = 0' statement before the call. Back-ported from Postfix 3.6. + Files: postscreen/postscreen_tests.c, util/mac_expand.c. + +20210705 + + Bugfix (introduced: Postfix 3.3): "null pointer read" error + in the cleanup daemon when "header_from_format = standard" + (the default as of Postfix 3.3) and email was submitted + with /usr/sbin/sendmail without From: header, and an all-space + full name was specified in 1) the password file, 2) with + "sendmail -F", or 3) with the NAME environment variable. + Found by Renaud Metrich. File: cleanup/cleanup_message.c. + +20210708 + + Bugfix (introduced: 1999): the Postfix SMTP server was + sending all session transcripts to the error_notice_recipient, + instead of sending transcripts of bounced mail to the + bounce_notice_recipient. File: smtpd/smtpd_chat.c. + +20210713 + + Bugfix (introduced: Postfix 2.4): false "too many reverse + jump" warnings in the showq daemon. The loop detection code + was comparing memory addresses instead of queue file names. + It now properly compares strings. Reported by Mehmet Avcioglu. + File: global/record.c. diff --git a/postfix/src/cleanup/cleanup_message.c b/postfix/src/cleanup/cleanup_message.c index 391c7119f..902642f19 100644 --- a/postfix/src/cleanup/cleanup_message.c +++ b/postfix/src/cleanup/cleanup_message.c @@ -776,9 +776,12 @@ static void cleanup_header_done_callback(void *context) } else { token = tok822_alloc(TOK822_QSTRING, state->fullname); } - tok822_externalize(state->temp2, token, TOK822_STR_NONE); - tok822_free(token); - vstring_sprintf_append(state->temp2, " <%s>", + if (token) { + tok822_externalize(state->temp2, token, TOK822_STR_NONE); + tok822_free(token); + vstring_strcat(state->temp2, " "); + } + vstring_sprintf_append(state->temp2, "<%s>", vstring_str(state->temp1)); break; diff --git a/postfix/src/global/mail_version.h b/postfix/src/global/mail_version.h index a3bc58ea5..45b679d8d 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 "20210613" -#define MAIL_VERSION_NUMBER "3.5.11" +#define MAIL_RELEASE_DATE "20210724" +#define MAIL_VERSION_NUMBER "3.5.12" #ifdef SNAPSHOT #define MAIL_VERSION_DATE "-" MAIL_RELEASE_DATE diff --git a/postfix/src/global/record.c b/postfix/src/global/record.c index 1dc9b757f..80cb1ac3b 100644 --- a/postfix/src/global/record.c +++ b/postfix/src/global/record.c @@ -323,7 +323,7 @@ int rec_get_raw(VSTREAM *stream, VSTRING *buf, ssize_t maxsize, int flags) int rec_goto(VSTREAM *stream, const char *buf) { off_t offset; - static const char *saved_path; + static char *saved_path; static off_t saved_offset; static int reverse_count; @@ -336,11 +336,12 @@ int rec_goto(VSTREAM *stream, const char *buf) * is likely to insert 10000 message headers, but someone might append * 10000 recipients. */ -#define STREQ(x,y) ((x) == (y) && strcmp((x), (y)) == 0) #define REVERSE_JUMP_LIMIT 10000 - if (!STREQ(saved_path, VSTREAM_PATH(stream))) { - saved_path = VSTREAM_PATH(stream); + if (saved_path == 0 || strcmp(saved_path, VSTREAM_PATH(stream)) != 0) { + if (saved_path) + myfree(saved_path); + saved_path = mystrdup(VSTREAM_PATH(stream)); reverse_count = 0; saved_offset = 0; } diff --git a/postfix/src/postscreen/postscreen_tests.c b/postfix/src/postscreen/postscreen_tests.c index 80cbc97d6..21ebde8a3 100644 --- a/postfix/src/postscreen/postscreen_tests.c +++ b/postfix/src/postscreen/postscreen_tests.c @@ -175,6 +175,7 @@ void psc_parse_tests(PSC_STATE *state, * at the time that the cache entry was written. */ for (sp = time_stamps; sp < time_stamps + PSC_TINDX_COUNT; sp++) { + errno = 0; *sp = strtoul(start, &cp, 10); if (*start == 0 || (*cp != '\0' && *cp != ';') || errno == ERANGE) *sp = PSC_TIME_STAMP_DISABLED; diff --git a/postfix/src/smtpd/smtpd.c b/postfix/src/smtpd/smtpd.c index da7227f74..a6c12993d 100644 --- a/postfix/src/smtpd/smtpd.c +++ b/postfix/src/smtpd/smtpd.c @@ -1291,6 +1291,7 @@ int var_reject_code; int var_defer_code; int var_smtpd_err_sleep; int var_non_fqdn_code; +char *var_bounce_rcpt; char *var_error_rcpt; int var_smtpd_delay_reject; char *var_rest_classes; @@ -6418,6 +6419,7 @@ int main(int argc, char **argv) VAR_EOD_CHECKS, DEF_EOD_CHECKS, &var_eod_checks, 0, 0, VAR_MAPS_RBL_DOMAINS, DEF_MAPS_RBL_DOMAINS, &var_maps_rbl_domains, 0, 0, VAR_RBL_REPLY_MAPS, DEF_RBL_REPLY_MAPS, &var_rbl_reply_maps, 0, 0, + VAR_BOUNCE_RCPT, DEF_ERROR_RCPT, &var_bounce_rcpt, 1, 0, VAR_ERROR_RCPT, DEF_ERROR_RCPT, &var_error_rcpt, 1, 0, VAR_REST_CLASSES, DEF_REST_CLASSES, &var_rest_classes, 0, 0, VAR_CANONICAL_MAPS, DEF_CANONICAL_MAPS, &var_canonical_maps, 0, 0, diff --git a/postfix/src/smtpd/smtpd_chat.c b/postfix/src/smtpd/smtpd_chat.c index 63795b861..c172ab3d1 100644 --- a/postfix/src/smtpd/smtpd_chat.c +++ b/postfix/src/smtpd/smtpd_chat.c @@ -316,7 +316,8 @@ void smtpd_chat_notify(SMTPD_STATE *state) #define INDENT 4 notice = post_mail_fopen_nowait(mail_addr_double_bounce(), - var_error_rcpt, + (state->error_mask & MAIL_ERROR_BOUNCE) ? + var_bounce_rcpt : var_error_rcpt, MAIL_SRC_MASK_NOTIFY, NULL_TRACE_FLAGS, SMTPUTF8_FLAG_NONE, NO_QUEUE_ID); if (notice == 0) { diff --git a/postfix/src/util/dict_thash.c b/postfix/src/util/dict_thash.c index a121ead35..5012fb9e2 100644 --- a/postfix/src/util/dict_thash.c +++ b/postfix/src/util/dict_thash.c @@ -46,6 +46,7 @@ /* Utility library. */ #include +#include #include #include #include @@ -179,6 +180,24 @@ DICT *dict_thash_open(const char *path, int open_flags, int dict_flags) msg_warn("%s, line %d: record is in \"key: value\" format;" " is this an alias file?", path, lineno); + /* + * Optionally treat the value as a filename, and replace the value + * with the BASE64-encoded content of the named file. + */ + if (dict_flags & DICT_FLAG_SRC_RHS_IS_FILE) { + VSTRING *base64_buf; + char *err; + + if ((base64_buf = dict_file_to_b64(dict, value)) == 0) { + err = dict_file_get_error(dict); + msg_warn("%s, line %d: %s: skipping this entry", + VSTREAM_PATH(fp), lineno, err); + myfree(err); + continue; + } + value = vstring_str(base64_buf); + } + /* * Store the value under the key. Handle duplicates * appropriately. XXX Move this into dict_ht, but 1) that map diff --git a/postfix/src/util/mac_expand.c b/postfix/src/util/mac_expand.c index 8ba0071bc..1679e5e0f 100644 --- a/postfix/src/util/mac_expand.c +++ b/postfix/src/util/mac_expand.c @@ -226,6 +226,7 @@ static long atol_or_die(const char *strval) long result; char *remainder; + errno = 0; result = strtol(strval, &remainder, 10); if (*strval == 0 /* can't happen */ || *remainder != 0 || errno == ERANGE) msg_fatal("mac_exp_eval: bad conversion: %s", strval);