]> git.ipfire.org Git - thirdparty/postfix.git/commitdiff
postfix-2.11.0-RC1 v2.11.0-RC1
authorWietse Venema <wietse@porcupine.org>
Sun, 5 Jan 2014 05:00:00 +0000 (00:00 -0500)
committerViktor Dukhovni <postfix-users@dukhovni.org>
Mon, 6 Jan 2014 02:55:16 +0000 (21:55 -0500)
28 files changed:
postfix/README_FILES/AAAREADME
postfix/README_FILES/ADDRESS_VERIFICATION_README
postfix/README_FILES/LMDB_README
postfix/README_FILES/POSTSCREEN_README
postfix/RELEASE_NOTES
postfix/WISHLIST [deleted file]
postfix/conf/postfix-files
postfix/html/ADDRESS_VERIFICATION_README.html
postfix/html/LMDB_README.html
postfix/html/POSTSCREEN_README.html
postfix/html/index.html
postfix/html/lmdb_table.5.html
postfix/html/postconf.5.html
postfix/html/postfix-manuals.html
postfix/html/postfix.1.html
postfix/makedefs
postfix/man/man1/postfix.1
postfix/man/man5/lmdb_table.5
postfix/man/man5/postconf.5
postfix/proto/ADDRESS_VERIFICATION_README.html
postfix/proto/LMDB_README.html
postfix/proto/POSTSCREEN_README.html
postfix/proto/lmdb_table
postfix/proto/postconf.proto
postfix/src/global/mail_version.h
postfix/src/postfix/postfix.c
postfix/src/util/lmdb_cache_test.sh [new file with mode: 0644]
postfix/src/util/slmdb.c

index ad05cfe1321ef3d03a0cc1b1c6c9803e1d84441c..f21edd9f8d95f25550a7cba26e61dc2731f8aafb 100644 (file)
@@ -48,7 +48,6 @@ L\bLo\boo\bok\bku\bup\bp t\bta\bab\bbl\ble\bes\bs (\b(d\bda\bat\bta\bab\bba\bas\bse\bes\bs)\b)
   * DB_README: Berkeley DB Howto
   * CDB_README: CDB Howto
   * LDAP_README: LDAP Howto
-  * LMDB_README: LMDB Howto
   * MEMCACHE_README: Memcache Howto
   * MYSQL_README: MySQL Howto
   * PCRE_README: PCRE Howto
index 7aef096dd97b6218c1bd9099a00bcf6ca4d5464a..84194896600111feb0b66766b122b94e1cd45878 100644 (file)
@@ -297,6 +297,7 @@ results are lost after "postfix reload" or "postfix stop".
     /etc/postfix/main.cf:
         address_verify_map = btree:$data_directory/verify_cache
 
+    # (Not supported in the stable Postfix release)
     # Example 2: Shared persistent lmdb: cache (Postfix 2.11 or later).
     # Disable automatic cache cleanup in all Postfix instances except
     # for one instance that will be responsible for cache cleanup.
index 2ce6b726d2c0b3497d2af61239118d9786ce45d5..851621710a1b3f2780006b5f4e9d0d9ebb4d8b9f 100644 (file)
@@ -2,6 +2,13 @@ P\bPo\bos\bst\btf\bfi\bix\bx O\bOp\bpe\ben\bnL\bLD\bDA\bAP\bP L\bLM\bMD\bDB\bB H\bHo\bow\bwt\bto\bo
 
 -------------------------------------------------------------------------------
 
+N\bNo\bot\bte\be
+
+LMDB is not supported in the stable Postfix release. It will spontaneously
+terminate a Postfix daemon process without allowing Postfix to 1) report the
+problem to the maillog file, and to 2) provide reduced service where this is
+appropriate.
+
 I\bIn\bnt\btr\bro\bod\bdu\buc\bct\bti\bio\bon\bn
 
 Postfix uses databases of various kinds to store and look up information.
@@ -72,7 +79,7 @@ N\bNo\bon\bn-\b-o\bob\bbv\bvi\bio\bou\bus\bs r\bre\bec\bco\bov\bve\ber\bry\by w\bwi\bit\bth\bh p\bpo\bos\b
 c\bco\bor\brr\bru\bup\bpt\bte\bed\bd d\bda\bat\bta\bab\bba\bas\bse\be.\b.
 
 Problem:
-    A corrupted LMDB database cann't be rebuilt simply by re-running postmap(1)
+    A corrupted LMDB database can't be rebuilt simply by re-running postmap(1)
     or postalias(1), or by waiting until a tlsmgr(8) daemon restarts. This
     problem does not exist with other Postfix databases.
 
index 1ca03a5c94753e9e1ce22b8bfeb6576e05de1187..78d7a8f7bb4f6d98599186796d7e7d0bd890ee67 100644 (file)
@@ -766,12 +766,12 @@ By default, the temporary whitelist is not shared between multiple postscreen
             memcache = inet:127.0.0.1:11211
             key_format = postscreen:%s
 
-  * A persistent lmdb: temporary whitelist can be shared between postscreen(8)
-    daemons that run under the same master(8) daemon, or under different master
-    (8) daemons on the same host. Disable cache cleanup
-    (postscreen_cache_cleanup_interval = 0) in all postscreen(8) daemons except
-    one that is responsible for cache cleanup. This requires Postfix 2.11 or
-    later.
+  * (Not supported in the stable Postfix release) A persistent lmdb: temporary
+    whitelist can be shared between postscreen(8) daemons that run under the
+    same master(8) daemon, or under different master(8) daemons on the same
+    host. Disable cache cleanup (postscreen_cache_cleanup_interval = 0) in all
+    postscreen(8) daemons except one that is responsible for cache cleanup.
+    This requires Postfix 2.11 or later.
 
         # Example 2: persistent lmdb: whitelist.
         /etc/postfix/main.cf:
index 23fef36bd85960c92be242d009f85ec513297f0b..4931a94e7b8516939e2ccadf2699c9b87d83c21c 100644 (file)
@@ -1,12 +1,10 @@
-This is the Postfix 2.11 (experimental) branch.
-
-The stable Postfix release is called postfix-2.10.x where 2=major
-release number, 10=minor release number, x=patchlevel.  The stable
+The stable Postfix release is called postfix-2.11.x where 2=major
+release number, 11=minor release number, x=patchlevel.  The stable
 release never changes except for patches that address bugs or
 emergencies. Patches change the patchlevel and the release date.
 
 New features are developed in snapshot releases. These are called
