Prereq: "3.3.18" diff -ur --new-file /var/tmp/postfix-3.3.18/src/global/mail_version.h ./src/global/mail_version.h --- /var/tmp/postfix-3.3.18/src/global/mail_version.h 2021-06-13 15:05:09.000000000 -0400 +++ ./src/global/mail_version.h 2021-07-24 19:21:08.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.3.18" +#define MAIL_RELEASE_DATE "20210724" +#define MAIL_VERSION_NUMBER "3.3.19" #ifdef SNAPSHOT #define MAIL_VERSION_DATE "-" MAIL_RELEASE_DATE diff -ur --new-file /var/tmp/postfix-3.3.18/HISTORY ./HISTORY --- /var/tmp/postfix-3.3.18/HISTORY 2021-06-13 14:58:13.000000000 -0400 +++ ./HISTORY 2021-07-24 18:37:01.000000000 -0400 @@ -23751,3 +23751,35 @@ an earlier supported version, or when sharing Postfix 3.6 configuration files with an earlier supported Postfix version. File: global/mail_params.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.3.18/src/cleanup/cleanup_message.c ./src/cleanup/cleanup_message.c --- /var/tmp/postfix-3.3.18/src/cleanup/cleanup_message.c 2018-01-07 11:54:46.000000000 -0500 +++ ./src/cleanup/cleanup_message.c 2021-07-24 18:37:01.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.3.18/src/global/record.c ./src/global/record.c --- /var/tmp/postfix-3.3.18/src/global/record.c 2017-12-27 17:29:44.000000000 -0500 +++ ./src/global/record.c 2021-07-24 19:00:49.000000000 -0400 @@ -326,7 +326,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; @@ -339,11 +339,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.3.18/src/postscreen/postscreen_tests.c ./src/postscreen/postscreen_tests.c --- /var/tmp/postfix-3.3.18/src/postscreen/postscreen_tests.c 2017-12-27 17:29:45.000000000 -0500 +++ ./src/postscreen/postscreen_tests.c 2021-07-24 18:37:01.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.3.18/src/smtpd/smtpd.c ./src/smtpd/smtpd.c --- /var/tmp/postfix-3.3.18/src/smtpd/smtpd.c 2020-11-04 17:32:23.000000000 -0500 +++ ./src/smtpd/smtpd.c 2021-07-24 18:37:01.000000000 -0400 @@ -1261,6 +1261,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; @@ -5941,6 +5942,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.3.18/src/smtpd/smtpd_chat.c ./src/smtpd/smtpd_chat.c --- /var/tmp/postfix-3.3.18/src/smtpd/smtpd_chat.c 2017-02-18 20:58:21.000000000 -0500 +++ ./src/smtpd/smtpd_chat.c 2021-07-24 18:37:01.000000000 -0400 @@ -263,7 +263,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.3.18/src/util/mac_expand.c ./src/util/mac_expand.c --- /var/tmp/postfix-3.3.18/src/util/mac_expand.c 2018-01-21 13:13:34.000000000 -0500 +++ ./src/util/mac_expand.c 2021-07-24 18:37:01.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);