From: Wietse Venema
Date: Sun, 13 Jun 2021 05:00:00 +0000 (-0500)
Subject: postfix-3.6.1
X-Git-Tag: v3.6.1^0
X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d4a4c518ae152be92416f629d3ec9526ed207a6a;p=thirdparty%2Fpostfix.git
postfix-3.6.1
---
diff --git a/postfix/HISTORY b/postfix/HISTORY
index 3b6756665..9af1d27f4 100644
--- a/postfix/HISTORY
+++ b/postfix/HISTORY
@@ -25557,3 +25557,17 @@ Apologies for any names omitted.
20210428
Documentation: update by Paul Menzel. File: proto/SASL_README.html.
+
+20210601
+
+ Bugfix (introduced: Postfix 2.11): the command "postmap
+ lmdb:/file/name" handled duplicate keys ungracefully,
+ discarding entries stored up to and including the duplicate
+ key, and causing a double free() call with lmdb versions
+ 0.9.17 and later. Reported by Adi Prasaja; double free()
+ root cause analysis by Howard Chu. File: util/slmdb.c.
+
+20210609
+
+ Typo (introduced: Postfix 3.4): silent_discard should be
+ silent-discard. File: proto/BDAT_README.html.
diff --git a/postfix/README_FILES/BDAT_README b/postfix/README_FILES/BDAT_README
index 2dc1df35c..124880409 100644
--- a/postfix/README_FILES/BDAT_README
+++ b/postfix/README_FILES/BDAT_README
@@ -23,7 +23,7 @@ BDAT support is enabled by default. To disable BDAT support globally:
# The logging alternative:
smtpd_discard_ehlo_keywords = chunking
# The non-logging alternative:
- smtpd_discard_ehlo_keywords = chunking, silent_discard
+ smtpd_discard_ehlo_keywords = chunking, silent-discard
Specify '-o smtpd_discard_ehlo_keywords=' in master.cf for the submission and
smtps services, if you have clients that benefit from CHUNKING support.
diff --git a/postfix/html/BDAT_README.html b/postfix/html/BDAT_README.html
index e96fe9348..cb9775541 100644
--- a/postfix/html/BDAT_README.html
+++ b/postfix/html/BDAT_README.html
@@ -51,7 +51,7 @@ globally:
# The logging alternative:
smtpd_discard_ehlo_keywords = chunking
# The non-logging alternative:
- smtpd_discard_ehlo_keywords = chunking, silent_discard
+ smtpd_discard_ehlo_keywords = chunking, silent-discard
diff --git a/postfix/proto/BDAT_README.html b/postfix/proto/BDAT_README.html
index ace54928f..85adeac00 100644
--- a/postfix/proto/BDAT_README.html
+++ b/postfix/proto/BDAT_README.html
@@ -51,7 +51,7 @@ globally:
# The logging alternative:
smtpd_discard_ehlo_keywords = chunking
# The non-logging alternative:
- smtpd_discard_ehlo_keywords = chunking, silent_discard
+ smtpd_discard_ehlo_keywords = chunking, silent-discard
diff --git a/postfix/src/global/mail_version.h b/postfix/src/global/mail_version.h
index 979123038..85e836abc 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 "20210429"
-#define MAIL_VERSION_NUMBER "3.6.0"
+#define MAIL_RELEASE_DATE "20210613"
+#define MAIL_VERSION_NUMBER "3.6.1"
#ifdef SNAPSHOT
#define MAIL_VERSION_DATE "-" MAIL_RELEASE_DATE
diff --git a/postfix/src/util/slmdb.c b/postfix/src/util/slmdb.c
index cee054619..823d94033 100644
--- a/postfix/src/util/slmdb.c
+++ b/postfix/src/util/slmdb.c
@@ -386,12 +386,16 @@ static int slmdb_prepare(SLMDB *slmdb)
* - With a bulk-mode transaction we commit when the database is closed.
*/
if (slmdb->open_flags & O_TRUNC) {
- if ((status = mdb_drop(slmdb->txn, slmdb->dbi, 0)) != 0)
+ if ((status = mdb_drop(slmdb->txn, slmdb->dbi, 0)) != 0) {
+ mdb_txn_abort(slmdb->txn);
+ slmdb->txn = 0;
return (status);
+ }
if ((slmdb->slmdb_flags & SLMDB_FLAG_BULK) == 0) {
- if ((status = mdb_txn_commit(slmdb->txn)) != 0)
- return (status);
+ status = mdb_txn_commit(slmdb->txn);
slmdb->txn = 0;
+ if (status != 0)
+ return (status);
}
} else if ((slmdb->lmdb_flags & MDB_RDONLY) != 0
|| (slmdb->slmdb_flags & SLMDB_FLAG_BULK) == 0) {
@@ -582,11 +586,15 @@ int slmdb_put(SLMDB *slmdb, MDB_val *mdb_key,
* Do the update.
*/
if ((status = mdb_put(txn, slmdb->dbi, mdb_key, mdb_value, flags)) != 0) {
- mdb_txn_abort(txn);
if (status != MDB_KEYEXIST) {
+ mdb_txn_abort(txn);
if ((status = slmdb_recover(slmdb, status)) == 0)
status = slmdb_put(slmdb, mdb_key, mdb_value, flags);
SLMDB_API_RETURN(slmdb, status);
+ } else {
+ /* Abort non-bulk transaction only. */
+ if (slmdb->txn == 0)
+ mdb_txn_abort(txn);
}
}