-postfix-2.11-yyyymmdd where yyyymmdd is the release date (yyyy=year,
+postfix-2.12-yyyymmdd where yyyymmdd is the release date (yyyy=year,
 mm=month, dd=day).  Patches are never issued for snapshot releases;
 instead, a new snapshot is released.
 
@@ -16,20 +14,111 @@ specifies the release date of a stable release or snapshot release.
 If you upgrade from Postfix 2.9 or earlier, read RELEASE_NOTES-2.10
 before proceeding.
 
-Incompatible changes with snapshot 20131217
-===========================================
+Major changes - tls
+-------------------
+
+[Documentation 20131218] The new FORWARD_SECRECY_README document
+conveniently presents all information about Postfix "perfect" forward
+secrecy support in one place: what forward secrecy is, how to tweak
+settings, and what you can expect to see when Postfix uses ciphers
+with forward secrecy.
+
+[Feature 20130602] Support for PKI-less TLS server certificate
+verification, where the CA public key or the server certificate is
+identified via DNSSEC lookup.
+
+This feature introduces a new TLS security level called "dane"
+(DNS-based Authentication of Named Entities) that uses DNSSEC to
+look up CA information for a server TLS certificate.  The details
+of DANE core protocols are still evolving, as are the details of
+how DANE should be used in the context of SMTP. Postfix implements
+what appears to be a "rational" subset of the DANE profiles.
 
-The master_service_disable syntax has changed: use "service/type"
-instead of "service.type".  The new form is consistent with master.cf
-parameter namespaces.  The old form is still supported to avoid
-breaking existing configurations.
+The problem with PKI is that there are literally hundreds of
+organizations world-wide that can provide a certificate in anyone's
+name. There have been widely-published incidents in recent history
+where a certificate authority gave out an inappropriate certificate
+(e.g., a certificate in the name of Microsoft to someone who did
+not represent Microsoft), where a CA was compromised (e.g., DigiNotar,
+Comodo), or where a CA made operational mistakes (e.g., TURKTRUST).
+Another concern is that a legitimate CA might be coerced to provide
+a certificate that allows its government to play man-in-the-middle
+on TLS traffic and observe the plaintext.
 
-Major changes with with snapshot 20131217
-=========================================
+Major changes - postscreen whitelisting
+---------------------------------------
 
-Support for advanced master.cf query and update operations.  This
-was implemented primarily to support automated system management
-tools.
+[Feature 20130512] Allow an SMTP client to skip postscreen(8) tests
+based on its postscreen_dnsbl_sites score.
+
+Specify a negative "postscreen_dnsbl_whitelist_threshold" to enable
+this feature.  When a client passes the threshold value without
+having failed other tests, all pending or disabled tests are flagged
+as completed.
+
+Major changes - recipient_delimiter
+-----------------------------------
+
+[Feature 20130405] The recipient_delimiter parameter can now specify
+a set of characters.  A user name is now separated from its address
+extension by the first character that matches the recipient_delimiter
+set.
+
+For example, specify "recipient_delimiter = +-" to support both the
+Postfix-style "+" and the qmail-style "-" extension delimiter.  
+
+As before, this implementation recognizes one delimiter character
+per email address, and one address extension per email address.
+
+Major changes - smtpd access control
+------------------------------------
+
+[Feature 20131031] The check_sasl_access feature can be used to
+block hijacked logins. Like other check_mumble_acces features it
+queries a lookup table (in this case with the SASL login name), and
+it supports the same actions as any Postfix access(5) table.
+
+[Feature 20130924] The reject_known_sender_login_mismatch feature
+applies reject_sender_login_mismatch only to MAIL FROM addresses
+that are known in $smtpd_sender_login_maps.
+
+Major changes - MacOS X
+-----------------------
+
+[Feature 20130325] Full support for kqueue() event handling which
+scales better with large numbers of file handles, plus a workaround
+for timeout handling on file handles (such as /dev/urandom) that
+still do not correctly support poll().
+
+Major changes - master
+----------------------
+
+[Incompat 20131217] The master_service_disable parameter value
+syntax has changed: use "service/type" instead of "service.type".
+The new form is consistent with postconf(1) namespaces for master.cf.
+The old form is still supported to avoid breaking existing
+configurations.
+
+Major changes - milter
+----------------------
+
+[Feature 20131126] Support for ESMTP parameters NOTIFY and ORCPT
+in the SMFIR_ADDRCPT_PAR (add recipient) request. Credits: Andrew
+Ayer.
+
+Major changes - mysql
+---------------------
+
+[Feature 20131117] MySQL client support for option_file, option_group,
+tls_cert_file, tls_key_file, tls_CAfile, tls_CApath, tls_verify_cert.
+Credits: Gareth Palmer.
+
+Major changes - postconf
+------------------------
+
+[Feature 20131217] Support for advanced master.cf query and update
+operations.  This was implemented primarily to support automated
+system management tools.
 
 The goal is to make all Postfix master.cf details accessible as
 lists of "name=value" pairs, where the names are organized into
@@ -165,105 +254,3 @@ As with main.cf, there is no support to "undo" master.cf changes
 that are made with -X or -#.
 
 Again, always execute "postfix reload" after updating master.cf.
-
-Major changes with snapshot 20131031
-====================================
-
-LMDB support is enabled after changes to LMDB lock management.  This
-includes creating databases with postmap(1) and postalias(1);
-read/write access by postscreen(8), proxymap(8), verify(8), and
-tlsmgr(8); and database sharing between privileged writer processes
-and unprivileged reader processes without world-writable files.
-
-Major changes with snapshot 20130929
-====================================
-
-Support to create LMDB databases is no longer available for the
-postmap(1) and postalias(1) commands.  Instead, consider using cdb:
-to manage root-owned databases under the root-owned config_directory
-(default: /etc/postfix) such as access(5), virtual(5), transport(5).
-
-The reason is that LMDB applications require write access even when
-the application itself is read-only. This violates the principle
-of least privilege, and causes all kinds of problems when a non-root
-process needs to query a root-owned database.
-
-Support to create LMDB databases is available only for unprivileged
-Postfix daemon processes such as postscreen(8), tlsmgr(8) and
-verify(8) that manage postfix-owned databases under the postfix-owned
-data_directory (default: /var/lib/postfix).
-
-Major changes with snapshot 20130927
-====================================
-
-Postfix now handles LMDB "database full" errors automatically. When
-a database becomes full, its size limit is doubled, and other
-processes automatically pick up the new size limit. The lmdb_map_size
-parameter is now mostly irrelevant, and may be removed in the future.
-
-Major changes with snapshot 20130602
-====================================
-
-Support for PKI-less TLS server certificate verification, where the
-CA public key is identified via DNSSEC lookup. 
-
-This feature introduces a new TLS security level called "dane"
-(DNS-based Authentication of Named Entities) that uses DNSSEC to
-look up CA information for a server TLS certificate.  The details
-of DANE core protocols are still evolving, as are the details of
-how DANE should be used in the context of SMTP. Postfix implements
-what appears to be a "rational" subset of the DANE profiles.
-
-The problem with PKI is that there are literally hundreds of
-organizations world-wide that can provide a certificate in anyone's
-name. There have been widely-published incidents in recent history
-where a certificate authority gave out an inappropriate certificate
-(e.g., a certificate in the name of Microsoft to someone who did
-not represent Microsoft), where a CA was compromised (e.g., DigiNotar,
-Comodo), or where a CA made operational mistakes (e.g., TURKTRUST).
-Another concern is that a legitimate CA might be coerced to provide
-a certificate that allows its government to play man-in-the-middle
-on TLS traffic and observe the plaintext.
-
-Major changes with snapshot 20130512
-====================================
-
-Allow an SMTP client to skip postscreen(8) tests based on its
-postscreen_dnsbl_sites score. 
-
-Specify a negative "postscreen_dnsbl_whitelist_threshold" to enable
-this feature.  When a client passes the threshold value without
-having failed other tests, all pending or disabled tests are flagged
-as completed.
-
-Major changes with snapshot 20130405
-====================================
-
-The recipient_delimiter parameter can now specify a set of characters.
-A user name is now separated from its address extension by the first
-character that matches the recipient_delimiter set.
-
-For example, specify "recipient_delimiter = +-" to support both the
-Postfix-style "+" and the qmail-style "-" extension delimiter.  
-
-As before, this implementation recognizes one delimiter character
-per email address, and one address extension per email address.
-
-Major changes with snapshot 20130319
-====================================
-
-Postfix support for LMDB databases is suspended due to the existence
-of a hard limit (an "out of storage" failure mode that cannot be
-resolved by increasing the database size).
-
-Postfix may support LMDB again when it no longer limits the size
-of Postfix transactions, whether the limit is built into LMDB itself,
-or implicit by requiring an unbounded amount of memory to handle a
-large transaction.
-
-Major changes with snapshot 20130315
-====================================
-
-LMDB support by Howard Chu. This implementation has unexpected
-failure modes that don't exist with other Postfix databases, so
-don't just yet abandon CDB. See LMDB_README for details.
diff --git a/postfix/WISHLIST b/postfix/WISHLIST
deleted file mode 100644 (file)
index 6ec5623..0000000
+++ /dev/null
@@ -1,864 +0,0 @@
-Wish list:
-
-       To un-break "make tests" under src/smtpd, make tests
-       independent from the DNS and native routines for host
-       name/address lookup.
-
-       Incorporate 3rd-party code such as dynamic_maps.
-
-       Support 3rd-party extension with /etc/postfix/postfix-files.d
-
-       Make been_here flag BH_FLAG_FOLD configurable for masochists.
-
-       Replace some redundant TLS_README sections with pointers
-       to FORWARD_SECRECY_README.
-
-       Move html/index.html source to proto/.
-
-       Preserve case in smtpd_resolve_addr() and add a structure
-       member for the case-folded address.
-
-       Per SASL account rate limits. This requires new infrastructure
-       that maintains stats by SASL account.
-
-       Watchdog timer to postmap/postalias.
-
-       Things to do before the stable release:
-
-       Spell-check, double-word check, and HTML validator check.
-
-       Discourage the use of "after 220" tests in POSTSCREEN_README
-       and the documentation of individual parameter settings.
-
-       Remove this file from the stable release.
-
-       Things to do after the stable release:
-
-       Begin code revision, after DANE support stabilizes.  This
-       should be one pass that changes only names and no code.
-
-       recipient_delimiters = $recipient_delimiter for BC
-
-       All source code must specify its original author and
-       license statement. Some code modules specify Lutz Jaenicke
-       as the original author and fall under his liberal license.
-       Code that is added to such a module has the same license
-       (or at least something that is not more restrictive). Code
-       modules without input from Lutz Jaenicke must state its
-       original author and license (preferably no more restrictive
-       than Postfix's own license). Currently, too many files list
-       Wietse as the original author, and Lutz Jaenicke's license,
-       which is wrong.
-
-       Code clarity: replace obscure macro/function names: for
-       example SMTP_X(XXX) -> VAR_SMTP(XXX), as the purpose is to
-       choose between VAR_SMTP_XXX or VAR_LMTP_XXX; replace
-       digestpl() etc. with names that make clear what operation
-       is being performed (in this case, update a digest with the
-       contents of a buffer with the specified length). Replace r
-       with res_opt, ditto for other 1-letter names.
-
-       We have smtp_host_lookup, smtp_dns_resolver_options, and
-       now smtp_dns_support_level.  Of these, smtp_dns_resolver_options
-       is orthogonal but the rest has overlap.
-
-       There needs to be support for automatic migration from the
-       deprecated disable_dns_lookups feature to the preferred
-       smtp_dns_support_level feature. This support needs to exist
-       for several releases before the deprecated feature can be
-       removed.
-
-       End code revision, after DANE support stabilizes.
-
-       It would be nice if the result from one table lookup could
-       serve as input for another (e.g. virtual aliases before the
-       list of valid recipients). For this to work the magical
-       (bare user, domain only, etc.) lookups need to become a
-       table property, not a property of the client context.
-
-       It would be nice if "bare username" lookup is not hard-coded
-       for domains in the local address class.
-
-       Don't forget Apple's code donation for fetching mail from
-       IMAP server.
-
-       Should postconf -o refuse to work without the -x option?
-
-       Make 30s caching (feature 20070414) configurable, such that
-       0 means no caching.
-
-       Make errno white/blacklist for getpwnam_r etc. and mailbox
-       write errors.
-
-       smtpd_muble_restrictions rule names are case-insensitive.
-       restriction_classes values are case-sensitive but should
-       be case-insensitive for consistency with smtpd_muble_restrictions.
-
-       Make "rename" the default when postmapping a DB file
-       (later: use copy+rename for postmap -i, postmap -d).
-
-       Service-name parameters aren't documented in daemon manpages.
-
-       When faking up the DSN ORCPT, don't send bare usernames
-       from local command-line submission.
-
-       lmtp_assume_final is broken. A 2XX response does not imply
-       final delivery. The Sieve language implements accept-then-bounce.
-
-       postscreen event-driven plug-in interface to send out a
-       query in parallel with the Pregreet and DNSBL tests, using
-       a simplified version of the policy delegation protocol.
-
-       Parallelized queue preprocessing: rip out the queue manager
-       code to read queue files and resolve recipients, and run
-       it in parallel processes. The queue manager then processes
-       their results as they become available.  This would eliminate
-       the qmgr<->trivial-rewrite bottleneck. This can also eliminate
-       much of the scheduling disadvantage of a single queue manager
-       compared to hundreds of mail receiving or sending processes
-       (especially if there is a way to scan the queue in parallel).
-
-       Memory pools for same-type memory objects.  This can be
-       used to either increase memory locality for frequently-allocated
-       objects (MRU allocation) or to make use-after-free bugs
-       more detectable (use LRU allocation and wipe the object
-       immediately after free().  Finally, same-type memory pools
-       prevent object type errors with use-after-free bugs.
-
-       "no-cache" option for selected postscreen tests?
-
-       Need a new DICT flag to indicate that a map handle supports
-       locking.  If it doesn't (as with memcache or proxymap
-       handles), then postscreen etc. don't need to close a cache
-       file after "postfix reload".  After a fork() it is OK to
-       keep using a memcache or proxymap handle, because the parent
-       exits immediately.  For this to work, the memcache client
-       needs to propagate the flag from a persistent backup map,
-       but the proxymap protocol should not propagate this to the
-       client.
-
-       Different TTL values for different DNSBL sources?
-
-       Replace master(8) SIGHUP by very simple socket protocol to
-       allow reload of a specific service.
-
-       postscreen: in the dummy SMTP engine, log the protocol state
-       at time of violation (like smtpd, set state->where initially
-       to CONNECT, then update it with the name of the last "known"
-       command, or set it to "unimplemented").
-
-       The discussion of postscreen cache configuration is in the
-       wrong place (how whitelisting works). Move it to the section
-       about configuring postscreen.
-
-       Before proxymap can be exposed to the network (primarily
-       to share postscreen or verify caches), need to enforce
-       limits on attribute string name and value length in IPC
-       protocols.  10-20KB seems OK. We need to enforce content
-       sanity checks (for example, no control characters; Postfix
-       does not pass around multi-line data in table lookups). The
-       VSTREAM library already supports read/write deadlines.  We
-       need to use attack-resistant code for numeric conversion.
-
-       move flush_init() etc. from defer service clients to the
-       bounce daemon? Postfix works best when work can be spread
-       out over many clients, instead of over a few servers.
-
-       multi_connect() function that takes a list of inet:host:port
-       and/or unix:pathname specs, with an explicit "inet" prefix
-       argument to handle applications that use host:port only.
-       This will simplify multi-host implementation for memcache
-       client, dovecot client, and other.
-
-       dict_memcache: treat "bad" key as cache miss, i.e.  read/write
-       the backup database as if the cache did not exist. This
-       does not help because most Postfix maps (virtual, canonical,
-       access, transport, ...) also don't support spaces in keys.
-
-       postscreen: keep the cache open after "postfix reload" when
-       it is remote (type memcache: or proxy:). This does not work
-       because memcache can use a non-proxied file as backup).
-
-       What is the feasibility of adding an mta_name (personality)
-       attribute that is propagated via queue files and delivery
-       agent requests? It would default to myhostname.
-
-       Major performance improvement opportunity (that is until
-       everyone runs Postfix queues on SSDs).  Investigate the
-       viability of a daemon that produces incoming and postdrop
-       queue files on request (in reality it would maintain a
-       limited queue of "spare" files). Central queue file allocation
-       reduces the I/O performance disadvantage that qmgr has when
-       100 smtpd processes are receiving mail, or when lots of
-       mail is submitted with the sendmail command line.  When an
-       smtpd process accepts MAIL FROM, a cleanup daemon requests
-       a queue file and receives a queue ID + file handle from the
-       queue file daemon.  If the queue file daemon is down, the
-       cleanup daemon creates the file itself like it does now;
-       this can be hidden in the mail_stream library module.  If
-       the mail transaction is aborted, then the cleanup daemon
-       gives the queue file back to the queue file daemon's "spare"
-       file pool, saving most of the overhead of creating and
-       deleting a queue file (the file would still need to be
-       renamed at the start of the next mail transaction).  If the
-       cleanup daemon is unable to give a file back, then it can
-       delete the file like it does now; this can be hidden in the
-       mail_stream library module.  The whole thing can be
-       transparently added to Postfix by adding calls to a
-       queue-file-service client to the mail_queue_enter() and
-       mail_queue_remove() library routines.  Other advantages:
-       1) negligible performance hit when queue file allocation
-       happens earlier, so that logging and milters have a queue
-       ID for the whole transaction not just the first valid
-       recipient; 2) by not removing every queue files we get most
-       of the performance gain of a queue based on append/truncate
-       instead of the much more expensive create/delete.
-
-       Investigate viability of Sendmail dns maps.
-
-       Check if FILTER_README has the "postsuper -r" workaround
-
-       Bounces without <> in the plaintext section. Apparently,
-       some software renders the text as HTML (and therefore 
-       does not render addresses and other text inside <> ).
-
-       Make the rules for how to use close-on-exec more explicit.
-
-       Provide separate timeout control for dict_proxy client,
-       rewrite client, resolve client, cleanup client, and so on.
-       Perhaps a timeout argument to the mail_connect() routines.
-
-       Trick from amavisd: save listen socket/fifo/etc state, clear
-       their close-on-exec flags, exec the same program file to
-       re-initialize (with saved socket state on command line or
-       in environment), then restore the listen socket/fifo/etc
-       close-on-exec flags.  This could be a way to mitigate the
-       impact of memory/file leaks, and to implement "postfix
-       reload" support for master(8) features that currently don't
-       support this. 
-
-       Sub-second time resolution. The first benefit is to make
-       per-destination rate delays more usable. Other applications
-       will come up once the support exists. The straightforward
-       approach is to represent all time intervals in milliseconds,
-       and to update all code that makes system calls with a time
-       argument (as well as the compiled-in upper and lower time
-       parameter bounds, which are currently in seconds).
-       Unfortunately, that limits he maximum time interval to less
-       than 25 days on 32-bit systems, and is likely to break
-       compatibility (for starters, it cannot even deal with the
-       compiled-in 100d upper bound on the queue file lifetime).
-       A second option is to have a "compatibility" time base
-       switch between milliseconds and seconds; this means extra
-       changes to all code that makes system calls with a time
-       argument, and the way that the compiled-in upper and lower
-       bounds are specified.  Some of this can be encapsulated in
-       macros like time_to_sec(t), time_to_msec(t) and sec_to_time(t).
-       Finally, it is relatively easy to replace the events(3)
-       interface to use "double" for the time delay arguments, but
-       it is a major pain to convert all main.cf time parameters
-       into doubles (converting only some leads to a documentation
-       nightmare).
-
-       Address verify cache: allow a negative cache "refresh"
-       result to purge a "positive" cache entry in some safe manner.
-       Currently, the negative cache "refresh" result is discarded,
-       address verify cache lookup returns OK, and each lookup
-       forces a "refresh" probe until the entry expires.
-
-       Some Sendmail configurations trigger sub-optimal behavior
-       when the postscreen_whitelist_interfaces parameter lists
-       primary MX addresses only.  When postscreen's "deep protocol
-       tests" are successful on the primary MX address (i.e. they
-       result in 4XX responses to RCPT TO), some Sendmail
-       configurations keep the primary MX connection open until
-       AFTER they finish talking to the backup MX address.  The
-       problem is that the backup connection runs into a WHITELIST
-       VETO condition because the whitelisting database has not
-       yet been updated with the PASS NEW result for the primary
-       MX connection.  Unfortunately postscreen can't update the
-       whitelisting database before the primary MX connection is
-       closed, because a client may still make a mistake.
-
-       Simplify postscreen logic. Individual "fail" flags help to
-       avoid repeated testing/logging the same mistake.  Individual
-       "pass" flags provide evidence that the client didn't skip
-       tests by hanging up early. The current global "noforward"
-       flag implements the wrong model: instead we need an indicator
-       that a client has passed all tests or that all mistakes
-       were forgiven.
-
-       In the SMTP server, check if the connection is closed before
-       replying to ".", and discard the message if the reply can't
-       be sent. This reduces the time window for RFC 1047 message
-       duplication, and may even prevent the delivery of some spam.
-       http://www.exim.org/lurker/message/20070416.103159.9d5ff0ce.en.html
-       This requires splitting the SMTP server's commit operation
-       into two operations: first, a tentative commit operation
-       that performs most of the I/O and processing in milters and
-       in the cleanup server; second, a final commit operation
-       that is executed only if the remote SMTP client hasn't hung
-       up in the mean time. Unfortunately, SMTP-based before-queue
-       content filters don't support a tentative commit operation.
-
-       Find out how to reproduce Berkeley DB bogus ENOENT errors.
-       postscreen does not log this with Berkeley DB 1 (FreeBSD
-       4..8), 4.7.25 (Ubuntu 9.04) and 4.8.24 (Ubuntu 10.04).
-
-       postconf command-line option to show the compile-time
-       settings (CCARGS, AUXLIBS) in case binary packages
-       don't install the makedefs.out file.
-
-       events.c: cache the side effects of file descriptor event
-       enable/disable operations in user space, and do bulk kernel
-       updates at event_loop() time.  This can eliminate costly
-       system calls with successive event disable/enable operations
-       on the same file descriptor. This can also eliminate the
-       need for tricky code that tries to avoid the expense of
-       successive disable/enable operations. Such code is likely
-       to introduce bugs.
-
-       When does it pay off to send domains in the active queue
-       to a DNS prefetch daemon? Could this generalize to a dynamic
-       transport map that piggy-backs domains with the same MX
-       host into the same mail delivery transaction?
-
-       inline table where the "whitespace replacement" character
-       is specified in-line. Ex: inline:XYname1Xvalue1Yname2Xvalue2
-       would instantiate a table with (name1, value1) and (name2,
-       value2).  I'm afraid this is just too ugly.
-
-       tlsproxy(8) should receive TLS preferences from postscreen(8)
-       and smtpd(8), instead of reading them from main.cf. This
-       means that many tlsproxy_ parameters become postscreen_
-       parameters, and that tls_server_init() parameters move to
-       to tls_server_start(). That is a significant API change.
-       It also means tlsproxy can't open all files before chroot().
-
-       anvil rate limit for sasl_username.
-
-       Encapsulate nbbio buffer access and update by tlsproxy.
-
-       Full-duplex support for tlsproxy(8). This requires updating
-       events(3) and nbbio(3).
-
-       Register automagic destructor for object attached to VSTREAM.
-
-       Use different ipc time limits for email message transactions
-       (smtpd, pickup)->cleanup and for quick query/reply transactions
-       such as address rewriting/resolution. Beware of large time
-       limits for local or virtual alias expansion.
-
-       permit_tempfail_action (default: defer_if_reject) to be
-       used as the default value for dnswl_tempfail_action and
-       rhswl_tempfail_action. Steal liberally from the code that
-       implements unverified_recipient_tempfail_action etc.
-
-       Support filtering of messages that are generated by Postfix:
-       This would apply to postmaster notices and bounce messages
-       (DKIM), and address verification (BATV).
-
-       Consistency: in postconf.proto make <dt>..</dt> tags bold.
-
-       postscreen(8): listen on multiple IP addresses and enforce
-       that the client contacts the primary MX address first (i.e.
-       punish hosts that contact the secondary before the primary).
-       The downside with any approach that relies on temporary
-       punishment is that it does not scale to configurations
-       with multiple equal-preference MX hosts. Such hosts would
-       have to share the postscreen cache, causing an unacceptable
-       performance bottleneck and a single point of failure.
-
-       According to a paper by Ted Unangst at BSDCON09, kqueue
-       reports state changes, i.e. kqueue indicates when the socket
-       becomes readable. Specifically, he writes when kqueue reports
-       a socket becomes readable but no data is read from that
-       socket, later kqueue calls won't report the socket as
-       readable. That's not what happens on FreeBSD 8.0, where
-       kqueue will keep reporting the socket as readable when
-       nothing is read.  Also, FreeBSD 8.0 kqueue still reports
-       the socket as readable after a read operation does not empty
-       the kernel buffer.  We need a test program for this that 
-       repeats these tests with OpenBSD and NetBSD (and MacOS X
-       once they fix their kqueue implementation).
-
-       Would it help if there were different cleanup_service
-       parameter names for different message paths? smtpd(8) uses
-       the same cleanup_service value for receiving remote mail
-       and for submitting postmaster problem reports. Do we need
-       separate mumble_cleanup_service_name parameters for "inject",
-       "notify" and "forward" (with backwards compatible defaults)?
-
-       IF/ENDIF support for CIDR tables.
-
-       Need a regular expression table to translate address
-       verification responses into hard/soft/accept reply codes.
-
-       Is there a way to make sendmail -V work after local alias
-       expansion? Majordomo-like mailing lists would benefit from
-       this; the example in VERP_README does not work in the general
-       case.
-
-       When an alias is a member of an :include: list with owner-
-       alias, local(8) needs an option to deliver alias or alias->user
-       indirectly. What happens when an :include: list with owner-
-       alias includes another list?
-
-       Don't allow empty result values in pcre and regexp maps.
-       Postfix doesn't allow them anywhere else (check this).
-
-       Make PCRE_MAX_CAPTURE configurable.
-
-       Add some checks for tokens starting with #. A challenge
-       is to report sensible context from the guts of some low-level
-       parser, without introducing a great deal of clumsiness.
-
-       Add sendmail macros for {verify} and maybe other TLS info.
-
-       Find out if we are doing the correct thing by looking at
-       state->milter_reject_text when expanding {rcpt_addr} or
-       {rcpt_host}.
-
-       Find out why post_mail() etc. block when the qmgr fifo is
-       full (answer: trigger_timeout). How can this cause delays
-       in the queue manager?  When a recipient bounces during
-       (transport, nexthop, address) resolution, it is redirected
-       to the error or retry mailer; and bounce-after-delivery is
-       asynchrounous so it can't block the queue manager, either.
-
-       How to ensure that proxy_read_maps is processed after all
-       its dependencies are initialized, or just bite the bullet
-       and rewrite the parameter initialization code.
-
-       The cleanup virtual alias expansion limit does not really
-       deliver on its promises. 1) It promises to truncate the
-       result without aborting delivery, which would be undesirable
-       anyway, but that is not what it does, so that is good.  2)
-       It keeps all the recipients from multi-recipient database
-       lookup, then terminates further recursion when the result
-       exceeds the expansion limit. This behavior achieves the
-       original goal that all things shall have a finite size (even
-       though but we don'really care how large they are) but may
-       result in surprises when recipients are listed in virtual
-       alias domains or need expansion for other reasons.  In a
-       phone call with Victor, a reasonable way out is to set the
-       limit to some large number (100000) and abort delivery when
-       the result exceeds the limit.
-
-       Should the postscreen save permanent white/black list lookup
-       results to the temporary cache, and query the temporary
-       cache first? Skipping white/black list lookups will speed
-       up the handling of "good" clients without a permanent
-       whitelist entry.  Of course, this means that updates to the
-       white/black lists do not immediately take effect. Workarounds:
-       1) use a shorter temporary cache TTL for clients on the
-       permanent black/white lists; 2) ignore cached white/black
-       list lookup results after "postfix reload"; 2) adjust the
-       logging, for example "WHITELISTED address (cached)" and
-       "BLACKLISTED address (cached)" to eliminate surprises.
-       Comparing the cache entry time with the white/blacklist
-       file modification time is not foolproof: for example, pcre
-       or CIDR tables are read only once.
-
-       It would be nice if the generic dict_cache(3) cache manager
-       could postpone process suicide until cache cleanup is
-       completed (but that is not possible when postscreen forks
-       into the background to finish already-accepted connections,
-       and it is not desirable when a host is being shut down).
-
-       When postscreen drops a connection, a 521 "greeting" should
-       be of the form "521 servername..." and not have an enhanced
-       status code. The "521 5.7.1" form can be used after EHLO.
-       Of course no spammer is going to complain about Postfix
-       SMTP compliance.
-
-       Find a place to document all the mail routing mechanisms
-       in one place so people can figure out how Postfix works.
-
-       The access map BCC action is marked "not stable", perhaps
-       because people would also expect BCC actions in header/body_checks.
-       How much would it take to make the queue file editing code
-       generally usable?
-
-       Move smtpd_command_filter into smtpd_chat_query() and update
-       the session transcript (see smtp_chat_reply() for an example).
-
-       SMTP connection caching without storing connections, to
-       improve TLS mail delivery performance.
-
-       Should not milter8_mail_event() unset the "hold" default
-       reply? Better, the default reply should not be used for
-       this purpose.
-
-       Don't send MASTER_STAT_TAKEN/MASTER_STAT_AVAIL when a server
-       runs with process limit of 1. But this means the master
-       never learns that the process is successful and will always
-       pause $service_throttle_time before restarting a failed service.
-
-       Don't bother maintaining a per-service lockfile when a
-       server runs with process limit of 1. The purpose of the
-       lockfile is to avoid thundering herd problems when the kernel
-       wakes up multiple processes for each new client connection.
-
-       Implement PREPEND action for milter_header_checks. Save the
-       to-be-prepended text to buffer, then emit it along with the
-       new header.
-
-       Fix the header_body_checks API, so that the name of the map
-       class (e.g. milter_header_checks) is available for logging.
-
-       Fix the mime_state and header_body_checks APIs, so that
-       they use VSTRINGs. This simplifies REPLACE actions.
-
-       Update FILTER_README for multi-instance support, and rename
-       the old document to FILTER_LEGACY_README.
-
-       Need to sign delivery status notifications, to avoid surprises
-       when eventually people start enforcing DKIM etc. signatures.
-
-       Either document or remove the internal_mail_filter_classes
-       feature (it's disabled by default).
-
-       Make the "unknown recipient" test configurable as
-       first|last|never, with "yes"=="last" for backwards
-       compatibility. The "first" setting is good for performance
-       (stress=yes) when all users are defined in local files; but
-       it may perform worse when users are in networked tables.
-
-       Cleanup: make DNSBL query format configurable beyond the
-       client's reversed IP address.
-
-       With 'final delivery' in the LMTP client, need an option
-       to also add delivered-to and other pipe(8) features.  This
-       requires making mail_copy() functionality available in
-       non-mailbox context.
-
-       Cleanup: modernize the "add missing From: header" code, to
-       ``phrase <addr>'' form. Most likely, quote the entire phrase
-       if it contains any text that is special, then rfc822_externalize
-       the whole thing.
-
-       SMTP server: make the server_addr and server_port available
-       to policy server, Dovecot, and perhaps Milters.
-
-       Med: local and remote source port and IP address for smtpd
-       policy hook.
-
-       Maybe change maps_rbl_reject_code default to 521, and
-       update wording in STRESS_README.
-
-       Encapsulate time_t comparisons so that they can be made
-       system dependent (use difftime() where available).
-
-       Encapsulate time_t conversions (e.g. REC_TYPE_TIME) so that
-       they can be made system dependent.
-
-       Plan for time_t larger than long, or wait for LP64 to
-       dominate the world?
-
-       Make "AUTH=<>" appendage to MAIL FROM configurable, enabled
-       by default.
-
-       To support ternary operator without a huge parsing effort,
-       consider ${value?{xxx}:{yyy}} where ${name} is existing
-       syntax, and where ?{text} and :{text} are new syntax that
-       is unlikely to break existing configurations. Or perhaps
-       it's just too ugly.
-
-       Write delivery rate delay example (which _README?) and auth
-       failure cache example (SASL_README). Then include them in
-       SOHO_README.
-
-       Look for alternatives for the use of non_smtpd_milters.
-       This involves some way to force local submissions to go
-       through a local SMTP client and server, without triggering
-       "mail loops back to myself" false alarms. The advantage is
-       that it makes smtpd_mumble_restrictions available for local
-       and remote mail; the disadvantage is that it makes local
-       submissions more dependent on networking.  One possibility
-       is to use "pickup -o content_filter=smtp:127.0.0.1:10025",
-       or a dedicated SMTP client/server on UNIX-domain sockets;
-       we could also decide to always suppress "mail loop" detection
-       for loopback connections.  Another option is to have the
-       pickup or cleanup server drive an SMTP client directly;
-       this would require extension of the mail_stream() interface,
-       plus a way to handle bounced/deferred recipients intelligently,
-       but it would be at odds with Postfix design where delivery
-       agents access queue files directly; exposing delivery agents
-       to raw queue files violates another Postfix design principle.
-
-       Consolidate duplicated code in *_server_accept_{pass,inet}().
-
-       Consolidate duplicated code in {inet,unix,upass}_trigger.c.
-
-       In the SMTP client, handle 421 replies in smtp_loop() by
-       having the input function raise a flag after detecting 421
-       (kill connection caching and be sure to do the right thing
-       with RSET probes), leave the smtp_loop() per-command reply
-       handlers unchanged, and have the smtp_loop() reader loop
-       bail out with smtp_site_fail("server disconnected after
-       %s", where), but only in the case that it isn't already in
-       the final state. But first we need to clean up the handling
-       of do/don't cache, expired, bad and dead sessions.
-
-       Combine smtpd_peer.c and qmqpd_peer.c into a single function
-       that produces a client context object, and provide attribute
-       print/scan routines that pass these client context objects
-       around. With this, we no longer have to update multiple
-       pieces of code when a client attribute is added. Ditto for
-       SASL and TLS context.
-
-       Don't log "warning: XXXXX: undeliverable postmaster
-       notification discarded" for spam from outside.
-
-       Really need a cleanup driver that allows testing against
-       Milter applications instead of synthetic events. This would
-       have to provide stubs for clients that talk to Postfix
-       daemon processes. See if this approach can also be used for
-       other daemons.
-
-       smtpd(8) exempts $address_verify_sender from access controls,
-       but it doesn't know whether cleanup(8) or delivery agents
-       modify the sender. Would it be possible to "calibrate" this
-       exemption, perhaps by having delivery agents pass the probe
-       sender to the verify server, keeping in mind that the probe
-       sender may differ per delivery agent due to output rewriting.
-
-       Update attr_print/scan() so they can send/receive file
-       descriptors. This simplifies kludgy code in many daemons.
-
-       Would there be a problem adding $smtpd_mumble_restrictions
-       and $smtpd_sender_login_maps to the default proxy_read_maps
-       settings?
-
-       Remove defer(8) and trace(8) references and man pages. These
-       are services not program names. On the other hand we have
-       man pages for lmtp(8) and smtp(8), but not for relay(8).
-       Likewise, retry(8) does not have a man page.
-
-       Bind all deliveries to the same local delivery process,
-       making Postfix perform as poorly as monolithic mailers, but
-       giving a possibility to eliminate duplicate deliveries.
-
-       Maybe declare loop when resolve_local(mxhost) is true?
-
-       Update message content length when adding/removing headers.
-
-       Need scache size limit.
-
-       REDIRECT should override original recipient info, and
-       probably override DSN as well.
-
-       Update FILTER_README with mailing list suggestions to tag
-       with a badness indicator and then filter down-stream.
-
-       Make null local-part handling configurable: either expand
-       into mailer-daemon (current bahavior) or disallow (strict
-       behavior, currently implemented only in the SMTP server).
-
-       The type of var_message_limit (and other file size/offset
-       configuration parameters or internal protocol attributes)
-       should be changed from int to off_t.  This also requires
-       checking all expressions in which var_message_limit etc.
-       appears: qmqpd, netstring, deliver_request, ...
-
-       Add M flag (enable multi-recipient delivery) to pipe daemon.
-
-       The usage of TLScontext->cache_type is unclear. It specifies
-       a TLS session cache type (smtpd, smtp, or lmtp), but it is
-       sometimes used as an indicator that TLS session caching is
-       unavailable.  In reality, that decision is made by not
-       registering call-back functions for cache maintenance.
-
-       Postfix TLS library code should copy any strings that it
-       receives from the application, instead of passing them
-       around as pointers. TLScontext->cache_type is a case in
-       point.
-
-       Are transport:nexthop null fields the same as in the case
-       of default_transport etc. parameters?
-
-       Don't lose bits when converting st_dev into maildir file
-       name. It's 64 bits on Linux. Found with the BEAM source
-       code analyzer. Is this really a problem, or are they just
-       using 64 bits for upwards compatibility with LP64 systems?
-
-       Do or don't introduce unknown_reverse_client_reject_code.
-
-       Check that "UINT32 == unsigned int" choice is ok (i.e. LP64
-       UNIX).
-
-       Tempfail when a Milter application tries to negotiate content
-       access, while it is configured in an SMTP server that runs
-       before the smtpd_proxy filter.
-
-       Log DSN original recipient when rejecting mail.
-
-       Keep whitespace between label and ":"?
-
-       Make the map case folding/locking options configurable, if
-       not at run-time then at least at compile time so we get
-       consistent behavior across applications.
-
-       Investigate what it would take to eliminate oqmgr, and to
-       make the old behavior configurable in a unified queue
-       manager.  This would shave another 2.7 KLOC from the source
-       footprint.
-
-       Document the case folding strategy for match_list like
-       features.
-
-       Eliminate the (incoming,deferred)->active rename operation.
-       This requires an in-memory hash of queue file names to avoid 
-       duplicate open() operations.
-
-       Softbounce fallback-to-ISP for SOHO users. This heuristic
-       assumes that when direct-to-MX delivery fails with 5XX,
-       delivery via the ISP may still succeed.  This could be
-       implemented by enabling soft bounces for destinations other
-       than the smtp_fallback_relay. So the only benefit of this
-       over the existing soft_bounce feature is that it has no
-       effect on smtp_fallback_relay deliveries.
-
-       Centralize main.cf parameter input so that defaults work
-       consistently. What about parameter names that are prefixed
-       with mail delivery transport names?
-
-       Fix default time unit handling so that we can have a default
-       bounce lifetime of $maximal_queue_lifetime, without causing
-       panics when a non-default maximal_queue_lifetime setting
-       includes no time unit.
-
-       After the 20051222 ISASCII paranoia, lowercase() lowercases
-       ASCII text only.
-
-       Privacy: remove local command/pathname details from remote
-       delivery status reports, and log them via local msg_warn().
-
-       Is it safe to cache a connection after it has been used for
-       more than some number of address verification probes?
-
-       Try to recognize that Resent- headers appear in blocks,
-       newest block first. But don't break on incorrect header
-       block organization.
-
-       Hard limits on cache sizes (anvil, specifically).
-
-       Laptop friendliness: make the qmgr remember when the next
-       deferred queue scan needs to be done, and have the pickup
-       server stat() the maildrop directory before searching it.
-
-       Low: replace_sender/replace_recipient actions in access
-       maps, so they can be used in policy servers?
-
-       Low: configurable order of local(8) delivery methods.
-
-       Med: smtp_connect_timeout_budget (default: 3x smtp_connect_timeout)
-       to limit the total time spent trying to connect.
-
-       Med: transform IPv4-in-IPv6 address literals to IPv4 form
-       when comparing against local IP addresses?
-
-       Med: transform IPv4-in-IPv6 address literals to IPv4 form
-       when eliminating MX mailer loops?
-
-       Med: Postfix requires [] around IPv6 address information
-       in match lists such as mynetworks, debug_peer_list etc.,
-       but the [] must not be specified in access(5) maps. Other
-       places don't care.  For now, this gotcha is documented in
-       IPV6_README and in postconf(5) with each feature that may
-       use IPv6 address information. The general recommendation
-       is not to use [] unless absolutely necessary.
-
-       Med: the partial address matching of IPv6 addresses in
-       access(5) maps is a bit lame: it repeatedly truncates the
-       last ":octetpair" from the printable address representation
-       until a match is found or until truncation is no longer
-       possible.  Since one or more ":" are usually omitted from
-       the printable IPv6 address representation, this does not
-       really try all the possibilities that one might expect to
-       be tried. For now, this gotcha is documented in access(5).
-
-       Low: reject HELO with any domain name or IP address that
-       this MTA is the final destination for.
-
-       Low: should the Delivered-To: test in local(8) be configurable?
-
-       Low: make mail_addr_find() lookup configurable.
-
-       Low: update events.c so that 1-second timer requests do not
-       suffer from rounding errors. This is needed for 1-second
-       SMTP session caching time limits. A 1-second interval would
-       become arbitrarily short when an event is scheduled just
-       before the current second rolls over.
-
-       Low: configurable internal/system locking method.
-
-       Low: add INSTALL section for pre-existing Postfix systems.
-
-       Low: add INSTALL section for pre-existing RPM Postfixes.
-
-       Low: disallow smtpd_recipient_limit < 100 (the RFC minimum).
-
-       Low: noise filter: allow smtp(8) to retry immediately if
-       all MXes return a quick ECONNRESET or 4xx reply during the
-       initial handshake. Retry once? How many times?
-
-       Low: make post-install a "postfix-only script" so it can
-       take data from the environment instead of main.cf.
-
-       Low: randomize deferred mail backoff.
-
-       Med: separate ulimit for delivery to command?
-
-       Med: postsuper -r should do something with recipients in
-       bounce logfiles, to make sure the sender will be notified.
-       To be perfectly safe, no process other than the queue manager
-       should move a queue file away from the active queue.
-
-       This could involve tagging a queue file, and use up another
-       permission bit (postsuper tags a "hot" file, qmgr requeues it).
-
-       Low: postsuper re-run after renaming files, but only a
-       limited number of times.
-
-       Low: smtp-source may block when sending large test messages.
-
-       Med: find a way to log the sender address when MAIL FROM
-       is rejected due to lack of disk space.
-
-       Low: revise other local delivery agent duplicate filters.
-
-       Low: all table lookups should consistently use internalized
-       (unquoted) or externalized (quoted) forms as lookup keys.
-       smtpd, qmgr, local, etc. use unquoted address forms as keys.
-       cleanup uses quoted forms.
-
-       Low: have a configurable list of errno values for mailbox
-       or maildir delivery that result in deferral rather than
-       bouncing mail. What about "killed by signal" exits?
-
-       Low: after reorganizing configuration parameters, add flags
-       to all parameters whose value can be read from file.
-
-       Medium: need in-process caching for map lookups. LDAP servers
-       seem to need this in particular. Need a way to expire cached
-       results that are too old.
-
-       Low: generic showq protocol, to allow for more intelligent
-       processing than just mailq. Maybe marry this with postsuper.
-
-       Low: default domain for appending to unqualified recipients,
-       so that unqualified names can be delivered locally.
-
-       Low: The $process_id_directory setting is not used anywhere
-       in Postfix. Problem reported by Michael Smith, texas.net.
-       This should be documented, or better, the code should warn
-       about attempts to set read-only parameters.
-
-       Low: while converting 8bit text to quoted-printable, perhaps
-       use =46rom to avoid having to produce >From when delivering
-       to mailbox.
-
-       virtual_mailbox_path expression like forward_path, so that
-       people can specify prefix and suffix.
index 9e1804a6d00c2539a9f63b90c5410b1703157d88..06427e0e959f93d16f7e9ea1c7a73f3e90e2e312 100644 (file)
@@ -165,7 +165,7 @@ $manpage_directory/man5/generics.5:f:root:-:644:o
 $manpage_directory/man5/generic.5:f:root:-:644
 $manpage_directory/man5/header_checks.5:f:root:-:644
 $manpage_directory/man5/ldap_table.5:f:root:-:644
-$manpage_directory/man5/lmdb_table.5:f:root:-:644
+#$manpage_directory/man5/lmdb_table.5:f:root:-:644
 $manpage_directory/man5/master.5:f:root:-:644
 $manpage_directory/man5/memcache_table.5:f:root:-:644
 $manpage_directory/man5/mysql_table.5:f:root:-:644
@@ -265,7 +265,7 @@ $readme_directory/INSTALL:f:root:-:644
 $readme_directory/IPV6_README:f:root:-:644
 $readme_directory/LDAP_README:f:root:-:644
 $readme_directory/LINUX_README:f:root:-:644
-$readme_directory/LMDB_README:f:root:-:644
+#$readme_directory/LMDB_README:f:root:-:644
 $readme_directory/LOCAL_RECIPIENT_README:f:root:-:644
 $readme_directory/MACOSX_README:f:root:-:644:o
 $readme_directory/MAILDROP_README:f:root:-:644
@@ -322,7 +322,7 @@ $html_directory/INSTALL.html:f:root:-:644
 $html_directory/IPV6_README.html:f:root:-:644
 $html_directory/LDAP_README.html:f:root:-:644
 $html_directory/LINUX_README.html:f:root:-:644
-$html_directory/LMDB_README.html:f:root:-:644
+#$html_directory/LMDB_README.html:f:root:-:644
 $html_directory/LOCAL_RECIPIENT_README.html:f:root:-:644
 $html_directory/MAILDROP_README.html:f:root:-:644
 $html_directory/MILTER_README.html:f:root:-:644
index 95e73c46204d0c74c74f67cc16505875d2838a3a..e7a4194cdc73ca3c5861b6f36b058db357bfb1b8 100644 (file)
@@ -459,6 +459,7 @@ results are lost after "postfix reload" or "postfix stop". </p>
 /etc/postfix/<a href="postconf.5.html">main.cf</a>:
     <a href="postconf.5.html#address_verify_map">address_verify_map</a> = <a href="DATABASE_README.html#types">btree</a>:$<a href="postconf.5.html#data_directory">data_directory</a>/verify_cache
 
+# (Not supported in the stable Postfix release)
 # Example 2: Shared persistent <a href="lmdb_table.5.html">lmdb</a>: cache (Postfix 2.11 or later).  
 # Disable automatic cache cleanup in all Postfix instances except
 # for one instance that will be responsible for cache cleanup.
index 9f7c64c2a4c394b18cc3c1ecce634bc8be730f33..56f468f2d3ed129ae9673ed20e29c9365d315449 100644 (file)
 
 <hr>
 
+<h2>Note</h2>
+
+<p> LMDB is not supported in the stable Postfix release.  It will
+spontaneously terminate a Postfix daemon process without allowing
+Postfix to 1) report the problem to the maillog file, and to 2)
+provide reduced service where this is appropriate. </p>
+
 <h2>Introduction</h2>
 
 <p> Postfix uses databases of various kinds to store and look up
