Prereq: "3.4.21" diff -ur --new-file /var/tmp/postfix-3.4.21/src/global/mail_version.h ./src/global/mail_version.h --- /var/tmp/postfix-3.4.21/src/global/mail_version.h 2021-06-13 15:03:30.000000000 -0400 +++ ./src/global/mail_version.h 2021-07-24 19:20:17.000000000 -0400 @@ -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.4.21" +#define MAIL_RELEASE_DATE "20210724" +#define MAIL_VERSION_NUMBER "3.4.22" #ifdef SNAPSHOT #define MAIL_VERSION_DATE "-" MAIL_RELEASE_DATE diff -ur --new-file /var/tmp/postfix-3.4.21/HISTORY ./HISTORY --- /var/tmp/postfix-3.4.21/HISTORY 2021-06-13 15:00:06.000000000 -0400 +++ ./HISTORY 2021-07-24 18:42:38.000000000 -0400 @@ -24615,3 +24615,42 @@ 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 -ur --new-file /var/tmp/postfix-3.4.21/src/cleanup/cleanup_message.c ./src/cleanup/cleanup_message.c --- /var/tmp/postfix-3.4.21/src/cleanup/cleanup_message.c 2018-01-07 11:54:46.000000000 -0500 +++ ./src/cleanup/cleanup_message.c 2021-07-24 18:31:05.000000000 -0400 @@ -773,9 +773,12 @@ } 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 -ur --new-file /var/tmp/postfix-3.4.21/src/global/record.c ./src/global/record.c --- /var/tmp/postfix-3.4.21/src/global/record.c 2018-11-27 17:39:42.000000000 -0500 +++ ./src/global/record.c 2021-07-24 19:05:33.000000000 -0400 @@ -323,7 +323,7 @@ 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 @@ * 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 -ur --new-file /var/tmp/postfix-3.4.21/src/postscreen/postscreen_tests.c ./src/postscreen/postscreen_tests.c --- /var/tmp/postfix-3.4.21/src/postscreen/postscreen_tests.c 2017-12-27 17:29:45.000000000 -0500 +++ ./src/postscreen/postscreen_tests.c 2021-07-24 18:31:05.000000000 -0400 @@ -175,6 +175,7 @@ * 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 -ur --new-file /var/tmp/postfix-3.4.21/src/smtpd/smtpd.c ./src/smtpd/smtpd.c --- /var/tmp/postfix-3.4.21/src/smtpd/smtpd.c 2020-11-04 17:11:13.000000000 -0500 +++ ./src/smtpd/smtpd.c 2021-07-24 18:31:05.000000000 -0400 @@ -1283,6 +1283,7 @@ 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; @@ -6390,6 +6391,7 @@ 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 -ur --new-file /var/tmp/postfix-3.4.21/src/smtpd/smtpd_chat.c ./src/smtpd/smtpd_chat.c --- /var/tmp/postfix-3.4.21/src/smtpd/smtpd_chat.c 2018-08-27 17:54:59.000000000 -0400 +++ ./src/smtpd/smtpd_chat.c 2021-07-24 18:31:05.000000000 -0400 @@ -316,7 +316,8 @@ #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 -ur --new-file /var/tmp/postfix-3.4.21/src/util/dict_thash.c ./src/util/dict_thash.c --- /var/tmp/postfix-3.4.21/src/util/dict_thash.c 2017-12-27 17:29:45.000000000 -0500 +++ ./src/util/dict_thash.c 2021-06-14 16:20:18.000000000 -0400 @@ -46,6 +46,7 @@ /* Utility library. */ #include +#include #include #include #include @@ -180,6 +181,24 @@ " 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 * ignores duplicates by default and we would have to check that diff -ur --new-file /var/tmp/postfix-3.4.21/src/util/mac_expand.c ./src/util/mac_expand.c --- /var/tmp/postfix-3.4.21/src/util/mac_expand.c 2018-01-21 13:13:34.000000000 -0500 +++ ./src/util/mac_expand.c 2021-07-24 18:31:05.000000000 -0400 @@ -226,6 +226,7 @@ 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);