Prereq: "3.7.3"
diff -ur --new-file /var/tmp/postfix-3.7.3/src/global/mail_version.h ./src/global/mail_version.h
--- /var/tmp/postfix-3.7.3/src/global/mail_version.h 2022-10-07 17:02:17.000000000 -0400
+++ ./src/global/mail_version.h 2023-01-21 16:15:12.000000000 -0500
@@ -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 "20221007"
-#define MAIL_VERSION_NUMBER "3.7.3"
+#define MAIL_RELEASE_DATE "20230121"
+#define MAIL_VERSION_NUMBER "3.7.4"
#ifdef SNAPSHOT
#define MAIL_VERSION_DATE "-" MAIL_RELEASE_DATE
diff -ur --new-file /var/tmp/postfix-3.7.3/HISTORY ./HISTORY
--- /var/tmp/postfix-3.7.3/HISTORY 2022-10-07 17:00:33.000000000 -0400
+++ ./HISTORY 2023-01-21 16:05:10.000000000 -0500
@@ -26398,3 +26398,73 @@
If delivery of the file is still desired, the file can be
moved back to /var/spool/postfix/incoming after updating
Postfix and executing "postfix reload".
+
+20221125
+
+ Bugfix (introduced: Postfix 3.6): the Postfix TLS client
+ logged a TLS connection as 'Untrusted' instead of 'Trusted',
+ when a matching DANE record was found but the MX RRset was
+ insecure. Fix by Viktor Dukhovni. File: tls/tls_client.c.
+
+20221128
+
+ Bugfix (introduced: Postfix 2.2): the smtpd_proxy_client
+ code mis-parsed the last XFORWARD attribute name in the
+ SMTP server's EHLO response. The result was that the
+ smtpd_proxy_client code failed to forward the IDENT attribute.
+ Fix by Andreas Weigel. File: smtpd/smtpd_proxy.c.
+
+20221201
+
+ Portability: LINUX6 support. Files: makedefs, util/sys_defs.h.
+
+20221207
+
+ Workaround: OpenSSL 3.x EVP_get_digestbyname() can return
+ lazily bound handles that may fail to work when one attempts
+ to use them, because no provider search happens until one
+ constructs an actual operation context. In sufficiently
+ hostile configurations, Postfix could mistakenly believe
+ that an algorithm is available, when in fact it is not. A
+ similar workaround may be needed for EVP_get_cipherbyname().
+ Fix by Viktor Dukhovni. Files: tls/tls.h, tls/tls_dane.c,
+ tls/tls_fprint.c, tls/tls_misc.c.
+
+ Bugfix (introduced: Postfix 2.11): the checkok() macro in
+ tls/tls_fprint.c evaluated its argument unconditionally;
+ it should evaluate the argument only if there was no prior
+ error. Found during code review. File: tls/tls_fprint.c.
+
+20221215
+
+ Foolproofing: postscreen segfault with postscreen_dnsbl_threshold
+ < 1. It should reject such input with a fatal error instead.
+ Discovered by Benny Pedersen. File: postscreen/postscreen.c.
+
+20230101
+
+ Documentation: add text that cidr:, pcre: and regexp: tables
+ support inline specification only in Postfix 3.7 and later.
+ Files: proto/cidr_table, proto/pcre_table, proto/regexp_table.
+
+20230103
+
+ Bugfix (introduced: Postfix 2.7): the verify daemon logged
+ a garbled cache name when terminating a cache scan in
+ progress. Reported by Phil Biggs, fix by Viktor Dukhovni.
+ File: util/dict_cache.c.
+
+20220104
+
+ Bitrot: fixes for linker warnings from newer Darwin (MacOS)
+ versions. Viktor Dukhovni. File: makedefs.
+
+20230115
+
+ Workaround for a breaking change in OpenSSL 3: always turn
+ on SSL_OP_IGNORE_UNEXPECTED_EOF, to avoid warning messages
+ and missed opportunities for TLS session reuse. This is
+ safe because the SMTP protocol implements application-level
+ framing, and is therefore not affected by TLS truncation
+ attacks. Fix by Viktor Dukhovni. Files: tls/tls.h, tls_client.c,
+ tls/tls_server.c.
diff -ur --new-file /var/tmp/postfix-3.7.3/html/cidr_table.5.html ./html/cidr_table.5.html
--- /var/tmp/postfix-3.7.3/html/cidr_table.5.html 2021-12-22 18:07:06.000000000 -0500
+++ ./html/cidr_table.5.html 2023-01-21 16:03:31.000000000 -0500
@@ -99,8 +99,8 @@
not required.
INLINE SPECIFICATION
- The contents of a table may be specified in the table name. The basic
- syntax is:
+ The contents of a table may be specified in the table name (Postfix 3.7
+ and later). The basic syntax is:
main.cf:
parameter = .. cidr:{ { rule-1 }, { rule-2 } .. } ..
diff -ur --new-file /var/tmp/postfix-3.7.3/html/pcre_table.5.html ./html/pcre_table.5.html
--- /var/tmp/postfix-3.7.3/html/pcre_table.5.html 2021-11-27 12:41:48.000000000 -0500
+++ ./html/pcre_table.5.html 2023-01-21 16:03:31.000000000 -0500
@@ -171,8 +171,8 @@
negated patterns.
INLINE SPECIFICATION
- The contents of a table may be specified in the table name. The basic
- syntax is:
+ The contents of a table may be specified in the table name (Postfix 3.7
+ and later). The basic syntax is:
main.cf:
parameter = .. pcre:{ { rule-1 }, { rule-2 } .. } ..
diff -ur --new-file /var/tmp/postfix-3.7.3/html/regexp_table.5.html ./html/regexp_table.5.html
--- /var/tmp/postfix-3.7.3/html/regexp_table.5.html 2021-06-12 20:34:29.000000000 -0400
+++ ./html/regexp_table.5.html 2023-01-21 16:03:31.000000000 -0500
@@ -128,8 +128,8 @@
negated patterns.
INLINE SPECIFICATION
- The contents of a table may be specified in the table name. The basic
- syntax is:
+ The contents of a table may be specified in the table name (Postfix 3.7
+ and later). The basic syntax is:
main.cf:
parameter = .. regexp:{ { rule-1 }, { rule-2 } .. } ..
diff -ur --new-file /var/tmp/postfix-3.7.3/makedefs ./makedefs
--- /var/tmp/postfix-3.7.3/makedefs 2022-01-23 15:53:41.000000000 -0500
+++ ./makedefs 2023-01-15 18:29:39.000000000 -0500
@@ -627,7 +627,7 @@
: ${SHLIB_ENV="LD_LIBRARY_PATH=`pwd`/lib"}
: ${PLUGIN_LD="${CC-gcc} -shared"}
;;
- Linux.[345].*) SYSTYPE=LINUX$RELEASE_MAJOR
+Linux.[3456].*) SYSTYPE=LINUX$RELEASE_MAJOR
case "$CCARGS" in
*-DNO_DB*) ;;
*-DHAS_DB*) ;;
@@ -769,6 +769,12 @@
?.*|10.*) ;;
*) SYSLIBS="$SYSLIBS -lresolv";;
esac
+ # Darwin 21 linker without additional coaxing complains about
+ # -Wl,-undefined,dynamic_lookup
+ case $RELEASE in
+ 2[1-9].*|[3-9]?.*) NOFIXUP="-Wl,-no_fixup_chains ";;
+ *) NOFIXUP="";;
+ esac
# kqueue and/or poll are broken in MacOS X 10.5 (Darwin 9).
# kqueue works in Mac OS X 10.8 (Darwin 12).
case $RELEASE in
@@ -776,12 +782,12 @@
esac
: ${SHLIB_CFLAGS=-fPIC}
: ${SHLIB_SUFFIX=.dylib}
- : ${SHLIB_LD='cc -shared -Wl,-flat_namespace -Wl,-undefined,dynamic_lookup -Wl,-install_name,@rpath/${LIB}'}
+ : ${SHLIB_LD="cc -shared -Wl,-flat_namespace ${NOFIXUP}-Wl,-undefined,dynamic_lookup "'-Wl,-install_name,@rpath/${LIB}'}
: ${SHLIB_RPATH='-Wl,-rpath,${SHLIB_DIR}'}
# In MacOS/X 10.11.x /bin/sh unsets DYLD_LIBRARY_PATH, so we
# have export it into postfix-install indirectly!
: ${SHLIB_ENV="DYLD_LIBRARY_PATH=`pwd`/lib SHLIB_ENV_VAR=DYLD_LIBRARY_PATH SHLIB_ENV_VAL=`pwd`/lib"}
- : ${PLUGIN_LD='cc -shared -Wl,-flat_namespace -Wl,-undefined,dynamic_lookup'}
+ : ${PLUGIN_LD="cc -shared -Wl,-flat_namespace ${NOFIXUP}-Wl,-undefined,dynamic_lookup"}
;;
dcosx.1*) SYSTYPE=DCOSX1
RANLIB=echo
diff -ur --new-file /var/tmp/postfix-3.7.3/man/man5/cidr_table.5 ./man/man5/cidr_table.5
--- /var/tmp/postfix-3.7.3/man/man5/cidr_table.5 2021-12-22 18:07:05.000000000 -0500
+++ ./man/man5/cidr_table.5 2023-01-21 16:03:30.000000000 -0500
@@ -115,7 +115,8 @@
.nf
.ad
.fi
-The contents of a table may be specified in the table name.
+The contents of a table may be specified in the table name
+(Postfix 3.7 and later).
The basic syntax is:
.nf
diff -ur --new-file /var/tmp/postfix-3.7.3/man/man5/pcre_table.5 ./man/man5/pcre_table.5
--- /var/tmp/postfix-3.7.3/man/man5/pcre_table.5 2021-11-27 12:41:47.000000000 -0500
+++ ./man/man5/pcre_table.5 2023-01-21 16:03:30.000000000 -0500
@@ -181,7 +181,8 @@
.nf
.ad
.fi
-The contents of a table may be specified in the table name.
+The contents of a table may be specified in the table name
+(Postfix 3.7 and later).
The basic syntax is:
.nf
diff -ur --new-file /var/tmp/postfix-3.7.3/man/man5/regexp_table.5 ./man/man5/regexp_table.5
--- /var/tmp/postfix-3.7.3/man/man5/regexp_table.5 2021-06-12 20:34:28.000000000 -0400
+++ ./man/man5/regexp_table.5 2023-01-21 16:03:30.000000000 -0500
@@ -138,7 +138,8 @@
.nf
.ad
.fi
-The contents of a table may be specified in the table name.
+The contents of a table may be specified in the table name
+(Postfix 3.7 and later).
The basic syntax is:
.nf
diff -ur --new-file /var/tmp/postfix-3.7.3/proto/cidr_table ./proto/cidr_table
--- /var/tmp/postfix-3.7.3/proto/cidr_table 2021-12-22 17:49:37.000000000 -0500
+++ ./proto/cidr_table 2023-01-15 18:29:39.000000000 -0500
@@ -101,7 +101,8 @@
# INLINE SPECIFICATION
# .ad
# .fi
-# The contents of a table may be specified in the table name.
+# The contents of a table may be specified in the table name
+# (Postfix 3.7 and later).
# The basic syntax is:
#
# .nf
diff -ur --new-file /var/tmp/postfix-3.7.3/proto/pcre_table ./proto/pcre_table
--- /var/tmp/postfix-3.7.3/proto/pcre_table 2021-11-27 12:41:40.000000000 -0500
+++ ./proto/pcre_table 2023-01-15 18:29:39.000000000 -0500
@@ -165,7 +165,8 @@
# INLINE SPECIFICATION
# .ad
# .fi
-# The contents of a table may be specified in the table name.
+# The contents of a table may be specified in the table name
+# (Postfix 3.7 and later).
# The basic syntax is:
#
# .nf
diff -ur --new-file /var/tmp/postfix-3.7.3/proto/regexp_table ./proto/regexp_table
--- /var/tmp/postfix-3.7.3/proto/regexp_table 2021-06-10 17:30:58.000000000 -0400
+++ ./proto/regexp_table 2023-01-15 18:29:39.000000000 -0500
@@ -122,7 +122,8 @@
# INLINE SPECIFICATION
# .ad
# .fi
-# The contents of a table may be specified in the table name.
+# The contents of a table may be specified in the table name
+# (Postfix 3.7 and later).
# The basic syntax is:
#
# .nf
diff -ur --new-file /var/tmp/postfix-3.7.3/src/postscreen/postscreen.c ./src/postscreen/postscreen.c
--- /var/tmp/postfix-3.7.3/src/postscreen/postscreen.c 2021-02-21 10:33:05.000000000 -0500
+++ ./src/postscreen/postscreen.c 2023-01-21 16:17:28.000000000 -0500
@@ -1174,7 +1174,7 @@
0,
};
static const CONFIG_INT_TABLE int_table[] = {
- VAR_PSC_DNSBL_THRESH, DEF_PSC_DNSBL_THRESH, &var_psc_dnsbl_thresh, 0, 0,
+ VAR_PSC_DNSBL_THRESH, DEF_PSC_DNSBL_THRESH, &var_psc_dnsbl_thresh, 1, 0,
VAR_PSC_CMD_COUNT, DEF_PSC_CMD_COUNT, &var_psc_cmd_count, 1, 0,
VAR_SMTPD_CCONN_LIMIT, DEF_SMTPD_CCONN_LIMIT, &var_smtpd_cconn_limit, 0, 0,
0,
diff -ur --new-file /var/tmp/postfix-3.7.3/src/smtpd/smtpd_proxy.c ./src/smtpd/smtpd_proxy.c
--- /var/tmp/postfix-3.7.3/src/smtpd/smtpd_proxy.c 2015-01-29 08:40:49.000000000 -0500
+++ ./src/smtpd/smtpd_proxy.c 2022-12-11 16:43:50.000000000 -0500
@@ -388,7 +388,7 @@
*/
server_xforward_features = 0;
lines = STR(proxy->reply);
- while ((words = mystrtok(&lines, "\n")) != 0) {
+ while ((words = mystrtok(&lines, "\r\n")) != 0) {
if (mystrtok(&words, "- ") && (word = mystrtok(&words, " \t")) != 0) {
if (strcasecmp(word, XFORWARD_CMD) == 0)
while ((word = mystrtok(&words, " \t")) != 0)
diff -ur --new-file /var/tmp/postfix-3.7.3/src/tls/tls.h ./src/tls/tls.h
--- /var/tmp/postfix-3.7.3/src/tls/tls.h 2021-09-26 16:09:33.000000000 -0400
+++ ./src/tls/tls.h 2023-01-21 16:00:03.000000000 -0500
@@ -387,6 +387,13 @@
#define SSL_OP_NO_TLSv1_3 0L /* Noop */
#endif
+/*
+ * Always used when defined, SMTP has no truncation attacks.
+ */
+#ifndef SSL_OP_IGNORE_UNEXPECTED_EOF
+#define SSL_OP_IGNORE_UNEXPECTED_EOF 0L
+#endif
+
#define TLS_KNOWN_PROTOCOLS \
( TLS_PROTOCOL_SSLv2 | TLS_PROTOCOL_SSLv3 | TLS_PROTOCOL_TLSv1 \
| TLS_PROTOCOL_TLSv1_1 | TLS_PROTOCOL_TLSv1_2 | TLS_PROTOCOL_TLSv1_3 )
@@ -403,7 +410,8 @@
* just exposed via hex codes or named elements of tls_ssl_options.
*/
#define TLS_SSL_OP_MANAGED_BITS \
- (SSL_OP_CIPHER_SERVER_PREFERENCE | TLS_SSL_OP_PROTOMASK(~0))
+ (SSL_OP_CIPHER_SERVER_PREFERENCE | SSL_OP_IGNORE_UNEXPECTED_EOF | \
+ TLS_SSL_OP_PROTOMASK(~0))
extern int tls_proto_mask_lims(const char *, int *, int *);
@@ -647,6 +655,7 @@
/*
* tls_fprint.c
*/
+extern const EVP_MD *tls_digest_byname(const char *, EVP_MD_CTX **);
extern char *tls_digest_encode(const unsigned char *, int);
extern char *tls_cert_fprint(X509 *, const char *);
extern char *tls_pkey_fprint(X509 *, const char *);
diff -ur --new-file /var/tmp/postfix-3.7.3/src/tls/tls_client.c ./src/tls/tls_client.c
--- /var/tmp/postfix-3.7.3/src/tls/tls_client.c 2021-12-19 10:13:01.000000000 -0500
+++ ./src/tls/tls_client.c 2023-01-21 16:00:03.000000000 -0500
@@ -324,6 +324,7 @@
* checks are now performed internally in OpenSSL.
*/
if (SSL_get_verify_result(TLScontext->con) == X509_V_OK) {
+ TLScontext->peer_status |= TLS_CERT_FLAG_TRUSTED;
if (TLScontext->must_fail) {
msg_panic("%s: cert valid despite trust init failure",
TLScontext->namaddr);
@@ -352,8 +353,7 @@
TLScontext->namaddr, peername);
tls_dane_log(TLScontext);
}
- } else
- TLScontext->peer_status |= TLS_CERT_FLAG_TRUSTED;
+ }
}
/*
@@ -714,6 +714,15 @@
tls_dane_digest_init(client_ctx, fpt_alg);
/*
+ * Presently we use TLS only with SMTP where truncation attacks are not
+ * possible as a result of application framing. If we ever use TLS in
+ * some other application protocol where truncation could be relevant,
+ * we'd need to disable truncation detection conditionally, or explicitly
+ * clear the option in that code path.
+ */
+ off |= SSL_OP_IGNORE_UNEXPECTED_EOF;
+
+ /*
* Protocol selection is destination dependent, so we delay the protocol
* selection options to the per-session SSL object.
*/
diff -ur --new-file /var/tmp/postfix-3.7.3/src/tls/tls_dane.c ./src/tls/tls_dane.c
--- /var/tmp/postfix-3.7.3/src/tls/tls_dane.c 2021-10-25 09:35:24.000000000 -0400
+++ ./src/tls/tls_dane.c 2023-01-15 18:16:48.000000000 -0500
@@ -823,7 +823,7 @@
/* tls_dane_digest_init - configure supported DANE digests */
-void tls_dane_digest_init(SSL_CTX *ctx, const EVP_MD * fpt_alg)
+void tls_dane_digest_init(SSL_CTX *ctx, const EVP_MD *fpt_alg)
{
dane_mtype mtypes[256];
char *cp;
@@ -930,7 +930,7 @@
}
mtypes[codepoint].ord = ++ord;
- if ((mtypes[codepoint].alg = EVP_get_digestbyname(algname)) == 0) {
+ if ((mtypes[codepoint].alg = tls_digest_byname(algname, NULL)) == 0) {
msg_warn("%s: digest algorithm \"%s\"(%d) unknown",
VAR_TLS_DANE_DIGESTS, algname, codepoint);
continue;
@@ -1132,11 +1132,11 @@
case 0:
break;
case 1:
- if ((md = EVP_get_digestbyname(LN_sha256)) == 0)
+ if ((md = tls_digest_byname(LN_sha256, NULL)) == 0)
msg_fatal("Digest %s not found", LN_sha256);
break;
case 2:
- if ((md = EVP_get_digestbyname(LN_sha512)) == 0)
+ if ((md = tls_digest_byname(LN_sha512, NULL)) == 0)
msg_fatal("Digest %s not found", LN_sha512);
break;
default:
diff -ur --new-file /var/tmp/postfix-3.7.3/src/tls/tls_fprint.c ./src/tls/tls_fprint.c
--- /var/tmp/postfix-3.7.3/src/tls/tls_fprint.c 2021-12-19 18:26:44.000000000 -0500
+++ ./src/tls/tls_fprint.c 2023-01-15 18:27:50.000000000 -0500
@@ -6,6 +6,10 @@
/* SYNOPSIS
/* #include
/*
+/* EVP_MD *tls_digest_byname(const char *mdalg, EVP_MD_CTX **mdctxPtr)
+/* const char *mdalg;
+/* EVP_MD_CTX **mdctxPtr;
+/*
/* char *tls_serverid_digest(TLScontext, props, ciphers)
/* TLS_SESS_STATE *TLScontext;
/* const TLS_CLIENT_START_PROPS *props;
@@ -23,6 +27,13 @@
/* X509 *peercert;
/* const char *mdalg;
/* DESCRIPTION
+/* tls_digest_byname() constructs, and optionally returns, an EVP_MD_CTX
+/* handle for performing digest operations with the algorithm named by the
+/* mdalg parameter. The return value is non-null on success, and holds a
+/* digest algorithm handle. If the mdctxPtr argument is non-null the
+/* created context is returned to the caller, who is then responsible for
+/* deleting it by calling EVP_MD_ctx_free() once it is no longer needed.
+/*
/* tls_digest_encode() converts a binary message digest to a hex ASCII
/* format with ':' separators between each pair of hex digits.
/* The return value is dynamically allocated with mymalloc(),
@@ -50,6 +61,8 @@
/* free it with myfree().
/*
/* Arguments:
+/* .IP mdalg
+/* A digest algorithm name, such as "sha256".
/* .IP peercert
/* Server or client X.509 certificate.
/* .IP md_buf
@@ -60,6 +73,9 @@
/* Name of a message digest algorithm suitable for computing secure
/* (1st pre-image resistant) message digests of certificates. For now,
/* md5, sha1, or member of SHA-2 family if supported by OpenSSL.
+/* .IP mdctxPtr
+/* Pointer to an (EVP_MD_CTX *) handle, or NULL if only probing for
+/* algorithm support without immediate use in mind.
/* .IP buf
/* Input data for the message digest algorithm mdalg.
/* .IP len
@@ -114,7 +130,7 @@
static const char hexcodes[] = "0123456789ABCDEF";
-#define checkok(ret) (ok &= ((ret) ? 1 : 0))
+#define checkok(stillok) (ok = ok && (stillok))
#define digest_object(p) digest_data((unsigned char *)(p), sizeof(*(p)))
#define digest_data(p, l) checkok(digest_bytes(mdctx, (p), (l)))
#define digest_string(s) checkok(digest_chars(mdctx, (s)))
@@ -182,6 +198,44 @@
return (ok);
}
+/* tls_digest_byname - test availability or prepare to use digest */
+
+const EVP_MD *tls_digest_byname(const char *mdalg, EVP_MD_CTX **mdctxPtr)
+{
+ const EVP_MD *md;
+ EVP_MD_CTX *mdctx = NULL;
+ int ok = 1;
+
+ /*
+ * In OpenSSL 3.0, because of dynamically variable algorithm providers,
+ * there is a time-of-check/time-of-use issue that means that abstract
+ * algorithm handles returned by EVP_get_digestbyname() can (and not
+ * infrequently do) return ultimately unusable algorithms, to check for
+ * actual availability, one needs to use the new EVP_MD_fetch() API, or
+ * indirectly check usability by creating a concrete context. We take the
+ * latter approach here (works for 1.1.1 without #ifdef).
+ *
+ * Note that EVP_MD_CTX_{create,destroy} were renamed to, respectively,
+ * EVP_MD_CTX_{new,free} in OpenSSL 1.1.0.
+ */
+ checkok(md = EVP_get_digestbyname(mdalg));
+
+ /*
+ * Sanity check: Newer shared libraries could (hypothetical ABI break)
+ * allow larger digests, we avoid such poison algorithms.
+ */
+ checkok(EVP_MD_size(md) <= EVP_MAX_MD_SIZE);
+ checkok(mdctx = EVP_MD_CTX_new());
+ checkok(EVP_DigestInit_ex(mdctx, md, NULL));
+
+
+ if (ok && mdctxPtr != 0)
+ *mdctxPtr = mdctx;
+ else
+ EVP_MD_CTX_free(mdctx);
+ return (ok ? md : 0);
+}
+
/* tls_serverid_digest - suffix props->serverid with parameter digest */
char *tls_serverid_digest(TLS_SESS_STATE *TLScontext,
@@ -189,7 +243,6 @@
const char *ciphers)
{
EVP_MD_CTX *mdctx;
- const EVP_MD *md;
const char *mdalg;
unsigned char md_buf[EVP_MAX_MD_SIZE];
unsigned int md_len;
@@ -205,17 +258,17 @@
* default digest, but DANE requires sha256 and sha512, so if we must
* fall back to our default digest, DANE support won't be available. We
* panic if the fallback algorithm is not available, as it was verified
- * available in tls_client_init() and must not simply vanish.
+ * available in tls_client_init() and must not simply vanish. Our
+ * provider set is not expected to change once the OpenSSL library is
+ * initialized.
*/
- if ((md = EVP_get_digestbyname(mdalg = "sha256")) == 0
- && (md = EVP_get_digestbyname(mdalg = props->mdalg)) == 0)
- msg_panic("digest algorithm \"%s\" not found", mdalg);
+ if (tls_digest_byname(mdalg = LN_sha256, &mdctx) == 0
+ && tls_digest_byname(mdalg = props->mdalg, &mdctx) == 0)
+ msg_panic("digest algorithm \"%s\" not found", props->mdalg);
/* Salt the session lookup key with the OpenSSL runtime version. */
sslversion = OpenSSL_version_num();
- mdctx = EVP_MD_CTX_create();
- checkok(EVP_DigestInit_ex(mdctx, md, NULL));
digest_string(props->helo ? props->helo : "");
digest_object(&sslversion);
digest_string(props->protocols);
@@ -306,18 +359,15 @@
static char *tls_data_fprint(const unsigned char *buf, int len, const char *mdalg)
{
- EVP_MD_CTX *mdctx;
- const EVP_MD *md;
+ EVP_MD_CTX *mdctx = NULL;
unsigned char md_buf[EVP_MAX_MD_SIZE];
unsigned int md_len;
int ok = 1;
/* Previously available in "init" routine. */
- if ((md = EVP_get_digestbyname(mdalg)) == 0)
+ if (tls_digest_byname(mdalg, &mdctx) == 0)
msg_panic("digest algorithm \"%s\" not found", mdalg);
- mdctx = EVP_MD_CTX_create();
- checkok(EVP_DigestInit_ex(mdctx, md, NULL));
digest_data(buf, len);
checkok(EVP_DigestFinal_ex(mdctx, md_buf, &md_len));
EVP_MD_CTX_destroy(mdctx);
diff -ur --new-file /var/tmp/postfix-3.7.3/src/tls/tls_misc.c ./src/tls/tls_misc.c
--- /var/tmp/postfix-3.7.3/src/tls/tls_misc.c 2021-12-19 09:49:34.000000000 -0500
+++ ./src/tls/tls_misc.c 2023-01-15 18:16:48.000000000 -0500
@@ -1569,25 +1569,13 @@
const EVP_MD *tls_validate_digest(const char *dgst)
{
const EVP_MD *md_alg;
- unsigned int md_len;
/*
* If the administrator specifies an unsupported digest algorithm, fail
* now, rather than in the middle of a TLS handshake.
*/
- if ((md_alg = EVP_get_digestbyname(dgst)) == 0) {
+ if ((md_alg = tls_digest_byname(dgst, NULL)) == 0)
msg_warn("Digest algorithm \"%s\" not found", dgst);
- return (0);
- }
-
- /*
- * Sanity check: Newer shared libraries may use larger digests.
- */
- if ((md_len = EVP_MD_size(md_alg)) > EVP_MAX_MD_SIZE) {
- msg_warn("Digest algorithm \"%s\" output size %u too large",
- dgst, md_len);
- return (0);
- }
return md_alg;
}
diff -ur --new-file /var/tmp/postfix-3.7.3/src/tls/tls_server.c ./src/tls/tls_server.c
--- /var/tmp/postfix-3.7.3/src/tls/tls_server.c 2022-10-07 15:48:11.000000000 -0400
+++ ./src/tls/tls_server.c 2023-01-21 16:00:03.000000000 -0500
@@ -513,6 +513,15 @@
cachable = 0;
/*
+ * Presently we use TLS only with SMTP where truncation attacks are not
+ * possible as a result of application framing. If we ever use TLS in
+ * some other application protocol where truncation could be relevant,
+ * we'd need to disable truncation detection conditionally, or explicitly
+ * clear the option in that code path.
+ */
+ off |= SSL_OP_IGNORE_UNEXPECTED_EOF;
+
+ /*
* Protocol work-arounds, OpenSSL version dependent.
*/
off |= tls_bug_bits();
diff -ur --new-file /var/tmp/postfix-3.7.3/src/util/dict_cache.c ./src/util/dict_cache.c
--- /var/tmp/postfix-3.7.3/src/util/dict_cache.c 2021-12-19 09:48:41.000000000 -0500
+++ ./src/util/dict_cache.c 2023-01-03 08:07:54.000000000 -0500
@@ -659,8 +659,8 @@
/*
* Destroy the DICT_CACHE object.
*/
- myfree(cp->name);
dict_cache_control(cp, DICT_CACHE_CTL_INTERVAL, 0, DICT_CACHE_CTL_END);
+ myfree(cp->name);
dict_close(cp->db);
if (cp->saved_curr_key)
myfree(cp->saved_curr_key);
diff -ur --new-file /var/tmp/postfix-3.7.3/src/util/sys_defs.h ./src/util/sys_defs.h
--- /var/tmp/postfix-3.7.3/src/util/sys_defs.h 2021-12-05 13:59:27.000000000 -0500
+++ ./src/util/sys_defs.h 2022-12-01 19:27:27.000000000 -0500
@@ -751,7 +751,8 @@
/*
* LINUX.
*/
-#if defined(LINUX2) || defined(LINUX3) || defined(LINUX4) || defined(LINUX5)
+#if defined(LINUX2) || defined(LINUX3) || defined(LINUX4) || defined(LINUX5) \
+ || defined(LINUX6)
#define SUPPORTED
#define UINT32_TYPE unsigned int
#define UINT16_TYPE unsigned short