@@ -294,7 +301,7 @@ sure that <a href="postconf.5.html#lmdb_map_size">lmdb_map_size</a> &gt; 3x the
 
 <dl>
 
-<dt> Problem: </dt> <dd> <p> A corrupted LMDB database cann't be
+<dt> Problem: </dt> <dd> <p> A corrupted LMDB database can't be
 rebuilt simply by re-running <a href="postmap.1.html">postmap(1)</a> or <a href="postalias.1.html">postalias(1)</a>, or by
 waiting until a <a href="tlsmgr.8.html">tlsmgr(8)</a> daemon restarts.  This problem does not
 exist with other Postfix databases.  </p> </dd>
index fe1435f914fc8c758c503a0bb60a40b6746ce5fd..3bbbce8c165d72c85e99683c8e81ff7ab9000a94 100644 (file)
@@ -1071,7 +1071,9 @@ of the following options: </p>
         key_format = postscreen:%s
     </pre>
 
-<li> <p> A persistent <a href="lmdb_table.5.html">lmdb</a>: temporary whitelist can be shared between
+<li> <p>
+    (Not supported in the stable Postfix release)
+    A persistent <a href="lmdb_table.5.html">lmdb</a>: temporary whitelist can be shared between
     <a href="postscreen.8.html">postscreen(8)</a> daemons that run under the same <a href="master.8.html">master(8)</a> daemon,
     or under different <a href="master.8.html">master(8)</a> daemons on the same host.  Disable
     cache cleanup (<a href="postconf.5.html#postscreen_cache_cleanup_interval">postscreen_cache_cleanup_interval</a> = 0) in all
index f758afdb3d8fabb97375a6200cea72dd0636471b..819615e976f8d25a2cc48cfe5aa6aa3f7ebeb446 100644 (file)
@@ -132,8 +132,12 @@ Per-client/user/etc. access </a>
 
 <li> <a href="LDAP_README.html"> LDAP Howto  </a>
 
+<!--
+
 <li> <a href="LMDB_README.html"> LMDB Howto  </a>
 
+-->
+
 <li> <a href="MEMCACHE_README.html"> Memcache Howto  </a>
 
 <li> <a href="MYSQL_README.html"> MySQL Howto  </a>
index b627ded68e5e66c9094297b9acb66d79f74d705f..31acc6ac0b17978f5f0f38d913beac17ae90b570 100644 (file)
@@ -20,38 +20,43 @@ LMDB_TABLE(5)                                                    LMDB_TABLE(5)
        <b>postmap -q - <a href="lmdb_table.5.html">lmdb</a>:/etc/postfix/</b><i>filename</i> &lt;<i>inputfile</i>
 
 <b>DESCRIPTION</b>
-       The  Postfix  LMDB  adapter  provides  access  to a persistent, memory-
+       LMDB  is  not  supported in the stable Postfix release. It will sponta-
+       neously terminate a Postfix daemon process without allowing Postfix  to
+       1)  report  the  problem to the maillog file, and to 2) provide reduced
+       service where this is appropriate.
+
+       The Postfix LMDB adapter  provides  access  to  a  persistent,  memory-
        mapped, key-value store.  The database size is limited only by the size
        of the memory address space and file system.
 
 <b>REQUESTS</b>
-       The  LMDB  adapter  supports all Postfix lookup table operations.  This
-       makes LMDB suitable for  Postfix  address  rewriting,  routing,  access
-       policies,  caches,  or any information that can be stored under a fixed
+       The LMDB adapter supports all Postfix lookup  table  operations.   This
+       makes  LMDB  suitable  for  Postfix  address rewriting, routing, access
+       policies, caches, or any information that can be stored under  a  fixed
        lookup key.
 
-       When a transaction fails due to a full database,  Postfix  resizes  the
+       When  a  transaction  fails due to a full database, Postfix resizes the
        database and retries the transaction.
 
-       Postfix  access, address mapping and routing table lookups may generate
-       partial search keys such as domain names without  one  or  more  subdo-
-       mains,  network addresses without one or more least-significant octets,
-       or email addresses without the localpart, address extension  or  domain
-       portion.   This  behavior  is  also  found with <a href="DATABASE_README.html#types">btree</a>:, <a href="DATABASE_README.html#types">hash</a>:, or <a href="ldap_table.5.html">ldap</a>:
+       Postfix access, address mapping and routing table lookups may  generate
+       partial  search  keys  such  as domain names without one or more subdo-
+       mains, network addresses without one or more least-significant  octets,
+       or  email  addresses without the localpart, address extension or domain
+       portion.  This behavior is also found  with  <a href="DATABASE_README.html#types">btree</a>:,  <a href="DATABASE_README.html#types">hash</a>:,  or  <a href="ldap_table.5.html">ldap</a>:
        tables.
 
-       Unlike other flat-file based Postfix  databases,  changes  to  an  LMDB
+       Unlike  other  flat-file  based  Postfix  databases, changes to an LMDB
        database do not trigger automatic daemon program restart.
 
 <b>RELIABILITY</b>
-       LMDB's  copy-on-write  architecture  achieves  reliable updates, at the
-       cost of using more space than some  other  flat-file  databases.   Read
-       operations  are memory-mapped for speed.  Write operations are not mem-
+       LMDB's copy-on-write architecture achieves  reliable  updates,  at  the
+       cost  of  using  more  space than some other flat-file databases.  Read
+       operations are memory-mapped for speed.  Write operations are not  mem-
        ory-mapped to avoid silent curruption due stray pointer bugs.
 
-       The Postfix LMDB adapter implements  locking  with  fcntl(2)  locks  at
-       whole-file  granularity.  LMDB's  native  locking  scheme would require
-       world-writable lockfiles and would therefore violate the Postfix  secu-
+       The  Postfix  LMDB  adapter  implements  locking with fcntl(2) locks at
+       whole-file granularity. LMDB's  native  locking  scheme  would  require
+       world-writable  lockfiles and would therefore violate the Postfix secu-
        rity model.
 
        Multiple processes can safely update an LMDB database without serializ-
@@ -59,8 +64,8 @@ LMDB_TABLE(5)                                                    LMDB_TABLE(5)
        as a shared cache for <a href="verify.8.html">verify(8)</a> or <a href="postscreen.8.html">postscreen(8)</a> services.
 
 <b>CONFIGURATION PARAMETERS</b>
-       Short-lived  programs  automatically  pick up changes to <a href="postconf.5.html">main.cf</a>.  With
-       long-running daemon programs, Use the command "<b>postfix reload</b>" after  a
+       Short-lived programs automatically pick up changes  to  <a href="postconf.5.html">main.cf</a>.   With
+       long-running  daemon programs, Use the command "<b>postfix reload</b>" after a
        configuration change.
 
        <b><a href="postconf.5.html#lmdb_map_size">lmdb_map_size</a> (default: 16777216)</b>
index e28df07cb2cb34b3251e5a6a2abde9dcaecb5e90..888d885e57d86444470009cfb04e181d2b8d4ad7 100644 (file)
@@ -5888,7 +5888,7 @@ Examples:
 
 <p> Selectively disable <a href="master.8.html">master(8)</a> listener ports by service type
 or by service name and type.  Specify a list of service types
-("inet", "unix", "fifo", or "pass") or "name.type" tuples, where
+("inet", "unix", "fifo", or "pass") or "name/type" tuples, where
 "name" is the first field of a <a href="master.5.html">master.cf</a> entry and "type" is a
 service type. As with other Postfix matchlists, a search stops at
 the first match.  Specify "!pattern" to exclude a service from the
@@ -5901,14 +5901,15 @@ is intentional. </p>
 <p> Examples: </p>
 
 <pre>
+# With Postfix 2.6..2.10 use '.' instead of '/'.
 # Turn on all <a href="master.8.html">master(8)</a> listener ports (the default).
 <a href="postconf.5.html#master_service_disable">master_service_disable</a> =
 # Turn off only the main SMTP listener port.
-<a href="postconf.5.html#master_service_disable">master_service_disable</a> = smtp.inet
+<a href="postconf.5.html#master_service_disable">master_service_disable</a> = smtp/inet
 # Turn off all TCP/IP listener ports.
 <a href="postconf.5.html#master_service_disable">master_service_disable</a> = inet
 # Turn off all TCP/IP listener ports except "foo".
-<a href="postconf.5.html#master_service_disable">master_service_disable</a> = !foo.inet, inet
+<a href="postconf.5.html#master_service_disable">master_service_disable</a> = !foo/inet, inet
 </pre>
 
 <p> This feature is available in Postfix 2.6 and later. </p>
index 4767ce53eacedb099e97b249c1c2d8127e82fe0a..37e94e44e437a3d379871207d18c5975035c43fe 100644 (file)
@@ -155,8 +155,6 @@ the following convention:  </p>
 
 <li> <a href="ldap_table.5.html">ldap_table(5)</a>, Postfix LDAP client 
 
-<li> <a href="lmdb_table.5.html">lmdb_table(5)</a>, Postfix LMDB database driver 
-
 <li> <a href="memcache_table.5.html">memcache_table(5)</a>, Postfix memcache client 
 
 <li> <a href="mysql_table.5.html">mysql_table(5)</a>, Postfix MYSQL client 
index b002433d1c3e6c1faf9db45691f32b8ba4574cfa..f4691c3b66a2b1e37162c97d6a72d130e86d0c1e 100644 (file)
@@ -269,7 +269,6 @@ POSTFIX(1)                                                          POSTFIX(1)
        Table lookup mechanisms:
        <a href="cidr_table.5.html">cidr_table(5)</a>, Associate CIDR pattern with value
        <a href="ldap_table.5.html">ldap_table(5)</a>, Postfix LDAP client
-       <a href="lmdb_table.5.html">lmdb_table(5)</a>, Postfix LMDB database driver
        <a href="memcache_table.5.html">memcache_table(5)</a>, Postfix memcache client
        <a href="mysql_table.5.html">mysql_table(5)</a>, Postfix MYSQL client
        <a href="nisplus_table.5.html">nisplus_table(5)</a>, Postfix NIS+ client
index 7ea559081d6a7b87d396786cc5c1d14ac1e797f5..316173dcdfa2d29d907b9174e3fbe3c733121626 100644 (file)
@@ -632,7 +632,7 @@ ${WARN='-Wall -Wno-comment -Wformat -Wimplicit -Wmissing-prototypes \
 export SYSTYPE AR ARFL RANLIB SYSLIBS CC OPT DEBUG AWK OPTS
 
 # Snapshot only.
-CCARGS="$CCARGS -DSNAPSHOT"
+#CCARGS="$CCARGS -DSNAPSHOT"
 
 # Non-production: needs thorough testing, or major changes are still
 # needed before the code stabilizes.
index 3b71774c6e0af7b15d36b4057258ac77ee12db0c..3d29afd726928eb346a7555ce83913f53d0568c5 100644 (file)
@@ -254,7 +254,6 @@ virtual(5), Postfix virtual aliasing
 Table lookup mechanisms:
 cidr_table(5), Associate CIDR pattern with value
 ldap_table(5), Postfix LDAP client
-lmdb_table(5), Postfix LMDB database driver
 memcache_table(5), Postfix memcache client
 mysql_table(5), Postfix MYSQL client
 nisplus_table(5), Postfix NIS+ client
index 45b9a4441d97f00a63809ef2cb893405d6255a0a..9768ecb9120155187c713f18507e83d53ff65f2a 100644 (file)
@@ -22,6 +22,12 @@ Postfix LMDB adapter
 .SH DESCRIPTION
 .ad
 .fi
+LMDB is not supported in the stable Postfix release. It
+will spontaneously terminate a Postfix daemon process without
+allowing Postfix to 1) report the problem to the maillog
+file, and to 2) provide reduced service where this is
+appropriate.
+
 The Postfix LMDB adapter provides access to a persistent,
 memory-mapped, key-value store.  The database size is limited
 only by the size of the memory address space and file system.
index 7a1310199dfcf00ac38f20cf7b41054a082a7760..baf8ac93fcd012b63e864d00bd2b7004f7a7ca76 100644 (file)
@@ -3430,7 +3430,7 @@ masquerade_exceptions = root
 .SH master_service_disable (default: empty)
 Selectively disable \fBmaster\fR(8) listener ports by service type
 or by service name and type.  Specify a list of service types
-("inet", "unix", "fifo", or "pass") or "name.type" tuples, where
+("inet", "unix", "fifo", or "pass") or "name/type" tuples, where
 "name" is the first field of a master.cf entry and "type" is a
 service type. As with other Postfix matchlists, a search stops at
 the first match.  Specify "!pattern" to exclude a service from the
@@ -3445,14 +3445,15 @@ Examples:
 .nf
 .na
 .ft C
+# With Postfix 2.6..2.10 use '.' instead of '/'.
 # Turn on all \fBmaster\fR(8) listener ports (the default).
 master_service_disable =
 # Turn off only the main SMTP listener port.
-master_service_disable = smtp.inet
+master_service_disable = smtp/inet
 # Turn off all TCP/IP listener ports.
 master_service_disable = inet
 # Turn off all TCP/IP listener ports except "foo".
-master_service_disable = !foo.inet, inet
+master_service_disable = !foo/inet, inet
 .fi
 .ad
 .ft R
index c62ee75e62ff2d958dcd1227c65e61dfa825bb70..b433d0f21827a5998117201b5874a2cb2e32b7f6 100644 (file)
@@ -459,6 +459,7 @@ results are lost after "postfix reload" or "postfix stop". </p>
 /etc/postfix/main.cf:
     address_verify_map = btree:$data_directory/verify_cache
 
+# (Not supported in the stable Postfix release)
 # Example 2: Shared persistent lmdb: cache (Postfix 2.11 or later).  
 # Disable automatic cache cleanup in all Postfix instances except
 # for one instance that will be responsible for cache cleanup.
index 91e3a7fc46a4cfd64e97d6e38f6d7637387b5dd3..ca5e35b62ceb6a9c12cc8a9f9687145b6ba17f8b 100644 (file)
 
 <hr>
 
+<h2>Note</h2>
+
+<p> LMDB is not supported in the stable Postfix release.  It will
+spontaneously terminate a Postfix daemon process without allowing
+Postfix to 1) report the problem to the maillog file, and to 2)
+provide reduced service where this is appropriate. </p>
+
 <h2>Introduction</h2>
 
 <p> Postfix uses databases of various kinds to store and look up
@@ -294,7 +301,7 @@ tlsmgr(8) from a corrupted database.  </strong></p>
 
 <dl>
 
-<dt> Problem: </dt> <dd> <p> A corrupted LMDB database cann't be
+<dt> Problem: </dt> <dd> <p> A corrupted LMDB database can't be
 rebuilt simply by re-running postmap(1) or postalias(1), or by
 waiting until a tlsmgr(8) daemon restarts.  This problem does not
 exist with other Postfix databases.  </p> </dd>
index 8be94cbc4be85a25d4ec61ecb09d307142fb519d..016b5e7e135e445590301a5486d88470095ab9f5 100644 (file)
@@ -1071,7 +1071,9 @@ of the following options: </p>
        key_format = postscreen:%s
     </pre>
 
-<li> <p> A persistent lmdb: temporary whitelist can be shared between
+<li> <p>
+    (Not supported in the stable Postfix release)
+    A persistent lmdb: temporary whitelist can be shared between
     postscreen(8) daemons that run under the same master(8) daemon,
     or under different master(8) daemons on the same host.  Disable
     cache cleanup (postscreen_cache_cleanup_interval = 0) in all
index 8f2829753f3e13c6bbc7310474b102a925445d79..46a27917b6907f3ba8e1b630a8aa517518bb38d4 100644 (file)
 # .br
 #      \fBpostmap -q - lmdb:/etc/postfix/\fIfilename\fB <\fIinputfile\fR
 # DESCRIPTION
+#      LMDB is not supported in the stable Postfix release. It
+#      will spontaneously terminate a Postfix daemon process without
+#      allowing Postfix to 1) report the problem to the maillog
+#      file, and to 2) provide reduced service where this is
+#      appropriate.
+#
 #      The Postfix LMDB adapter provides access to a persistent,
 #      memory-mapped, key-value store.  The database size is limited
 #      only by the size of the memory address space and file system.
index 40e948c7a23fcd56cf46ed908968659135f8d5b8..9fff7cc53bd1a4a12c8de65fe8e562f0669ffc0b 100644 (file)
@@ -13020,7 +13020,7 @@ This service is normally implemented by the proxymap(8) daemon.
 
 <p> Selectively disable master(8) listener ports by service type
 or by service name and type.  Specify a list of service types
-("inet", "unix", "fifo", or "pass") or "name.type" tuples, where
+("inet", "unix", "fifo", or "pass") or "name/type" tuples, where
 "name" is the first field of a master.cf entry and "type" is a
 service type. As with other Postfix matchlists, a search stops at
 the first match.  Specify "!pattern" to exclude a service from the
@@ -13033,14 +13033,15 @@ is intentional. </p>
 <p> Examples: </p>
 
 <pre>
+# With Postfix 2.6..2.10 use '.' instead of '/'.
 # Turn on all master(8) listener ports (the default).
 master_service_disable =
 # Turn off only the main SMTP listener port.
-master_service_disable = smtp.inet
+master_service_disable = smtp/inet
 # Turn off all TCP/IP listener ports.
 master_service_disable = inet
 # Turn off all TCP/IP listener ports except "foo".
-master_service_disable = !foo.inet, inet
+master_service_disable = !foo/inet, inet
 </pre>
 
 <p> This feature is available in Postfix 2.6 and later. </p>
index 8254d0187a9523345e60fdadd4795a16da507796..041e4f6abac256d5c127c4b3764d27f4f7bdd25d 100644 (file)
@@ -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      "20140104"
-#define MAIL_VERSION_NUMBER    "2.11"
+#define MAIL_RELEASE_DATE      "20140105"
+#define MAIL_VERSION_NUMBER    "2.11.0-RC1"
 
 #ifdef SNAPSHOT
 #define MAIL_VERSION_DATE      "-" MAIL_RELEASE_DATE
index 183c825e52816d193bb31dd457de688679a33c15..82d6919917570d4642fafe73dda3f096cba53ac0 100644 (file)
 /*     Table lookup mechanisms:
 /*     cidr_table(5), Associate CIDR pattern with value
 /*     ldap_table(5), Postfix LDAP client
-/*     lmdb_table(5), Postfix LMDB database driver
+/*     \"lmdb_table(5), Postfix LMDB database driver
 /*     memcache_table(5), Postfix memcache client
 /*     mysql_table(5), Postfix MYSQL client
 /*     nisplus_table(5), Postfix NIS+ client
diff --git a/postfix/src/util/lmdb_cache_test.sh b/postfix/src/util/lmdb_cache_test.sh
new file mode 100644 (file)
index 0000000..8dfc72d
--- /dev/null
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+set -e
+
+rm -f foo.lmdb
+
+./dict_cache <<EOF
+cache lmdb:foo
+update x ${1-2000}
+run 
+update y ${1-2000}
+purge x
+run 
+purge y
+run 
+EOF
+
+../../bin/postmap -s lmdb:foo | diff /dev/null -
+rm -f foo.lmdb
index abb5eeef9ef5d9658cbf9d79ec14ca92b0ba2e6c..38d1da31ebe6b37476449e3f552da4f96075bfd8 100644 (file)
@@ -288,6 +288,7 @@ static void slmdb_cursor_close(SLMDB *slmdb)
 static void slmdb_saved_key_init(SLMDB *slmdb)
 {
     slmdb->saved_key.mv_data = 0;
+    slmdb->saved_key.mv_size = 0;
     slmdb->saved_key_size = 0;
 }
 
@@ -296,8 +297,7 @@ static void slmdb_saved_key_init(SLMDB *slmdb)
 static void slmdb_saved_key_free(SLMDB *slmdb)
 {
     free(slmdb->saved_key.mv_data);
-    slmdb->saved_key.mv_data = 0;
-    slmdb->saved_key_size = 0;
+    slmdb_saved_key_init(slmdb);
 }
 
 #define HAVE_SLMDB_SAVED_KEY(s) ((s)->saved_key.mv_data != 0)
@@ -318,7 +318,7 @@ static int slmdb_saved_key_assign(SLMDB *slmdb, MDB_val *key_val)
            slmdb->saved_key.mv_data =
                realloc(slmdb->saved_key.mv_data, key_val->mv_size);
        if (slmdb->saved_key.mv_data == 0) {
-           slmdb->saved_key_size = 0;
+           slmdb_saved_key_init(slmdb);
            return (ENOMEM);
        } else {
            slmdb->saved_key_size = key_val->mv_size;
@@ -374,7 +374,7 @@ static int slmdb_recover(SLMDB *slmdb, int status)
 
     /*
      * Close the cursor and its read transaction before changing the memory
-     * map size. We can restore it later with the saved key information.
+     * map size. We can restore it later from the saved key information.
      */
     if (slmdb->cursor != 0)
        slmdb_cursor_close(slmdb);
@@ -588,7 +588,7 @@ int     slmdb_del(SLMDB *slmdb, MDB_val *mdb_key)
 
     /*
      * Before doing a non-bulk write transaction in MDB_NOLOCK mode, close a
-     * cursor and its read transaction. We can restore it later with the
+     * cursor and its read transaction. We can restore it later from the
      * saved key information.
      */
     if (slmdb->cursor != 0 && slmdb->txn == 0
@@ -639,7 +639,7 @@ int     slmdb_cursor_get(SLMDB *slmdb, MDB_val *mdb_key,
        }
 
        /*
-        * Restore the cursor to the saved key position.
+        * Restore the cursor position from the saved key information.
         */
        if (HAVE_SLMDB_SAVED_KEY(slmdb) && op != MDB_FIRST) {
            if ((status = mdb_cursor_get(slmdb->cursor, &slmdb->saved_key,
@@ -740,7 +740,7 @@ int     slmdb_close(SLMDB *slmdb)
     mdb_env_close(slmdb->env);
 
     /*
-     * Clean up the saved key position.
+     * Clean up the saved key information.
      */
     if (HAVE_SLMDB_SAVED_KEY(slmdb))
        slmdb_saved_key_free(slmdb);