This document describes *changes* to previous versions, that might affect Exim's operation, with an unchanged configuration file. For new options, and new features, see the NewStuff file next to this ChangeLog. Since version 4.98 ------------------ JH/01 Use fewer forks & execs for sending many messages to a single host. By passing back the next message-id from the transport to the delivery process, we can loop there. A two-phase queue run will benefit, particularly for mailinglist and smarthost cases. Exim version 4.98 ----------------- JH/01 Support list of dkim results in the dkim_status ACL condition, making it more usable in the data ACL. JH/02 Bug 3040: Handle error on close of the spool data file during reception. Previously This was only logged, on the assumption that errors would be seen for a previous fflush(). However, a fuse filesystem has been reported as showing this an error for the fclose(). The spool is now in an uncertain state, and we have logged and responded acceptance. Change this to respond with a temp-reject, wipe spoolfiles, and log the error detail. JH/03 Bug 3030: Fix handling of DNS servfail respons for DANE TLSA. When hit during a recipient verify callout, a QUIT command was attempted on the now-closed callout channel, causing a paniclog entry. JH/04 Bug 3039: Fix handling of of an empty log_reject_target, with a connection_reject log_selector, under tls_on_connect. Previously with this combination, when the connect ACL rejected, a spurious paniclog entry was made. JH/05 Fix TLS resumption for TLS-on-connect. This was broken by the advent of loadbalancer-detection for resumption, in 4.96 - which tries to use the EHLO response. SMTPS does not have one at the time it is starting TLS. Change the default for the smtp transport host_name_extract option to be a static string, for TLS-on-connect cases; meaning that resumption will always be attempted (unless deliberately overriden). JH/06 Bug 3054: Fix dnsdb lookup for a TXT record with multiple chunks, with a chunk-separator specification. This was broken by hardening introduced for Bug 3031. JH/07 Bug 3050: Fix -bp for old message_id format spoolfiles. Previously it included the -H with the id; this also messed up exiqgrep. JH/08 Bug 3056: Tighten up parsing of DKIM DNS records. Previously, whitespace was not properly skipped and empty elements would cause mis-parsing. Tighten parsing of DKIM header records. Previously, all but lowercase alpha chars would be ignored in potential tag names. JH/09 Bug 3057: Add heuristic for spotting mistyped IPv6 addresses in lists being searched. Previously we only had one for IPv4 addresses. Per the documentation, the error results by default in a no-match result for the list. It is logged if the unknown_in_list log_selector is used. JH/10 Bug 3058: Ensure that a failing expansion in a router "set" option defers the routing operation. Previously it would silently stop routing the message. JH/11 Bug 3046: Fix queue-runs. Previously, the arrivel of a notification or info-request event close in time to a scheduled run timer could result in the latter being missed, and no further queue scheduled runs being initiated. This ouwld be more likely on high-load systems. JH/12 Refuse to accept a line "dot, LF" as end-of-DATA unless operating in LF-only mode (as detected from the first header line). Previously we did accept that in (normal) CRLF mode; this has been raised as a possible attack scenario (under the name "smtp smuggling"). JH/13 Add an fdatasync call for the received message data file in spool, before loggging reception and sending the SMTP ack. Previously we only flushed the stdio buffer so there was still the possibility of a disk error. JH/14 Bug 3061: Avoid a split log line when trying to rewrite a malformed address. Previously, for the last address in a header line (commonly there is only one) the terminating newline was part of the logged information. JH/15 Bug 3061: Ensure a log line is written for a malformed address in a header, when parsing for address-qualification. Previously one was only written if there were rewrite rules. JH/16 Two-phase queue runs are now reported in the daemon startup log line and in exiwhat output. JH/17 Bug 3064: Fix combination of "-q -R ". Introduction of the multiple-queue-runners facility for 4.97 broke this, giving only a one-time run of the queue. JH/18 Bug 3068: Log a warning for use of deprecated syntax in query-style lookups. JH/19 Fix TLS startup. When the last expansion done before the initiation of a TLS session resulted in a forced-fail, a misleading error was logged for the expansino of tls_certificates. This would affect the common case of that option being set (main-section options) but not having any variable parts. It could also potentially affect tls_privatekeys. The underlyding coding errors go back to 4.90 but were only exposed in 4.97. JH/20 Bug 3047: A recent (somewhere between 10.34 and 10.42) version of the pcre2 library starting allocating 20kB rather than 112 bytes per match call, which broke the 2GB total limitation on Exim's memory management when a user had over 104207 messages stored and the appendfile maildir_quota_directory_regex option is in use. Release the allocated memory every thosand files to avoid this. The same issue arises with the ACL regex condition, which is applied to every line of a received message. JH/21 Bug 3059: Fix crash in smtp transport. When running for a message for which all recipients had been handled (itself an issue) a null-pointer deref was done on trying to write a retry record. Fix that by counting the outstanding recipients before trying to transmit the message. The situation arose for a second MX try within a transport run, when the first had perm-rejected a recipient (the only one for the connection, in the case seen) during pipelining, and then closed the TCP connection. The transport classified that as an I/O error, leaving the message outstanding but having marked up the recipient as dealt-with. It then tried another MX because of the I/O error. Fix this by converting the message-level status to ok if there was a close but all recipients were dealt with. Thanks to Wolfgand Breyha for debug runs. JH/22 The ESMTP_LIMITS facility (RFC 9422) is promoted from experimental status and is now controlled by the build-time option DISABLE_ESMTP_LIMITS. JH/23 Bug 3066: Avoid leaking lookup database credentials to log. JH/24 Bug 3081: Fix a delivery process crash. When the router "errors_to" option specified a fixed address, later rewriting on that address would trip on the configuration data being readonly. Instead of modifying in-place, copy data. Found and fixed by Peter Benie. JH/25 Bug 3079: Fix crash in dbmnz. When a key was present for zero-length data a null pointer was followed. Find and testcase by Sebastian Bugge. JH/26 Fix encoding for an AUTH parameter on a MAIL FROM command. Previously decimal 127 chars were not encoded, and lowercase hex was used for encoded values. Outstanding since at least 1999. JH/27 Fix crash in logging. When a message with a large number of recipients had been received, and logging of recipients is enabled, the buffer used for logging could reach limit. A read using a null pointer would then be done, resulting in a crash of the receiving process before an SMTP ACK for the message was returned to the sending system. Duplicate messages were created as a result. Find and debug help by Mateusz Krawczyk JH/28 Bug 3086: Fix exinext for ipv6. Change the format of keys in the retry DB, wrapping transport record bare-ip "host names" and ipv6 "host addresses" in square-brackets. This makes the parsing that exinext does more reliable. JH/29 Bug 3087: Fix SRS encode. A zero-length quoted element in the local-part would cause a crash. JH/30 Bug 3029: Avoid feeding Resent-From: to DMARC. JH/31 Bug 3027: For -bh / -bhc tests change to using the compressed form of ipv6 addresses for the sender. Previously the uncompressed form was used, and if used in textual form this would result in behavior difference versus non-bh. JH/32 Bug 3096: MAIL before HELO/EHLO, where required by hosts_require_helo, is now classed as a protocol error and subject to smtp_max_synprot_errors. JH/33 Bug 2994: A subdir dsearch lookup should permit a directory name that starts ".." and has following characters. JH/34 Fix delivery ordering for 2-phase queue run combined with queue_run_in_order. Exim version 4.97 ----------------- JH/01 The hosts_connection_nolog main option now also controls "no MAIL in SMTP connection" log lines. JH/02 Option default value updates: - queue_fast_ramp (main) true (was false) - remote_max_parallel (main) 4 (was 2) JH/03 Cache static regex pattern compilations, for use by ACLs. JH/04 Bug 2903: avoid exit on an attempt to rewrite a malformed address. Make the rewrite never match and keep the logging. Trust the admin to be using verify=header-syntax (to actually reject the message). JH/05 Follow symlinks for placing a watch on TLS creds files. This means (under Linux) we watch the dir containing the final file; previously it would be the dir with the first symlink. We still do not monitor the entire path. JH/06 Check for bad chars in rDNS for sender_host_name. The OpenBSD (at least) dn_expand() is happy to pass them through. JH/07 OpenSSL Fix auto-reload of changed server OCSP proof. Previously, if the file with the proof had an unchanged name, the new proof(s) were loaded on top of the old ones (and nover used; the old ones were stapled). JH/08 Bug 2915: Fix use-after-free for $regex variables. Previously when more than one message arrived in a single connection a reference from the earlier message could be re-used. Often a sigsegv resulted. These variables were introduced in Exim 4.87. Debug help from Graeme Fowler. JH/09 Fix ${filter } for conditions that modify $value. Previously the modified version would be used in construction the result, and a memory error would occur. JH/10 GnuTLS: fix for (IOT?) clients offering no TLS extensions at all. Find and fix by Jasen Betts. JH/11 OpenSSL: fix for ancient clients needing TLS support for versions earlier than TLSv1,2, Previously, more-recent versions of OpenSSL were permitting the systemwide configuration to override the Exim config. HS/01 Bug 2728: Introduce EDITME option "DMARC_API" to work around incompatible API changes in libopendmarc. JH/12 Bug 2930: Fix daemon startup. When started from any process apart from pid 1, in the normal "background daemon" mode, having to drop process- group leadership also lost track of needing to create listener sockets. JH/13 Bug 2929: Fix using $recipients after ${run...}. A change made for 4.96 resulted in the variable appearing empty. Find and fix by Ruben Jenster. JH/14 Bug 2933: Fix regex substring match variables for null matches. Since 4.96 a capture group which obtained no text (eg. "(abc)*" matching zero occurrences) could cause a segfault if the corresponding $ was expanded. JH/15 Fix argument parsing for ${run } expansion. Previously, when an argument included a close-brace character (eg. it itself used an expansion) an error occurred. JH/16 Move running the smtp connect ACL to before, for TLS-on-connect ports, starting TLS. Previously it was after, meaning that attackers on such ports had to be screened using the host_reject_connection main config option. The new sequence aligns better with the STARTTLS behaviour, and permits defences against crypto-processing load attacks, even though it is strictly an incompatible change. Also, avoid sending any SMTP fail response for either the connect ACL or host_reject_connection, for TLS-on-connect ports. JH/17 Permit the ACL "encrypted" condition to be used in a HELO/EHLO ACL, Previously this was not permitted, but it makes reasonable sense. While there, restore a restriction on using it from a connect ACL; given the change JH/16 it could only return false (and before 4.91 was not permitted). JH/18 Fix a fencepost error in logging. Previously (since 4.92) when a log line was exactly sized compared to the log buffer, a crash occurred with the misleading message "bad memory reference; pool not found". Found and traced by Jasen Betts. JH/19 Bug 2911: Fix a recursion in DNS lookups. Previously, if the main option dns_again_means_nonexist included an element causing a DNS lookup which itself returned DNS_AGAIN, unbounded recursion occurred. Possible results included (though probably not limited to) a process crash from stack memory limit, or from excessive open files. Replace this with a paniclog whine (as this is likely a configuration error), and returning DNS_NOMATCH. JH/20 Bug 2954: (OpenSSL) Fix setting of explicit EC curve/group. Previously this always failed, probably leading to the usual downgrade to in-clear connections. JH/21 Fix TLSA lookups. Previously dns_again_means_nonexist would affect SERVFAIL results, which breaks the downgrade resistance of DANE. Change to not checking that list for these lookups. JH/22 Bug 2434: Add connection-elapsed "D=" element to more connection closure log lines. JH/23 Fix crash in string expansions. Previously, if an empty variable was immediately followed by an expansion operator, a null-indirection read was done, killing the process. JH/24 Bug 2997: When built with EXPERIMENTAL_DSN_INFO, bounce messages can include an SMTP response string which is longer than that supported by the delivering transport. Alleviate by wrapping such lines before column 80. JH/25 Bug 2827: Restrict size of References: header in bounce messages to 998 chars (RFC limit). Previously a limit of 12 items was made, which with a not-impossible References: in the message being bounced could still be over-large and get stopped in the transport. JH/26 For a ${readsocket } in TLS mode, send a TLS Close Alert before the TCP close. Previously a bare socket close was done. JH/27 Fix ${srs_encode ..}. Previously it would give a bad result for one day every 1024 days. JH/28 Bug 2996: Fix a crash in the smtp transport. When finding that the message being considered for delivery was already being handled by another process, and having an SMTP connection already open, the function to close it tried to use an uninitialized variable. This would afftect high-volume sites more, especially when running mailing-list-style loads. Pollution of logs was the major effect, as the other process delivered the message. Found and partly investigated by Graeme Fowler. JH/29 Change format of the internal ID used for message identification. The old version only supported 31 bits for a PID element; the new 64 (on systems which can use Base-62 encoding, which is all currently supported ones but not Darwin (MacOS) or Cygwin, which have case-insensitive filesystems and must use Base-36). The new ID is 23 characters rather than 16, and is visible in various places - notably logs, message headers, and spool file names. Various of the ancillary utilities also have to know the format. As well as the expanded PID portion, the sub-second part of the time recorded in the ID is expanded to support finer precision. Theoretically this permits a receive rate from a single comms channel of better than the previous 2000/sec. The major timestamp part of the ID is not changed; at 6 characters it is usable until about year 3700. Updating from previously releases is fully supported: old-format spool files are still usable, and the utilities support both formats. New message will use the new format. The one hints-DB file type which uses message-IDs (the transport wait- DB) will be discarded if an old-format ID is seen; new ones will be built with only new-format IDs. Optionally, a utility can be used to convert spool files from old to new, but this is only an efficiency measure not a requirement for operation Downgrading from new to old requires running a provided utility, having first stopped all operations. This will convert any spool files from new back to old (losing time-precision and PID information) and remove any wait- hints databases. JH/30 Bug 3006: Fix handling of JSON strings having embedded commas. Previously we treated them as item separators when parsing for a list item, but they need to be protected by the doublequotes. While there, add handling for backslashes. JH/31 Bug 2998: Fix ${utf8clean:...} to disallow UTF-16 surrogate codepoints. Found and fixed by Jasen Betts. No testcase for this as my usual text editor insists on emitting only valid UTF-8. JH/32 Fix "tls_dhparam = none" under GnuTLS. At least with 3.7.9 this gave a null-indirection SIGSEGV for the receive process. JH/33 Fix free for live variable $value created by a ${run ...} expansion during -bh use. Internal checking would spot this and take a panic. JH/34 Bug 3013: Fix use of $recipients within arguments for ${run...}. In 4.96 this would expand to empty. JH/35 Bug 3014: GnuTLS: fix expiry date for an auto-generated server certificate. Find and fix by Andreas Metzler. JH/36 Add ARC info to DMARC hostory records. JH/37 Bug 3016: Avoid sending DSN when message was accepted under fakereject or fakedefer. Previously the sender could discover that the message had in fact been accepted. JH/38 Taint-track intermediate values from the peer in multi-stage authentation sequences. Previously the input was not noted as being tainted; notably this resulted in behaviour of LOGIN vs. PLAIN being inconsistent under bad coding of authenticators. JH/39 Bug 3023: Fix crash induced by some combinations of zero-length strings and ${tr...}. Found and diagnosed by Heiko Schlichting. JH/40 Bug 2999: Fix a possible OOB write in the external authenticator, which could be triggered by externally-supplied input. Found by Trend Micro. CVE-2023-42115 JH/41 Bug 3000: Fix a possible OOB write in the SPA authenticator, which could be triggered by externally-controlled input. Found by Trend Micro. CVE-2023-42116 JH/42 Bug 3001: Fix a possible OOB read in the SPA authenticator, which could be triggered by externally-controlled input. Found by Trend Micro. CVE-2023-42114 JH/43 Bug 2903: avoid exit on an attempt to rewrite a malformed address. Make the rewrite never match and keep the logging. Trust the admin to be using verify=header-syntax (to actually reject the message). JH/44 Bug 3033: Harden dnsdb lookups against crafted DNS responses. CVE-2023-42219 HS/02 Fix string_is_ip_address() CVE-2023-42117 (Bug 3031) Exim version 4.96 ----------------- JH/01 Move the wait-for-next-tick (needed for unique message IDs) from after reception to before a subsequent reception. This should mean slightly faster delivery, and also confirmation of reception to senders. JH/02 Move from using the pcre library to pcre2. The former is no longer being developed or supported (by the original developer). JH/03 Constification work in the filters module required a major version bump for the local-scan API. Specifically, the "headers_charset" global which is visible via the API is now const and may therefore not be modified by local-scan code. JH/04 Fix ClamAV TCP use under FreeBSD. Previously the OS-specific shim for sendfile() didi not account for the way the ClamAV driver code called it. JH/05 Bug 2819: speed up command-line messages being read in. Previously a time check was being done for every character; replace that with one per buffer. JH/06 Bug 2815: Fix ALPN sent by server under OpenSSL. Previously the string sent was prefixed with a length byte. JH/07 Change the SMTP feature name for pipelining connect to be compliant with RFC 5321. Previously Dovecot (at least) would log errors during submission. JH/08 Remove stripping of the binaries from the FreeBSD build. This was added in 4.61 without a reason logged. Binaries will be bigger, which might matter on diskspace-constrained systems, but debug is easier. JH/09 Fix macro-definition during "-be" expansion testing. The move to write-protected store for macros had not accounted for these runtime additions; fix by removing this protection for "-be" mode. JH/10 Convert all uses of select() to poll(). FreeBSD 12.2 was found to be handing out large-numbered file descriptors, violating the usual Unix assumption (and required by Posix) that the lowest possible number will be allocated by the kernel when a new one is needed. In the daemon, and any child procesees, values higher than 1024 (being bigger than FD_SETSIZE) are not useable for FD_SET() [and hence select()] and overwrite the stack. Assorted crashes happen. JH/11 Fix use of $sender_host_name in daemon process. When used in certain main-section options or in a connect ACL, the value from the first ever connection was never replaced for subsequent connections. Found by Wakko Warner. JH/12 Bug 2838: Fix for i32lp64 hard-align platforms. Found for SPARC Linux, though only once PCRE2 was introduced: the memory accounting used under debug offset allocations by an int, giving a hard trap in early startup. Change to using a size_t. Debug and fix by John Paul Adrian Glaubitz. JH/13 Bug 2845: Fix handling of tls_require_ciphers for OpenSSL when a value with underbars is given. The write-protection of configuration introduced in 4.95 trapped when normalisation was applied to an option not needing expansion action. JH/14 Bug 1895: TLS: Deprecate RFC 5114 Diffie-Hellman parameters. JH/15 Fix a resource leak in *BSD. An off-by-one error resulted in the daemon failing to close the certificates directory, every hour or any time it was touched. JH/16 Debugging initiated by an ACL control now continues through into routing and transport processes. Previously debugging stopped any time Exim re-execs, or for processing a queued message. JH/17 The "expand" debug selector now gives more detail, specifically on the result of expansion operators and items. JH/18 Bug 2751: Fix include_directory in redirect routers. Previously a bad comparison between the option value and the name of the file to be included was done, and a mismatch was wrongly identified. 4.88 to 4.95 are affected. JH/19 Support for Berkeley DB versions 1 and 2 is withdrawn. JH/20 When built with NDBM for hints DB's check for nonexistence of a name supplied as the db file-pair basename. Previously, if a directory path was given, for example via the autoreply "once" option, the DB file.pag and file.dir files would be created in that directory's parent. JH/21 Remove the "allow_insecure_tainted_data" main config option and the "taint" log_selector. These were previously deprecated. JH/22 Fix static address-list lookups to properly return the matched item. Previously only the domain part was returned. JH/23 Bug 2864: FreeBSD: fix transport hang after 4xx/5xx response. Previously the call into OpenSSL to send a TLS Close was being repeated; this resulted in the library waiting for the peer's Close. If that was never sent we waited forever. Fix by tracking send calls. JH/24 The ${run} expansion item now expands its command string elements after splitting. Previously it was before; the new ordering makes handling zero-length arguments simpler. The old ordering can be obtained by appending a new option "preexpand", after a comma, to the "run". JH/25 Taint-check exec arguments for transport-initiated external processes. Previously, tainted values could be used. This affects "pipe", "lmtp" and "queryprogram" transport, transport-filter, and ETRN commands. The ${run} expansion is also affected: in "preexpand" mode no part of the command line may be tainted, in default mode the executable name may not be tainted. JH/26 Fix CHUNKING on a continued-transport. Previously the usabliility of the the facility was not passed across execs, and only the first message passed over a connection could use BDAT; any further ones using DATA. JH/27 Support the PIPECONNECT facility in the smtp transport when the helo_data uses $sending_ip_address and an interface is specified. Previously any use of the local address in the EHLO name disabled PIPECONNECT, the common case being to use the rDNS of it. JH/28 OpenSSL: fix transport-required OCSP stapling verification under session resumption. Previously verify failed because no certificate status is passed on the wire for the restarted session. Fix by using the recorded ocsp status of the stored session for the new connection. JH/29 TLS resumption: the key for session lookup in the client now includes more info that a server could potentially use in configuring a TLS session, avoiding oferring mismatching sessions to such a server. Previously only the server IP was used. JH/30 Fix string_copyn() for limit greater than actual string length. Previously the copied amount was the limit, which could result in a overlapping memcpy for newly allocated destination soon after a source string shorter than the limit. Found/investigated by KM. JH/31 Bug 2886: GnuTLS: Do not free the cached creds on transport connection close; it may be needed for a subsequent connection. This caused a SEGV on primary-MX defer. Found/investigated by Gedalya & Andreas. JH/32 Fix CHUNKING for a second message on a connection when the first was rejected. Previously we did not reset the chunking-offered state, and erroneously rejected the BDAT command. Investigation help from Jesse Hathaway. JH/33 Fis ${srs_encode ...} to handle an empty sender address, now returning an empty address. Previously the expansion returned an error. HS/01 Bug 2855: Handle a v4mapped sender address given us by a frontending proxy. Previously these were misparsed, leading to paniclog entries. Exim version 4.95 ----------------- JH/01 Bug 1329: Fix format of Maildir-format filenames to match other mail- related applications. Previously an "H" was used where available info says that "M" should be, so change to match. JH/02 Bug 2587: Fix pam expansion condition. Tainted values are commonly used as arguments, so an implementation trying to copy these into a local buffer was taking a taint-enforcement trap. Fix by using dynamically created buffers. Similar fix for radius expansion condition. JH/03 Bug 2586: Fix listcount expansion operator. Using tainted arguments is reasonable, eg. to count headers. Fix by using dynamically created buffers rather than a local. Do similar fixes for ACL actions "dcc", "log_reject_target", "malware" and "spam"; the arguments are expanded so could be handling tainted values. JH/04 Bug 2590: Fix -bi (newaliases). A previous code rearrangement had broken the (no-op) support for this sendmail command. Restore it to doing nothing, silently, and returning good status. JH/05 Bug 2593: Fix "vacation" in Exim filter. Previously, when a "once" record path was given (or the default used) without a leading directory path, an error occurred on trying to open it. Use the transport's working directory. JH/06 Bug 2594: Change the name used for certificate name checks in the smtp transport. Previously it was the name on the DNS A-record; use instead the head of the CNAME chain leading there (if there is one). This seems to align better with RFC 6125. JH/07 Bug 2597: Fix a resource leak. Using a lookup in obtaining a value for smtp_accept_max_per_host allocated resources which were not released when the limit was exceeded. This eventually crashed the daemon. Fix by adding a release action in that path. JH/08 Bug 2598: Fix verify ACL condition. The options for the condition are expanded; previously using tainted values was rejected. Fix by using dynamically-created buffers. JH/09 Relax restrictions on ACL verify condition needing access to message headers. Previously they were only permitted in data and non-smtp ACLs; permit also mime, dkim, prdr quit and notquit. Applies to header-syntax, not_blind, header_sender and header_names_ascii verification. JH/10 Bug 2603: Fix coding of string copying to only evaluate arguments once. Previously a macro used one argument twice; when called with the argument as an expression having side-effects, incorrect operation resulted. Use an inlineable function. JH/11 Bug 2604: Fix request to cutthrough-deliver when a connection is already held open for a verify callout. Previously this wan not accounted for and a corrupt onward SMTP conversation resulted. JH/12 Bug 2607: Fix the ${srs_encode } expansion to handle quoted local_parts. Previously they were embedded naively in the constructed address; when needed, strip the quoting and quote the entire local_part. Also make the inbound_srs expansion condition handle quoting. JH/13 Fix dsearch "subdir" filter to ignore ".". Previously only ".." was excluded, not matching the documentation. JH/14 Bug 2606: Fix a segfault in sqlite lookups. When no, or a bad, filename was given for the sqlite_dbfile a trap resulted. JH/15 Bug 2620: Fix "spam" ACL condition. Previously, tainted values for the "name" argument resulted in a trap. There is no reason to disallow such; this was a coding error. JH/16 Bug 2615: Fix pause during message reception, on systems that have been suspended/resumed. The Linux CLOCK_MONOTONIC does not account for time spent suspended, ignoring the POSIX definition. Previously we assumed it did and a constant offset from real time could be used as a correction. Change to using the same clock source for the start-of-message and the post-message next-tick-wait. Also change to using CLOCK_BOOTTIME if it exists, just to get a clock slightly more aligned to reality. JH/17 Bug 2295: Fix DKIM signing to always semicolon-terminate. Although the RFC says it is optional some validators care. The missing char was not intended but triggered by a line-wrap alignment. Discovery and fix by Guillaume Outters, hacked on by JH. JH/18 Bug 2617: Fix a taint trap in parse_fix_phrase(). Previously when the name being quoted was tainted a trap would be taken. Fix by using dynamically created buffers. The routine could have been called by a rewrite with the "h" flag, by using the "-F" command-line option, or by using a "name=" option on a control=submission ACL modifier. JH/19 SPF: change the Authentication-Results expansion component to give smtp.helo when the sender domain is empty. Previously it gave "smtp.mailfrom=<>" JH/20 Bug 2631: ACL dnslist conditions now ignore and log any lookups returns not in 127.0.0.0/8 to help in spotting list domains taken over by a domain-parking registrar. JH/21 Bug 2630: Fix eol-replacement string for the ${readsocket } expansion. Previously when a whitespace character was specified it was not inserted after removing the newline. JH/22 Bug 2265: Force SNI usage for smtp transport DANE'd connections, to be the domain part of the recipient address. This overrides any tls_sni option set, which was previously used. JH/23 Logging: with the +tls_sni log_selector, do not wrap the received SNI in quotes. JH/24 Bug 2634: Fix a taint trap seen on NetBSD: the testing coded for is_tainted() had an off-by-one error in the overenthusiastic direction. Find and fix by Gavan. Although NetBSD is not a supported platform for 4.94 this bug could affect other platforms. PP/01 Fix default prime selection to be consistent. One path used ike23 still, instead of exim.dev.20160529.3; now both execution flows will use the same DH primes (currently exim.dev.20160529.3). JH/25 OpenSSL: Fix back-compatibility behaviour surrounding tls_certificates option in smtp transport, to match the documentation. Previously verification was not being done in some cases where it should have been. JH/26 Bug 2646: fix a memory usage issue in ldap lookups. Previously, when more than one server was defined and depending on the platform memory layout details, an internal consistency trap could be hit while walking the list of servers. JH/27 Bug 2648: fix the passing of an authenticator public-name through spool files. The value is used by the authresults expansion item. Previously if this was used in a router or transport, a crash could result. JH/28 Fix spurious logging of select error. Some platforms, notably FreeBSD, have a sufficient incidence of EINTR returns from select that an interaction with other operations done by the main daemon loop exposed a bug in the error-handling. This was benign apart from the log messages. JH/29 Bug 2675: add outgoing-interface I= element to deferred "==" log lines, for consistency with delivered "=>" and failed "**" lines. While we're there, handle PRX and TFO. JH/30 Bug 2677: fix matching of long addresses. Since 4.93 a limit of 256 was applied. This resulted, if any header-line rewrite rules were configured, in a panic-log triggerable by sending a message with a long address in a header. Fix by increasing the arbitrary limit to larger than a single (dewrapped) 5322 header line maximum size. JH/31 The ESMTP option name advertised for the SUPPORT_EARLY_PIPE build option is changed from X_PIPE_CONNECT to PIPE_CONNECT. This is in line with RFC 6648 which deprecates X- options in protocols as a general practice. Changeover between the implementations is handled by the mechanisms already coded. JH/32 Bug 2599: fix delay of delivery to a local address where there is also a remote which uses callout/hold. Previously the local was queued. JH/33 Fix a taint trap in the ${listextract } expansion when the source data was tainted. JH/34 Fix the placement of a multiple-message delivery marker in the delivery log line. The asterisk is now consistently appended to the remote IP (and port, if given), and will also be provided on defer and fail log lines. Previously it could be placed on the local IP if that was being logged, and was only provided on delivery lines. JH/35 Bug 2343: Harden exim_tidydb against corrupt wait- files. JH/36 Bug 2687: Fix interpretation of multiple ^ chars in a plaintext authenticator client_send option. Previously the next char, after a pair was collapsed, was taken verbatim (so ^^^foo became ^^foo; ^^^^foo became ^^\x00foo). Fixed to get ^\x00foo and ^^foo respectively to match the documentation. There is still no way to get a leading ^ immediately after a NUL (ie. for the password of a PLAIN method authenticator. JH/37 Enforce the expected size, for fixed-size records read from hints-DB files. For bad sizes read, delete the record and whine to paniclog. JH/38 When logging an AUTH failure, as server, do not include sensitive information. Previously, the credentials would be included if given as part of the AUTH command line and an ACL denied authentication. JH/39 Bug 2691: fix $local_part_data. When the matching list element referred to a file, bad data was returned. This likely also affected $domain_part_data. JH/40 The gsasl authenticator now supports caching of the salted password generated by the client-side implementation. This required the addition of a new variable: $auth4. JH/41 Fix daemon SIGHUP on FreeBSD. Previously, a named socket for IPC was left undeleted; the attempt to re-create it then failed - resulting in the usual "SIGHUP tp have daemon reload configuration" to not work. This affected any platform not supporting "abstract" Unix-domain sockets (i.e. not Linux). JH/42 Bug 2693: Harden against a peer which reneges on a 452 "too many recipients" response to RCPT in a later response, with a 250. The previous coding assumed this would not happen, and under PIPELINING would result in both lost and duplicate recipients for a message. JH/43 Bug 2694: Fix weighted distribution of work to multiple spamd servers. Previously the weighting was incorrectly applied. Similar fix for socks proxies. Found and fixed by Heiko Schlichting. JH/44 Bug 2701: Fix list-expansion of dns_ipv4_lookup. Previously, it did not handle sub-lists included using the +namedlist syntax. While investigating, the same found for dns_trust_aa, dns_again_means_nonexist, dnssec_require_domains, dnssec_request_domains, srv_fail_domains, mx_fail_domains. JH/45 Use a (new) separate store pool-pair for DKIM verify working data. Previously the permanent pool was used, so the store could not be freed. This meant a connection with many messages would use continually-growing memory. JH/46 Use an exponentially-increasing block size when malloc'ing store. Do it per-pool so as not to waste too much space. Previously a constant size was used which resulted in O(n^2) behaviour; now we get O(n log n) making DOS attacks harder. The cost is wasted memory use in the larger blocks. JH/47 Use explicit alloc/free for DNS lookup workspace. This permits using the same space repeatedly, and a smaller process footprint. JH/48 Use a less bogus-looking filename for a temporary used for DH-parameters for GnuTLS. Previously the name started "%s" which, while not a bug, looked as if if might be one. JH/49 Bug 2710: when using SOCKS for additional messages after the first (a "continued connection") make the $proxy_* variables available. Previously the information was not passed across the exec() call for subsequent transport executions. This also mean that the log lines for the messages can show the proxy information. JH/50 Bug 2672: QT elements in log lines, unless disabled, now exclude the receive time. With modern systems the difference is significant. The historical behaviour can be restored by disabling (a new) log_selector "queue_time_exclusive". JH/51 Taint-check ACL line. Previously, only filenames (for out-of-line ACL content) were specifically tested for. Now, also cover expansions resulting in ACL names and inline ACL content. JH/52 Fix ${ip6norm:} operator. Previously, any trailing line text was dropped, making it unusable in complex expressions. JH/53 Bug 2743: fix immediate-delivery via named queue. Previously this would fail with a taint-check on the spoolfile name, and leave the message queued. HS/01 Enforce absolute PID file path name. HS/02 Handle SIGINT as we handle SIGTERM: terminate the Exim process. PP/01 Add a too-many-bad-recipients guard to the default config's RCPT ACL. PP/02 Bug 2643: Correct TLS DH constants. A missing NUL termination in our code-generation tool had led to some incorrect Diffie-Hellman constants in the Exim source. Reported by kylon94, code-gen tool fix by Simon Arlott. PP/03 Impose security length checks on various command-line options. Fixes CVE-2020-SPRSS reported by Qualys. PP/04 Fix Linux security issue CVE-2020-SLCWD and guard against PATH_MAX better. Reported by Qualys. PP/05 Fix security issue CVE-2020-PFPSN and guard against cmdline invoker providing a particularly obnoxious sender full name. Reported by Qualys. PP/06 Fix CVE-2020-28016 (PFPZA): Heap out-of-bounds write in parse_fix_phrase() PP/07 Refuse to allocate too little memory, block negative/zero allocations. Security guard. PP/08 Change default for recipients_max from unlimited to 50,000. PP/09 Fix security issue with too many recipients on a message (to remove a known security problem if someone does set recipients_max to unlimited, or if local additions add to the recipient list). Fixes CVE-2020-RCPTL reported by Qualys. PP/10 Fix security issue in SMTP verb option parsing Fixes CVE-2020-EXOPT reported by Qualys. PP/11 Fix security issue in BDAT state confusion. Ensure we reset known-good where we know we need to not be reading BDAT data, as a general case fix, and move the places where we switch to BDAT mode until after various protocol state checks. Fixes CVE-2020-BDATA reported by Qualys. HS/03 Die on "/../" in msglog file names QS/01 Creation of (database) files in $spool_dir: only uid=0 or the uid of the Exim runtime user are allowed to create files. QS/02 PID file creation/deletion: only possible if uid=0 or uid is the Exim runtime user. QS/03 When reading the output from interpreted forward files we do not pass the pipe between the parent and the interpreting process to executed child processes (if any). QS/04 Always die if requested from internal logging, even is logging is disabled. JH/54 DMARC: recent versions of the OpenDMARC library appear to have broken the API; compilation noo longer completes with DMARC support included. This affects 1.4.1-1 on Fedora 33 (1.3.2-3 is functional); and has been reported on other platforms. JH/55 TLS: as server, reject connections with ALPN indicating non-smtp use. JH/56 Make the majority of info read from config files readonly, for defence-in- depth against exploits. Suggestion by Qualys. Not supported on Solaris 10. JH/57 Fix control=fakreject for a custom message containing tainted data. Previously this resulted in a log complaint, due to a re-expansion present since fakereject was originally introduced. JH/58 GnuTLS: Fix certextract expansion. If a second modifier after a tag modifier was given, a loop resulted. JH/59 DKIM: Fix small-message verification under TLS with chunking. If a pipelined SMTP command followed the BDAT LAST then it would be incorrectly treated as part of the message body, causing a verification fail. JH/60 Bug 2805: Fix logging of domain-literals in Message_ID: headers. They require looser validation rules than those for 821-level addresses, which only permit IP addresses. Exim version 4.94 ----------------- JH/01 Avoid costly startup code when not strictly needed. This reduces time for some exim process initialisations. It does mean that the logging of TLS configuration problems is only done for the daemon startup. JH/02 Early-pipelining support code is now included unless disabled in Makefile. JH/03 DKIM verification defaults no long accept sha1 hashes, to conform to RFC 8301. They can still be enabled, using the dkim_verify_hashes main option. JH/04 Support CHUNKING from an smtp transport using a transport_filter, when DKIM signing is being done. Previously a transport_filter would always disable CHUNKING, falling back to traditional DATA. JH/05 Regard command-line recipients as tainted. JH/06 Bug 340: Remove the daemon pid file on exit, when due to SIGTERM. JH/07 Bug 2489: Fix crash in the "pam" expansion condition. It seems that the PAM library frees one of the arguments given to it, despite the documentation. Therefore a plain malloc must be used. JH/08 Bug 2491: Use tainted buffers for the transport smtp context. Previously on-stack buffers were used, resulting in a taint trap when DSN information copied from a received message was written into the buffer. JH/09 Bug 2493: Harden ARC verify against Outlook, whick has been seen to mix the ordering of its ARC headers. This caused a crash. JH/10 Bug 2492: Use tainted memory for retry record when needed. Previously when a new record was being constructed with information from the peer, a trap was taken. JH/11 Bug 2494: Unset the default for dmarc_tld_file. Previously a naiive installation would get error messages from DMARC verify, when it hit the nonexistent file indicated by the default. Distros wanting DMARC enabled should both provide the file and set the option. Also enforce no DMARC verification for command-line sourced messages. JH/12 Fix an uninitialised flag in early-pipelining. Previously connections could, depending on the platform, hang at the STARTTLS response. JH/13 Bug 2498: Reset a counter used for ARC verify before handling another message on a connection. Previously if one message had ARC headers and the following one did not, a crash could result when adding an Authentication-Results: header. JH/14 Bug 2500: Rewind some of the common-coding in string handling between the Exim main code and Exim-related utities. The introduction of taint tracking also did many adjustments to string handling. Since then, eximon frequently terminated with an assert failure. JH/15 When PIPELINING, synch after every hundred or so RCPT commands sent and check for 452 responses. This slightly helps the inefficieny of doing a large alias-expansion into a recipient-limited target. The max_rcpt transport option still applies (and at the current default, will override the new feature). The check is done for either cause of synch, and forces a fast-retry of all 452'd recipients using a new MAIL FROM on the same connection. The new facility is not tunable at this time. JH/16 Fix the variables set by the gsasl authenticator. Previously a pointer to library live data was being used, so the results became garbage. Make copies while it is still usable. JH/17 Logging: when the deliver_time selector ise set, include the DT= field on delivery deferred (==) and failed (**) lines (if a delivery was attemtped). Previously it was only on completion (=>) lines. JH/18 Authentication: the gsasl driver not provides the $authN variables in time for the expansion of the server_scram_iter and server_scram_salt options. WB/01 SPF: DNS lookups for the obsolete SPF RR type done by the libspf2 library are now specifically given a NO_DATA response without hitting the system resolver. The library goes on to do the now-standard TXT lookup. Use of dnsdb lookups is not affected. JH/19 Bug 2507: Modules: on handling a dynamic-module (lookups) open failure, only retrieve the errormessage once. Previously two calls to dlerror() were used, and the second one (for mainlog/paniclog) retrieved null information. JH/20 Taint checking: disallow use of tainted data for - the appendfile transport file and directory options - the pipe transport command - the autoreply transport file, log and once options - file names used by the redirect router (including filter files) - named-queue names - paths used by single-key lookups Previously this was permitted. JH/21 Bug 2501: Fix init call in the heimdal authenticator. Previously it adjusted the size of a major service buffer; this failed because the buffer was in use at the time. Change to a compile-time increase in the buffer size, when this authenticator is compiled into exim. JH/22 Taint-checking: move to safe-mode taint checking on all platforms. The previous fast-mode was untenable in the face of glibs using mmap to support larger malloc requests. PP/01 Update the openssl_options possible values through OpenSSL 1.1.1c. New values supported, if defined on system where compiled: allow_no_dhe_kex, cryptopro_tlsext_bug, enable_middlebox_compat, no_anti_replay, no_encrypt_then_mac, prioritize_chacha, tlsext_padding JH/23 Performance improvement in the initial phase of a two-pass queue run. By running a limited number of proceses in parallel, a benefit is gained. The amount varies with the platform hardware and load. The use of the option queue_run_in_order means we cannot do this, as ordering becomes indeterminate. JH/24 Bug 2524: fix the cyrus_sasl auth driver gssapi usage. A previous fix had introduced a string-copy (for ensuring NUL-termination) which was not appropriate for that case, which can include embedded NUL bytes in the block of data. Investigation showed the copy to actually be needless, the data being length-specified. JH/25 Fix use of concurrent TLS connections under GnuTLS. When a callout was done during a receiving connection, and both used TLS, global info was used rather than per-connection info for tracking the state of data queued for transmission. This could result in a connection hang. JH/26 Fix use of the SIZE parameter on MAIL commands, on continued connections. Previously, when delivering serveral messages down a single connection only the first would provide a SIZE. This was due to the size information not being properly tracked. JH/27 Bug 2530: When operating in a timezone with sub-minute offset, such as TAI (at 37 seconds currently), pretend to be in UTC for time-related expansion and logging. Previously, spurious values such as a future minute could be seen. JH/28 Bug 2533: Fix expansion of ${tr } item. When called in some situations it could crash from a null-deref. This could also affect the ${addresses: } operator and ${readsock } item. JH/29 Bug 2537: Fix $mime_part_count. When a single connection had a non-mime message following a mime one, the variable was not reset. JH/30 When an pipelined-connect fails at the first response, assume incorrect cached capability (perhaps the peer reneged?) and immediately retry in non-pipelined mode. JH/31 Fix spurious detection of timeout while writing to transport filter. JH/32 Bug 2541: Fix segfault on bad cmdline -f (sender) argument. Previously an attempt to copy the string was made before checking it. JH/33 Fix the dsearch lookup to return an untainted result. Previously the taint of the lookup key was maintained; we now regard the presence in the filesystem as sufficient validation. JH/34 Fix the readsocket expansion to not segfault when an empty "options" argument is supplied. JH/35 The dsearch lookup now requires that the directory is an absolute path. Previously this was not checked, and nonempty relative paths made an access under Exim's current working directory. JH/36 Bug 2554: Fix msg:defer event for the hosts_max_try_hardlimit case. Previously no event was raised. JH/37 Bug 2552: Fix the check on spool space during reception to use the SIZE parameter supplied by the sender MAIL FROM command. Previously it was ignored, and only the check_spool_space option value for the required leeway checked. JH/38 Fix $dkim_key_length. This should, after a DKIM verification, present the size of the signing public-key. Previously it was instead giving the size of the signature hash. JH/39 DKIM verification: the RFC 8301 restriction on sizes of RSA keys is now the default. See the (new) dkim_verify_min_keysizes option. JH/40 Fix a memory-handling bug: when a connection carried multiple messages and an ACL use a lookup for checking either the local_part or domain, stale data could be accessed. Ensure that variable references are dropped between messages. JH/41 Bug 2571: Fix SPA authenticator. Running as a server, an offset supplied by the client was not checked as pointing within response data before being used. A malicious client could thus cause an out-of-bounds read and possibly gain authentication. Fix by adding the check. JH/42 Internationalisation: change the default for downconversion in the smtp transport to be "if needed". Previously it was "as previously set" for the message, which usually meant "if needed" for message-submission but "no" for everything else. However, MTAs have been seen using SMTPUTF8 even when the envelope addresses did not need it, resulting in forwarding failures to non-supporting MTAs. A downconvert in such cases will be a no-op on the addresses, merely dropping the use of SMTPUTF8 by the transport. The change does mean that addresses needing conversion will be converted when previously a delivery failure would occur. JH/43 Fix possible long line in DSN. Previously when a very long SMTP error response was received it would be used unchecked in a fail-DSN, violating standards on line-length limits. Truncate if needed. HS/01 Remove parameters of the link to www.open-spf.org. The linked form doesn't work. (Additionally add a new main config option to configure the spf_smtp_comment) Exim version 4.93 ----------------- JH/01 OpenSSL: With debug enabled output keying information sufficient, server side, to decode a TLS 1.3 packet capture. JH/02 OpenSSL: Suppress the sending of (stateful) TLS1.3 session tickets. Previously the default library behaviour applied, sending two, each in its own TCP segment. JH/03 Debug output for ACL now gives the config file name and line number for each verb. JH/04 The default received_header_text now uses the RFC 8314 tls cipher clause. JH/05 DKIM: ensure that dkim_domain elements are lowercased before use. JH/06 Fix buggy handling of autoreply bounce_return_size_limit, and a possible buffer overrun for (non-chunking) other transports. JH/07 GnuTLS: Our use of late (post-handshake) certificate verification, under TLS1.3, means that a server rejecting a client certificate is not visible to the client until the first read of encrypted data (typically the response to EHLO). Add detection for that case and treat it as a failed TLS connection attempt, so that the normal retry-in-clear can work (if suitably configured). JB/01 Bug 2375: fix expansions of 822 addresses having comments in local-part and/or domain. Found and fixed by Jason Betts. JH/08 Add hardening against SRV & TLSA lookups the hit CNAMEs (a nonvalid configuration). If a CNAME target was not a wellformed name pattern, a crash could result. JH/09 Logging: Fix initial listening-on line for multiple ports for an IP when the OS reports them interleaved with other addresses. JH/10 OpenSSL: Fix aggregation of messages. Previously, when PIPELINING was used both for input and for a verify callout, both encrypted, SMTP responses being sent by the server could be lost. This resulted in dropped connections and sometimes bounces generated by a peer sending to this system. JH/11 Harden plaintext authenticator against a badly misconfigured client-send string. Previously it was possible to cause undefined behaviour in a library routine (usually a crash). Found by "zerons". JH/12 Bug 2384: fix "-bP smtp_receive_timeout". Previously it returned no output. JH/13 Bug 2386: Fix builds with Dane under LibreSSL 2.9.0 onward. Some old API was removed, so update to use the newer ones. JH/14 Bug 1891: Close the log file if receiving a non-smtp message, without any timeout set, is taking a long time. Previously we would hang on to a rotated logfile "forever" if the input was arriving with long gaps (a previous attempt to fix addressed lack, for a long time, of initial input). HS/01 Bug 2390: Use message_id for tempfile creation to avoid races in a shared (NFS) environment. The length of the tempfile name is now 4 + 16 ("hdr.$message_exim_id") which might break on file systems which restrict the file name length to lower values. (It was "hdr.$pid".) HS/02 Bug 2390: Use message_id for tempfile creation to avoid races in a shared (NFS) environment. HS/03 Bug 2392: exigrep does case sensitive *option* processing (as it did for all versions <4.90). Notably -M, -m, --invert, -I may be affected. JH/15 Use unsigned when creating bitmasks in macros, to avoid build errors on some platforms for bit 31. JH/16 GnuTLS: rework ciphersuite strings under recent library versions. Thanks to changes apparently associated with TLS1.3 handling some of the APIs previously used were either nonfunctional or inappropriate. Strings like TLS1.3:ECDHE_SECP256R1__RSA_PSS_RSAE_SHA256__AES_256_GCM__AEAD:256 and TLS1.2:ECDHE_SECP256R1__RSA_SHA256__AES_128_CBC__SHA256:128 replace the previous TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256 . This affects log line X= elements, the $tls_{in,out}_cipher variables, and the use of specific cipher names in the encrypted= ACL condition. JH/17 OpenSSL: the default openssl_options now disables ssl_v3. JH/18 GnuTLS: fix $tls_out_ocsp under hosts_request_ocsp. Previously the verification result was not updated unless hosts_require_ocsp applied. JH/19 Bug 2398: fix listing of a named-queue. Previously, even with the option queue_list_requires_admin set to false, non-admin users were denied the facility. JH/20 Bug 2389: fix server advertising of usable certificates, under GnuTLS in directory-of-certs mode. Previously they were advertised despite the documentation. JH/21 The smtp transport option "hosts_noproxy_tls" is now unset by default. A single TCP connection by a client will now hold a TLS connection open for multiple message deliveries, by default. Previously the default was to not do so. JH/22 The smtp transport option "hosts_try_dane" now enables all hosts by default. If built with the facility, DANE will be used. The facility SUPPORT_DANE is now enabled in the prototype build Makefile "EDITME". JH/23 The build default is now for TLS to be included; the SUPPORT_TLS define is replaced with DISABLE_TLS. Either USE_GNUTLS or (the new) USE_OPENSSL must be defined and you must still, unless you define DISABLE_TLS, manage the the include-dir and library-file requirements that go with that choice. Non-TLS builds are still supported. JH/24 Fix duplicated logging of peer name/address, on a transport connection- reject under TFO. JH/25 The smtp transport option "hosts_try_fastopen" now enables all hosts by default. If the platform supports and has the facility enabled, it will be requested on all coneections. JH/26 The PIPE_CONNECT facility is promoted from experimental status and is now controlled by the build-time option SUPPORT_PIPE_CONNECT. PP/01 Unbreak heimdal_gssapi, broken in 4.92. JH/27 Bug 2404: Use the main-section configuration option "dsn_from" for success-DSN messages. Previously the From: header was always the default one for these; the option was ignored. JH/28 Fix the timeout on smtp response to apply to the whole response. Previously it was reset for every read, so a teergrubing peer sending single bytes within the time limit could extend the connection for a long time. Credit to Qualsys Security Advisory Team for the discovery. JH/29 Fix DSN Final-Recipient: field. Previously it was the post-routing delivery address, which leaked information of the results of local forwarding. Change to the original envelope recipient address, per standards. JH/30 Bug 2411: Fix DSN generation when RFC 3461 failure notification is requested. Previously not bounce was generated and a log entry of error ignored was made. JH/31 Avoid re-expansion in ${sort } expansion. (CVE-2019-13917) JH/32 Introduce a general tainting mechanism for values read from the input channel, and values derived from them. Refuse to expand any tainted values, to catch one form of exploit. JH/33 Bug 2413: Fix dkim_strict option. Previously the expansion result was unused and the unexpanded text used for the test. Found and fixed by Ruben Jenster. JH/34 Fix crash after TLS shutdown. When the TCP/SMTP channel was left open, an attempt to use a TLS library read routine dereffed a nul pointer, causing a segfault. JH/35 Bug 2409: filter out-of-spec chars from callout response before using them in our smtp response. JH/36 Have the general router option retry_use_local_part default to true when any of the restrictive preconditions are set (to anything). Previously it was only for check_local user. The change removes one item of manual configuration which is required for proper retries when a remote router handles a subset of addresses for a domain. JH/37 Appendfile: when evaluating quota use (non-quota_size_regex) take the file link count into consideration. HS/04 Fix handling of very log lines in -H files. If a - line caused the extension of big_buffer, the following lines were ignored. JH/38 Bug 1395: Teach the DNS negative-cache about TTL value from the SOA in accordance with RFC 2308. Previously there was no expiry, so a longlived receive process (eg. due to ACL delays) versus a short SOA value could surprise. HS/05 Handle trailing backslash gracefully. (CVE-2019-15846) JH/39 Promote DMARC support to mainline. JH/40 Bug 2452: Add a References: header to DSNs. JH/41 With GnuTLS 3.6.0 (and later) do not attempt to manage Diffie-Hellman parameters. The relevant library call is documented as "Deprecated: This function is unnecessary and discouraged on GnuTLS 3.6.0 or later. Since 3.6.0, DH parameters are negotiated following RFC7919." HS/06 Change the default of dnssec_request_domains to "*" JH/42 Bug 2545: Fix CHUNKING for all RCPT commands rejected. Previously we carried on and emitted a BDAT command, even when PIPELINING was not active. JH/43 Bug 2465: Fix taint-handling in dsearch lookup. Previously a nontainted buffer was used for the filename, resulting in a trap when tainted arguments (eg. $domain) were used. JH/44 With OpenSSL 1.1.1 (onwards) disable renegotiation for TLS1.2 and below; recommended to avoid a possible server-load attack. The feature can be re-enabled via the openssl_options main cofiguration option. JH/45 local_scan API: documented the current smtp_printf() call. This changed for version 4.90 - adding a "more data" boolean to the arguments. Bumped the ABI version number also, this having been missed previously; release versions 4.90 to 4.92.3 inclusive were effectively broken in respect of usage of smtp_printf() by either local_scan code or libraries accessed via the ${dlfunc } expansion item. Both will need coding adjustment for any calls to smtp_printf() to match the new function signature; a FALSE value for the new argument is always safe. JH/46 FreeBSD: fix use of the sendfile() syscall. The shim was not updating the file-offset (which the Linux syscall does, and exim expects); this resulted in an indefinite loop. JH/47 ARC: fix crash in signing, triggered when a configuration error failed to do ARC verification. The Authentication-Results: header line added by the configuration then had no ARC item. JH/48 Bug 2784: fix shutdown=no in the ${readsocket) expansion item. Previously an incorrect mode was used for reading the result, resulting in it being ignored. Exim version 4.92 ----------------- JH/01 Remove code calling the customisable local_scan function, unless a new definition "HAVE_LOCAL_SCAN=yes" is present in the Local/Makefile. JH/02 Bug 1007: Avoid doing logging from signal-handlers, as that can result in non-signal-safe functions being used. JH/03 Bug 2269: When presented with a received message having a stupidly large number of DKIM-Signature headers, disable DKIM verification to avoid a resource-consumption attack. The limit is set at twenty. JH/04 Add variables $arc_domains, $arc_oldest_pass for ARC verify. Fix the report of oldest_pass in ${authres } in consequence, and separate out some descriptions of reasons for verification fail. JH/05 Bug 2273: Cutthrough delivery left a window where the received messsage files in the spool were present and unlocked. A queue-runner could spot them, resulting in a duplicate delivery. Fix that by doing the unlock after the unlink. Investigation by Tim Stewart. Take the opportunity to add more error-checking on spoolfile handling while that code is being messed with. PP/01 Refuse to open a spool data file (*-D) if it's a symlink. No known attacks, no CVE, this is defensive hardening. JH/06 Bug 2275: The MIME ACL unlocked the received message files early, and a queue-runner could start a delivery while other operations were ongoing. Cutthrough delivery was a common victim, resulting in duplicate delivery. Found and investigated by Tim Stewart. Fix by using the open message data file handle rather than opening another, and not locally closing it (which releases a lock) for that case, while creating the temporary .eml format file for the MIME ACL. Also applies to "regex" and "spam" ACL conditions. JH/07 Bug 177: Make a random-recipient callout success visible in ACL, by setting $sender_verify_failure/$recipient_verify_failure to "random". JH/08 When generating a selfsigned cert, use serial number 1 since zero is not legitimate. JH/09 Bug 2274: Fix logging of cmdline args when starting in an unlinked cwd. Previously this would segfault. JH/10 Fix ARC signing for case when DKIM signing failed. Previously this would segfault. JH/11 Bug 2264: Exim now only follows CNAME chains one step by default. We'd like zero, since the resolver should be doing this for us, But we need one as a CNAME but no MX presence gets the CNAME returned; we need to check that doesn't point to an MX to declare it "no MX returned" rather than "error, loop". A new main option is added so the older capability of following some limited number of chain links is maintained. JH/12 Add client-ip info to non-pass iprev ${authres } lines. JH/13 For receent Openssl versions (1.1 onward) use modern generic protocol methods. These should support TLS 1.3; they arrived with TLS 1.3 and the now-deprecated earlier definitions used only specified the range up to TLS 1.2 (in the older-version library docs). JH/14 Bug 2284: Fix DKIM signing for body lines starting with a pair of dots. JH/15 Rework TLS client-side context management. Stop using a global, and explicitly pass a context around. This enables future use of TLS for connections to service-daemons (eg. malware scanning) while a client smtp connection is using TLS; with cutthrough connections this is quite likely. JH/16 Fix ARC verification to do AS checks in reverse order. JH/17 Support a "tls" option on the ${readsocket } expansion item. JH/18 Bug 2287: Fix the protocol name (eg utf8esmtp) for multiple messages using the SMTPUTF8 option on their MAIL FROM commands, in one connection. Previously the "utf8" would be re-prepended for every additional message. JH/19 Reject MAIL FROM commands with SMTPUTF8 when the facility was not advertised. Previously thery were accepted, resulting in issues when attempting to forward messages to a non-supporting MTA. PP/02 Let -n work with printing macros too, not just options. JH/20 Bug 2296: Fix cutthrough for >1 address redirection. Previously only one parent address was copied, and bogus data was used at delivery-logging time. Either a crash (after delivery) or bogus log data could result. Discovery and analysis by Tim Stewart. PP/03 Make ${utf8clean:} expansion operator detect incomplete final character. Previously if the string ended mid-character, we did not insert the promised '?' replacement. PP/04 Documentation: current string operators work on bytes, not codepoints. JH/21 Change as many as possible of the global flags into one-bit bitfields; these should pack well giving a smaller memory footprint so better caching and therefore performance. Group the declarations where this can't be done so that the byte-sized flag variables are not interspersed among pointer variables, giving a better chance of good packing by the compiler. JH/22 Bug 1896: Fix the envelope from for DMARC forensic reports to be possibly non-null, to avoid issues with sites running BATV. Previously reports were sent with an empty envelope sender so looked like bounces. JH/23 Bug 2318: Fix the noerror command within filters. It wasn't working. The ignore_error flag wasn't being returned from the filter subprocess so was not set for later routers. Investigation and fix by Matthias Kurz. JH/24 Bug 2310: Raise a msg:fail:internal event for each undelivered recipient, and a msg:complete for the whole, when a message is manually removed using -Mrm. Developement by Matthias Kurz, hacked on by JH. JH/25 Avoid fixed-size buffers for pathnames in DB access. This required using a "Gnu special" function, asprintf() in the DB utility binary builds; I hope that is portable enough. JH/26 Bug 2311: Fix DANE-TA verification under GnuTLS. Previously it was also requiring a known-CA anchor certificate; make it now rely entirely on the TLSA as an anchor. Checking the name on the leaf cert against the name on the A-record for the host is still done for TA (but not for EE mode). JH/27 Fix logging of proxy address. Previously, a pointless "PRX=[]:0" would be included in delivery lines for non-proxied connections, when compiled with SUPPORT_SOCKS and running with proxy logging enabled. JH/28 Bug 2314: Fire msg:fail:delivery event even when error is being ignored. Developement by Matthias Kurz, tweaked by JH. While in that bit of code, move the existing event to fire before the normal logging of message failure so that custom logging is bracketed by normal logging. JH/29 Bug 2322: A "fail" command in a non-system filter (file) now fires the msg:fail:internal event. Developement by Matthias Kurz. JH/30 Bug 2329: Increase buffer size used for dns lookup from 2k, which was far too small for todays use of crypto signatures stored there. Go all the way to the max DNS message size of 64kB, even though this might be overmuch for IOT constrained device use. JH/31 Fix a bad use of a copy function, which could be used to pointlessly copy a string over itself. The library routine is documented as not supporting overlapping copies, and on MacOS it actually raised a SIGABRT. JH/32 For main options check_spool_space and check_inode_space, where the platform supports 64b integers, support more than the previous 2^31 kB (i.e. more than 2 TB). Accept E, P and T multipliers in addition to the previous G, M, k. JH/33 Bug 2338: Fix the cyrus-sasl authenticator to fill in the $authenticated_fail_id variable on authentication failure. Previously it was unset. JH/34 Increase RSA keysize of autogen selfsign cert from 1024 to 2048. RHEL 8.0 OpenSSL didn't want to use such a weak key. Do for GnuTLS also, and for more-modern GnuTLS move from GNUTLS_SEC_PARAM_LOW to GNUTLS_SEC_PARAM_MEDIUM. JH/35 OpenSSL: fail the handshake when SNI processing hits a problem, server side. Previously we would continue as if no SNI had been received. JH/36 Harden the handling of string-lists. When a list consisted of a sole "<" character, which should be a list-separator specification, we walked off past the nul-terimation. JH/37 Bug 2341: Send "message delayed" warning MDNs (restricted to external causes) even when the retry time is not yet met. Previously they were not, meaning that when (say) an account was over-quota and temp-rejecting, and multiple senders' messages were queued, only one sender would get notified on each configured delay_warning cycle. JH/38 Bug 2351: Log failures to extract envelope addresses from message headers. JH/39 OpenSSL: clear the error stack after an SSL_accept(). With anon-auth cipher-suites, an error can be left on the stack even for a succeeding accept; this results in impossible error messages when a later operation actually does fail. AM/01 Bug 2359: GnuTLS: repeat lowlevel read and write operations while they return error codes indicating retry. Under TLS1.3 this becomes required. JH/40 Fix the feature-cache refresh for EXPERIMENTAL_PIPE_CONNECT. Previously it only wrote the new authenticators, resulting in a lack of tracking of peer changes of ESMTP extensions until the next cache flush. JH/41 Fix the loop reading a message header line to check for integer overflow, and more-often against header_maxsize. Previously a crafted message could induce a crash of the recive process; now the message is cleanly rejected. JH/42 Bug 2366: Fix the behaviour of the dkim_verify_signers option. It had been totally disabled for all of 4.91. Discovery and fix by "Mad Alex". Exim version 4.91 ----------------- GF/01 DEFER rather than ERROR on redis cluster MOVED response. When redis_servers is set to a list of > 1 element, and the Redis servers in that list are in cluster configuration, convert the REDIS_REPLY_ERROR case of MOVED into a DEFER case instead, thus moving the query onto the next server in the list. For a cluster of N elements, all N servers must be defined in redis_servers. GF/02 Catch and remove uninitialized value warning in exiqsumm Check for existence of @ARGV before looking at $ARGV[0] JH/01 Replace the store_release() internal interface with store_newblock(), which internalises the check required to safely use the old one, plus the allocate and data copy operations duplicated in both (!) of the extant use locations. JH/02 Disallow '/' characters in queue names specified for the "queue=" ACL modifier. This matches the restriction on the commandline. JH/03 Fix pgsql lookup for multiple result-tuples with a single column. Previously only the last row was returned. JH/04 Bug 2217: Tighten up the parsing of DKIM signature headers. Previously we assumed that tags in the header were well-formed, and parsed the element content after inspecting only the first char of the tag. Assumptions at that stage could crash the receive process on malformed input. JH/05 Bug 2215: Fix crash associated with dnsdb lookup done from DKIM ACL. While running the DKIM ACL we operate on the Permanent memory pool so that variables created with "set" persist to the DATA ACL. Also (at any time) DNS lookups that fail create cache records using the Permanent pool. But expansions release any allocations made on the current pool - so a dnsdb lookup expansion done in the DKIM ACL releases the memory used for the DNS negative-cache, and bad things result. Solution is to switch to the Main pool for expansions. While we're in that code, add checks on the DNS cache during store_reset, active in the testsuite. Problem spotted, and debugging aided, by Wolfgang Breyha. JH/06 Fix issue with continued-connections when the DNS shifts unreliably. When none of the hosts presented to a transport match an already-open connection, close it and proceed with the list. Previously we would queue the message. Spotted by Lena with Yahoo, probably involving round-robin DNS. JH/07 Bug 2214: Fix SMTP responses resulting from non-accept result of MIME ACL. Previously a spurious "250 OK id=" response was appended to the proper failure response. JH/08 The "support for" informational output now, which built with Content Scanning support, has a line for the malware scanner interfaces compiled in. Interface can be individually included or not at build time. JH/09 The "aveserver", "kavdaemon" and "mksd" interfaces are now not included by the template makefile "src/EDITME". The "STREAM" support for an older ClamAV interface method is removed. JH/10 Bug 2223: Fix mysql lookup returns for the no-data case (when the number of rows affected is given instead). JH/11 The runtime Berkeley DB library version is now additionally output by "exim -d -bV". Previously only the compile-time version was shown. JH/12 Bug 2230: Fix cutthrough routing for nonfirst messages in an initiating SMTP connection. Previously, when one had more recipients than the first, an abortive onward connection was made. Move to full support for multiple onward connections in sequence, handling cutthrough connection for all multi-message initiating connections. JH/13 Bug 2229: Fix cutthrough routing for nonstandard port numbers defined by routers. Previously, a multi-recipient message would fail to match the onward-connection opened for the first recipient, and cause its closure. JH/14 Bug 2174: A timeout on connect for a callout was also erroneously seen as a timeout on read on a GnuTLS initiating connection, resulting in the initiating connection being dropped. This mattered most when the callout was marked defer_ok. Fix to keep the two timeout-detection methods separate. JH/15 Relax results from ACL control request to enable cutthrough, in unsupported situations, from error to silently (except under debug) ignoring. This covers use with PRDR, frozen messages, queue-only and fake-reject. HS/01 Fix Buffer overflow in base64d() (CVE-2018-6789) JH/16 Fix bug in DKIM verify: a buffer overflow could corrupt the malloc metadata, resulting in a crash in free(). PP/01 Fix broken Heimdal GSSAPI authenticator integration. Broken in f2ed27cf5, missing an equals sign for specified-initialisers. Broken also in d185889f4, with init system revamp. JH/17 Bug 2113: Fix conversation closedown with the Avast malware scanner. Previously we abruptly closed the connection after reading a malware- found indication; now we go on to read the "scan ok" response line, and send a quit. JH/18 Bug 2239: Enforce non-usability of control=utf8_downconvert in the mail ACL. Previously, a crash would result. JH/19 Speed up macro lookups during configuration file read, by skipping non- macro text after a replacement (previously it was only once per line) and by skipping builtin macros when searching for an uppercase lead character. JH/20 DANE support moved from Experimental to mainline. The Makefile control for the build is renamed. JH/21 Fix memory leak during multi-message connections using STARTTLS. A buffer was allocated for every new TLS startup, meaning one per message. Fix by only allocating once (OpenSSL) or freeing on TLS-close (GnuTLS). JH/22 Bug 2236: When a DKIM verification result is overridden by ACL, DMARC reported the original. Fix to report (as far as possible) the ACL result replacing the original. JH/23 Fix memory leak during multi-message connections using STARTTLS under OpenSSL. Certificate information is loaded for every new TLS startup, and the resources needed to be freed. JH/24 Bug 2242: Fix exim_dbmbuild to permit directoryless filenames. JH/25 Fix utf8_downconvert propagation through a redirect router. Previously it was not propagated. JH/26 Bug 2253: For logging delivery lines under PRDR, append the overall DATA response info to the (existing) per-recipient response info for the "C=" log element. It can have useful tracking info from the destination system. Patch from Simon Arlott. JH/27 Bug 2251: Fix ldap lookups that return a single attribute having zero- length value. Previously this would segfault. HS/02 Support Avast multiline protoocol, this allows passing flags to newer versions of the scanner. JH/28 Ensure that variables possibly set during message acceptance are marked dead before release of memory in the daemon loop. This stops complaints about them when the debug_store option is enabled. Discovered specifically for sender_rate_period, but applies to a whole set of variables. Do the same for the queue-runner and queue-list loops, for variables set from spool message files. Do the same for the SMTP per-message loop, for certain variables indirectly set in ACL operations. JH/29 Bug 2250: Fix a longstanding bug in heavily-pipelined SMTP input (such as a multi-recipient message from a mailinglist manager). The coding had an arbitrary cutoff number of characters while checking for more input; enforced by writing a NUL into the buffer. This corrupted long / fast input. The problem was exposed more widely when more pipelineing of SMTP responses was introduced, and one Exim system was feeding another. The symptom is log complaints of SMTP syntax error (NUL chars) on the receiving system, and refused recipients seen by the sending system (propating to people being dropped from mailing lists). Discovered and pinpointed by David Carter. JH/30 The (EXPERIMENTAL_DMARC) variable $dmarc_ar_header is withdrawn, being replaced by the ${authresults } expansion. JH/31 Bug 2257: Fix pipe transport to not use a socket-only syscall. HS/03 Set a handler for SIGTERM and call exit(3) if running as PID 1. This allows proper process termination in container environments. JH/32 Bug 2258: Fix spool_wireformat in combination with LMTP transport. Previously the "final dot" had a newline after it; ensure it is CR,LF. JH/33 SPF: remove support for the "spf" ACL condition outcome values "err_temp" and "err_perm", deprecated since 4.83 when the RFC-defined words "temperror" and "permerror" were introduced. JH/34 Re-introduce enforcement of no cutthrough delivery on transports having transport-filters or DKIM-signing. The restriction was lost in the consolidation of verify-callout and delivery SMTP handling. Extend the restriction to also cover ARC-signing. JH/35 Cutthrough: for a final-dot response timeout (and nonunderstood responses) in defer=pass mode supply a 450 to the initiator. Previously the message would be spooled. PP/02 DANE: add dane_require_tls_ciphers SMTP Transport option; if unset, tls_require_ciphers is used as before. HS/03 Malware Avast: Better match the Avast multiline protocol. Add "pass_unscanned". Only tmpfails from the scanner are written to the paniclog, as they may require admin intervention (permission denied, license issues). Other scanner errors (like decompression bombs) do not cause a paniclog entry. JH/36 Fix reinitialisation of DKIM logging variable between messages. Previously it was possible to log spurious information in receive log lines. JH/37 Bug 2255: Revert the disable of the OpenSSL session caching. This triggered odd behaviour from Outlook Express clients. PP/03 Add util/renew-opendmarc-tlds.sh script for safe renewal of public suffix list. JH/38 DKIM: accept Ed25519 pubkeys in SubjectPublicKeyInfo-wrapped form, since the IETF WG has not yet settled on that versus the original "bare" representation. JH/39 Fix syslog logging for syslog_timestamp=no and log_selector +millisec. Previously the millisecond value corrupted the output. Fix also for syslog_pid=no and log_selector +pid, for which the pid corrupted the output. Exim version 4.90 ----------------- JH/01 Rework error string handling in TLS interface so that the caller in more cases is responsible for logging. This permits library-sourced string to be attached to addresses during delivery, and collapses pairs of long lines into single ones. PP/01 Allow PKG_CONFIG_PATH to be set in Local/Makefile and use it correctly during configuration. Wildcards are allowed and expanded. JH/02 Rework error string handling in DKIM to pass more info back to callers. This permits better logging. JH/03 Rework the transport continued-connection mechanism: when TLS is active, do not close it down and have the child transport start it up again on the passed-on TCP connection. Instead, proxy the child (and any subsequent ones) for TLS via a unix-domain socket channel. Logging is affected: the continued delivery log lines do not have any DNSSEC, TLS Certificate or OCSP information. TLS cipher information is still logged. JH/04 Shorten the log line for daemon startup by collapsing adjacent sets of identical IP addresses on different listening ports. Will also affect "exiwhat" output. PP/02 Bug 2070: uClibc defines __GLIBC__ without providing glibc headers; add noisy ifdef guards to special-case this sillyness. Patch from Bernd Kuhls. JH/05 Tighten up the checking in isip4 (et al): dotted-quad components larger than 255 are no longer allowed. JH/06 Default openssl_options to include +no_ticket, to reduce load on peers. Disable the session-cache too, which might reduce our load. Since we currrectly use a new context for every connection, both as server and client, there is no benefit for these. GnuTLS appears to not support tickets server-side by default (we don't call gnutls_session_ticket_enable_server()) but client side is enabled by default on recent versions (3.1.3 +) unless the PFS priority string is used (3.2.4 +). PP/03 Add $SOURCE_DATE_EPOCH support for reproducible builds, per spec at . JH/07 Fix smtp transport use of limited max_rcpt under mua_wrapper. Previously the check for any unsuccessful recipients did not notice the limit, and erroneously found still-pending ones. JH/08 Pipeline CHUNKING command and data together, on kernels that support MSG_MORE. Only in-clear (not on TLS connections). JH/09 Avoid using a temporary file during transport using dkim. Unless a transport-filter is involved we can buffer the headers in memory for creating the signature, and read the spool data file once for the signature and again for transmission. JH/10 Enable use of sendfile in Linux builds as default. It was disabled in 4.77 as the kernel support then wasn't solid, having issues in 64bit mode. Now, it's been long enough. Add support for FreeBSD also. JH/11 Bug 2104: Fix continued use of a transport connection with TLS. In the case where the routing stage had gathered several addresses to send to a host before calling the transport for the first, we previously failed to close down TLS in the old transport process before passing the TCP connection to the new process. The new one sent a STARTTLS command which naturally failed, giving a failed delivery and bloating the retry database. Investigation and fix prototype from Wolfgang Breyha. JH/12 Fix check on SMTP command input synchronisation. Previously there were false-negatives in the check that the sender had not preempted a response or prompt from Exim (running as a server), due to that code's lack of awareness of the SMTP input buffering. PP/04 Add commandline_checks_require_admin option. Exim drops privileges sanely, various checks such as -be aren't a security problem, as long as you trust local users with access to their own account. When invoked by services which pass untrusted data to Exim, this might be an issue. Set this option in main configuration AND make fixes to the calling application, such as using `--` to stop processing options. JH/13 Do pipelining under TLS. Previously, although safe, no advantage was taken. Now take care to pack both (client) MAIL,RCPT,DATA, and (server) responses to those, into a single TLS record each way (this usually means a single packet). As a side issue, smtp_enforce_sync now works on TLS connections. PP/05 OpenSSL/1.1: use DH_bits() for more accurate DH param sizes. This affects you only if you're dancing at the edge of the param size limits. If you are, and this message makes sense to you, then: raise the configured limit or use OpenSSL 1.1. Nothing we can do for older versions. JH/14 For the "sock" variant of the malware scanner interface, accept an empty cmdline element to get the documented default one. Previously it was inaccessible. JH/15 Fix a crash in the smtp transport caused when two hosts in succession are unsuable for non-message-specific reasons - eg. connection timeout, banner-time rejection. JH/16 Fix logging of delivery remote port, when specified by router, under callout/hold. PP/06 Repair manualroute's ability to take options in any order, even if one is the name of a transport. Fixes bug 2140. HS/01 Cleanup, prevent repeated use of -p/-oMr (CVE-2017-1000369) JH/17 Change the list-building routines interface to use the expanding-string triplet model, for better allocation and copying behaviour. JH/18 Prebuild the data-structure for "builtin" macros, for faster startup. Previously it was constructed the first time a possibly-matching string was met in the configuration file input during startup; now it is done during compilation. JH/19 Bug 2141: Use the full-complex API for Berkeley DB rather than the legacy- compatible one, to avoid the (poorly documented) possibility of a config file in the working directory redirecting the DB files, possibly correpting some existing file. CVE-2017-10140 assigned for BDB. JH/20 Bug 2147: Do not defer for a verify-with-callout-and-random which is not cache-hot. Previously, although the result was properly cached, the initial verify call returned a defer. JH/21 Bug 2151: Avoid using SIZE on the MAIL for a callout verify, on any but the main verify for receipient in uncached-mode. JH/22 Retire historical build files to an "unsupported" subdir. These are defined as "ones for which we have no current evidence of testing". JH/23 DKIM: enforce the DNS pubkey record "h" permitted-hashes optional field, if present. Previously it was ignored. JH/24 Start using specified-initialisers in C structure init coding. This is a C99 feature (it's 2017, so now considered safe). JH/25 Use one-bit bitfields for flags in the "addr" data structure. Previously if was a fixed-sized field and bitmask ops via macros; it is now more extensible. PP/07 GitHub PR 56: Apply MariaDB build fix. Patch provided by Jaroslav Škarvada. PP/08 Bug 2161: Fix regression in sieve quoted-printable handling introduced during Coverity cleanups [4.87 JH/47] Diagnosis and fix provided by Michael Fischer v. Mollard. JH/26 Fix DKIM bug: when the pseudoheader generated for signing was exactly the right size to place the terminating semicolon on its own folded line, the header hash was calculated to an incorrect value thanks to the (relaxed) space the fold became. HS/02 Fix Bug 2130: large writes from the transport subprocess were chunked and confused the parent. JH/27 Fix SOCKS bug: an unitialized pointer was deref'd by the transport process which could crash as a result. This could lead to undeliverable messages. JH/28 Logging: "next input sent too soon" now shows where input was truncated for log purposes. JH/29 Fix queue_run_in_order to ignore the PID portion of the message ID. This matters on fast-turnover and PID-randomising systems, which were getting out-of-order delivery. JH/30 Fix a logging bug on aarch64: an unsafe routine was previously used for a possibly-overlapping copy. The symptom was that "Remote host closed connection in response to HELO" was logged instead of the actual 4xx error for the HELO. JH/31 Fix CHUNKING code to properly flush the unwanted chunk after an error. Previously only that bufferd was discarded, resulting in SYMTP command desynchronisation. JH/32 DKIM: when a message has multiple signatures matching an identity given in dkim_verify_signers, run the dkim acl once for each. Previously only one run was done. Bug 2189. JH/33 Downgrade an unfound-list name (usually a typo in the config file) from "panic the current process" to "deliberately defer". The panic log is still written with the problem list name; the mail and reject logs now get a temp-reject line for the message that was being handled, saying something like "domains check lookup or other defer". The SMTP 451 message is still "Temporary local problem". JH/34 Bug 2199: Fix a use-after-free while reading smtp input for header lines. A crafted sequence of BDAT commands could result in in-use memory beeing freed. CVE-2017-16943. HS/03 Bug 2201: Fix checking for leading-dot on a line during headers reading from SMTP input. Previously it was always done; now only done for DATA and not BDAT commands. CVE-2017-16944. JH/35 Bug 2201: Flush received data in BDAT mode after detecting an error fatal to the message (such as an overlong header line). Previously this was not done and we did not exit BDAT mode. Followon from the previous item though a different problem. Exim version 4.89 ----------------- JH/01 Bug 1922: Support IDNA2008. This has slightly different conversion rules than -2003 did; needs libidn2 in addition to libidn. JH/02 The path option on a pipe transport is now expanded before use. PP/01 GitHub PR 50: Do not call ldap_start_tls_s on ldapi:// connections. Patch provided by "Björn", documentation fix added too. JH/03 Bug 2003: fix Proxy Protocol v2 handling: the address size field was missing a wire-to-host endian conversion. JH/04 Bug 2004: fix CHUNKING in non-PIPELINEING mode. Chunk data following close after a BDAT command line could be taken as a following command, giving a synch failure. Fix by only checking for synch immediately before acknowledging the chunk. PP/02 GitHub PR 52: many spelling fixes, which include fixing parsing of no_require_dnssec option and creation of _HAVE_TRANSPORT_APPEND_MAILDIR macro. Patches provided by Josh Soref. JH/05 Have the EHLO response advertise VRFY, if there is a vrfy ACL defined. Previously we did not; the RFC seems ambiguous and VRFY is not listed by IANA as a service extension. However, John Klensin suggests that we should. JH/06 Bug 2017: Fix DKIM verification in -bh test mode. The data feed into the dkim code may be unix-mode line endings rather than smtp wire-format CRLF, so prepend a CR to any bare LF. JH/07 Rationalise the coding for callout smtp conversations and transport ones. As a side-benfit, callouts can now use PIPELINING hence fewer round-trips. JH/08 Bug 2016: Fix DKIM verification vs. CHUNKING. Any BDAT commands after the first were themselves being wrongly included in the feed into dkim processing; with most chunk sizes in use this resulted in an incorrect body hash calculated value. JH/09 Bug 2014: permit inclusion of a DKIM-Signature header in a received DKIM signature block, for verification. Although advised against by standards it is specifically not ruled illegal. JH/10 Bug 2025: Fix reception of (quoted) local-parts with embedded spaces. JH/11 Bug 2029: Fix crash in DKIM verification when a message signature block is missing a body hash (the bh= tag). JH/12 Bug 2018: Re-order Proxy Protocol startup versus TLS-on-connect startup. It seems that HAProxy sends the Proxy Protocol information in clear and only then does a TLS startup, so do the same. JH/13 Bug 2027: Avoid attempting to use TCP Fast Open for non-transport client TCP connections (such as for Spamd) unless the daemon successfully set Fast Open mode on its listening sockets. This fixes breakage seen on too-old kernels or those not configured for Fast Open, at the cost of requiring both directions being enabled for TFO, and TFO never being used by non-daemon-related Exim processes. JH/14 Bug 2000: Reject messages recieved with CHUNKING but with malformed line endings, at least on the first header line. Try to canonify any that get past that check, despite the cost. JH/15 Angle-bracket nesting (an error inserted by broken sendmails) levels are now limited to an arbitrary five deep, while parsing addresses with the strip_excess_angle_brackets option enabled. PP/03 Bug 2018: For Proxy Protocol and TLS-on-connect, do not over-read and instead leave the unprompted TLS handshake in socket buffer for the TLS library to consume. PP/04 Bug 2018: Also handle Proxy Protocol v2 safely. PP/05 FreeBSD compat: handle that Ports no longer create /usr/bin/perl JH/16 Drop variables when they go out of scope. Memory management drops a whole region in one operation, for speed, and this leaves assigned pointers dangling. Add checks run only under the testsuite which checks all variables at a store-reset and panics on a dangling pointer; add code explicitly nulling out all the variables discovered. Fixes one known bug: a transport crash, where a dangling pointer for $sending_ip_address originally assigned in a verify callout, is re-used. PP/06 Drop '.' from @INC in various Perl scripts. PP/07 Switch FreeBSD iconv to always use the base-system libc functions. PP/08 Reduce a number of compilation warnings under clang; building with CC=clang CFLAGS+=-Wno-dangling-else -Wno-logical-op-parentheses should be warning-free. JH/17 Fix inbound CHUNKING when DKIM disabled at runtime. HS/01 Fix portability problems introduced by PP/08 for platforms where realloc(NULL) is not equivalent to malloc() [SunOS et al]. HS/02 Bug 1974: Fix missing line terminator on the last received BDAT chunk. This allows us to accept broken chunked messages. We need a more general solution here. PP/09 Wrote util/chunking_fixqueue_finalnewlines.pl to help recover already-broken messages in the queue. JH/18 Bug 2061: Fix ${extract } corrupting an enclosing ${reduce } $value. JH/19 Fix reference counting bug in routing-generated-address tracking. Exim version 4.88 ----------------- JH/01 Use SIZE on MAIL FROM in a cutthrough connection, if the destination supports it and a size is available (ie. the sending peer gave us one). JH/02 The obsolete acl condition "demime" is removed (finally, after ten years of being deprecated). The replacements are the ACLs acl_smtp_mime and acl_not_smtp_mime. JH/03 Upgrade security requirements imposed for hosts_try_dane: previously a downgraded non-dane trust-anchor for the TLS connection (CA-style) or even an in-clear connection were permitted. Now, if the host lookup was dnssec and dane was requested then the host is only used if the TLSA lookup succeeds and is dnssec. Further hosts (eg. lower priority MXs) will be tried (for hosts_try_dane though not for hosts_require_dane) if one fails this test. This means that a poorly-configured remote DNS will make it incommunicado; but it protects against a DNS-interception attack on it. JH/04 Bug 1810: make continued-use of an open smtp transport connection non-noisy when a race steals the message being considered. JH/05 If main configuration option tls_certificate is unset, generate a self-signed certificate for inbound TLS connections. JH/06 Bug 165: hide more cases of password exposure - this time in expansions in rewrites and routers. JH/07 Retire gnutls_require_mac et.al. These were nonfunctional since 4.80 and logged a warning sing 4.83; now they are a configuration file error. JH/08 Bug 1836: Fix crash in VRFY handling when handed an unqualified name (lacking @domain). Apply the same qualification processing as RCPT. JH/09 Bug 1804: Avoid writing msglog files when in -bh or -bhc mode. JH/10 Support ${sha256:} applied to a string (as well as the previous certificate). JH/11 Cutthrough: avoid using the callout hints db on a verify callout when a cutthrough deliver is pending, as we always want to make a connection. This also avoids re-routing the message when later placing the cutthrough connection after a verify cache hit. Do not update it with the verify result either. JH/12 Cutthrough: disable when verify option success_on_redirect is used, and when routing results in more than one destination address. JH/13 Cutthrough: expand transport dkim_domain option when testing for dkim signing (which inhibits the cutthrough capability). Previously only the presence of an option was tested; now an expansion evaluating as empty is permissible (obviously it should depend only on data available when the cutthrough connection is made). JH/14 Fix logging of errors under PIPELINING. Previously the log line giving the relevant preceding SMTP command did not note the pipelining mode. JH/15 Fix counting of empty lines in $body_linecount and $message_linecount. Previously they were not counted. JH/16 DANE: treat a TLSA lookup response having all non-TLSA RRs, the same as one having no matching records. Previously we deferred the message that needed the lookup. JH/17 Fakereject: previously logged as a normal message arrival "<="; now distinguished as "(=". JH/18 Bug 1867: make the fail_defer_domains option on a dnslookup router work for missing MX records. Previously it only worked for missing A records. JH/19 Bug 1850: support Radius libraries that return REJECT_RC. JH/20 Bug 1872: Ensure that acl_smtp_notquit is run when the connection drops after the data-go-ahead and data-ack. Patch from Jason Betts. JH/21 Bug 1846: Send DMARC forensic reports for reject and quarantine results, even for a "none" policy. Patch from Tony Meyer. JH/22 Fix continued use of a connection for further deliveries. If a port was specified by a router, it must also match for the delivery to be compatible. JH/23 Bug 1874: fix continued use of a connection for further deliveries. When one of the recipients of a message was unsuitable for the connection (has no matching addresses), we lost track of needing to mark it deferred. As a result mail would be lost. JH/24 Bug 1832: Log EHLO response on getting conn-close response for HELO. JH/25 Decoding ACL controls is now done using a binary search; the source code takes up less space and should be simpler to maintain. Merge the ACL condition decode tables also, with similar effect. JH/26 Fix problem with one_time used on a redirect router which returned the parent address unchanged. A retry would see the parent address marked as delivered, so not attempt the (identical) child. As a result mail would be lost. JH/27 Fix a possible security hole, wherein a process operating with the Exim UID can gain a root shell. Credit to http://www.halfdog.net/ for discovery and writeup. Ubuntu bug 1580454; no bug raised against Exim itself :( JH/28 Enable {spool,log} filesystem space and inode checks as default. Main config options check_{log,spool}_{inodes,space} are now 100 inodes, 10MB unless set otherwise in the configuration. JH/29 Fix the connection_reject log selector to apply to the connect ACL. Previously it only applied to the main-section connection policy options. JH/30 Bug 1897: fix callouts connection fallback from TLS to cleartext. PP/01 Changed default Diffie-Hellman parameters to be Exim-specific, created by me. Added RFC7919 DH primes as an alternative. PP/02 Unbreak build via pkg-config with new hash support when crypto headers are not in the system include path. JH/31 Fix longstanding bug with aborted TLS server connection handling. Under GnuTLS, when a session startup failed (eg because the client disconnected) Exim did stdio operations after fclose. This was exposed by a recent change which nulled out the file handle after the fclose. JH/32 Bug 1909: Fix OCSP proof verification for cases where the proof is signed directly by the cert-signing cert, rather than an intermediate OCSP-signing cert. This is the model used by LetsEncrypt. JH/33 Bug 1914: Ensure socket is nonblocking before draining after SMTP QUIT. HS/01 Fix leak in verify callout under GnuTLS, about 3MB per recipient on an incoming connection. HS/02 Bug 1802: Do not half-close the connection after sending a request to rspamd. HS/03 Use "auto" as the default EC curve parameter. For OpenSSL < 1.0.2 fallback to "prime256v1". JH/34 SECURITY: Use proper copy of DATA command in error message. Could leak key material. Remotely exploitable. CVE-2016-9963. Exim version 4.87 ----------------- JH/01 Bug 1664: Disable OCSP for GnuTLS library versions at/before 3.3.16 and 3.4.4 - once the server is enabled to respond to an OCSP request it does even when not requested, resulting in a stapling non-aware client dropping the TLS connection. TF/01 Code cleanup: Overhaul the debug_selector and log_selector machinery to support variable-length bit vectors. No functional change. TF/02 Improve the consistency of logging incoming and outgoing interfaces. The I= interface field on outgoing lines is now after the H= remote host field, same as incoming lines. There is a separate outgoing_interface log selector which allows you to disable the outgoing I= field. JH/02 Bug 728: Close logfiles after a daemon-process "exceptional" log write. If not running log_selector +smtp_connection the mainlog would be held open indefinitely after a "too many connections" event, including to a deleted file after a log rotate. Leave the per net connection logging leaving it open for efficiency as that will be quickly detected by the check on the next write. HS/01 Bug 1671: Fix post transport crash. Processing the wait- messages could crash the delivery process if the message IDs didn't exist for some reason. When using 'split_spool_directory=yes' the construction of the spool file name failed already, exposing the same netto behaviour. JH/03 Bug 425: Capture substrings in $regex1, $regex2 etc from regex & mime_regex ACL conditions. JH/04 Bug 1686: When compiled with EXPERIMENTAL_DSN_INFO: Add extra information to DSN fail messages (bounces): remote IP, remote greeting, remote response to HELO, local diagnostic string. JH/05 Downgrade message for a TLS-certificate-based authentication fail from log line to debug. Even when configured with a tls authenticator many client connections are expected to not authenticate in this way, so an authenticate fail is not an error. HS/02 Add the Exim version string to the process info. This way exiwhat gives some more detail about the running daemon. JH/06 Bug 1395: time-limit caching of DNS lookups, to the TTL value. This may matter for fast-change records such as DNSBLs. JH/07 Bug 1678: Always record an interface option value, if set, as part of a retry record, even if constant. There may be multiple transports with different interface settings and the retry behaviour needs to be kept distinct. JH/08 Bug 1586: exiqgrep now refuses to run if there are unexpected arguments. JH/09 Bug 1700: ignore space & tab embedded in base64 during decode. JH/10 Bug 840: fix log_defer_output option of pipe transport JH/11 Bug 830: use same host for all RCPTS of a message, even under hosts_randomize. This matters a lot when combined with mua_wrapper. JH/12 Bug 1706: percent and underbar characters are no longer escaped by the ${quote_pgsql:} operator. JH/13 Bug 1708: avoid misaligned access in cached lookup. JH/14 Change header file name for freeradius-client. Relevant if compiling with Radius support; from the Gentoo tree and checked under Fedora. JH/15 Bug 1712: Introduce $prdr_requested flag variable JH/16 Bug 1714: Permit an empty string as expansion result for transport option transport_filter, meaning no filtering. JH/17 Bug 1713: Fix non-PDKIM_DEBUG build. Patch from Jasen Betts. JH/18 Bug 1709: When built with TLS support, the tls_advertise_hosts option now defaults to "*" (all hosts). The variable is now available when not built with TLS, default unset, mainly to enable keeping the testsuite sane. If a server certificate is not supplied (via tls_certificate) an error is logged, and clients will find TLS connections fail on startup. Presumably they will retry in-clear. Packagers of Exim are strongly encouraged to create a server certificate at installation time. HS/03 Add -bP config_file as a synonym for -bP configure_file, for consistency with the $config_file variable. JH/19 Two additional event types: msg:rcpt:defer and msg:rcpt:host:defer. Both in transport context, after the attempt, and per-recipient. The latter type is per host attempted. The event data is the error message, and the errno information encodes the lookup type (A vs. MX) used for the (first) host, and the trailing two digits of the smtp 4xx response. GF/01 Bug 1715: Fix for race condition in exicyclog, where exim could attempt to write to mainlog (or rejectlog, paniclog) in the window between file creation and permissions/ownership being changed. Particularly affects installations where exicyclog is run as root, rather than exim user; result is that the running daemon panics and dies. JH/20 Bug 1701: For MySQL lookups, support MySQL config file option group names. JH/21 Bug 1720: Add support for priority groups and weighted-random proxy selection for the EXPERIMENTAL_SOCKS feature, via new per-proxy options "pri" and "weight". Note that the previous implicit priority given by the list order is no longer honoured. JH/22 Bugs 963, 1721: Fix some corner cases in message body canonicalization for DKIM processing. JH/23 Move SOCKS5 support from Experimental to mainline, enabled for a build by defining SUPPORT_SOCKS. JH/26 Move PROXY support from Experimental to mainline, enabled for a build by defining SUPPORT_PROXY. Note that the proxy_required_hosts option is renamed to hosts_proxy, and the proxy_{host,target}_{address,port}. variables are renamed to proxy_{local,external}_{address,port}. JH/27 Move Internationalisation support from Experimental to mainline, enabled for a build by defining SUPPORT_I18N JH/28 Bug 1745: Fix redis lookups to handle (quoted) spaces embedded in parts of the query string, and make ${quote_redis:} do that quoting. JH/29 Move Events support from Experimental to mainline, enabled by default and removable for a build by defining DISABLE_EVENT. JH/30 Updated DANE implementation code to current from Viktor Dukhovni. JH/31 Fix bug with hosts_connection_nolog and named-lists which were wrongly cached by the daemon. JH/32 Move Redis support from Experimental to mainline, enabled for a build by defining LOOKUP_REDIS. The libhiredis library is required. JH/33 Bug 1748: Permit ACL dnslists= condition in non-smtp ACLs if explicit keys are given for lookup. JH/34 Bug 1192: replace the embedded copy of PolarSSL RSA routines in the DKIM support, by using OpenSSL or GnuTLS library ones. This means DKIM is only supported when built with TLS support. The PolarSSL SHA routines are still used when the TLS library is too old for convenient support. JH/35 Require SINGLE_DH_USE by default in OpenSSL (main config option openssl_options), for security. OpenSSL forces this from version 1.1.0 server-side so match that on older versions. JH/36 Bug 1778: longstanding bug in memory use by the ${run } expansion: A fresh allocation for $value could be released as the expansion processing concluded, but leaving the global pointer active for it. JH/37 Bug 1769: Permit a VRFY ACL to override the default 252 response, and to use the domains and local_parts ACL conditions. JH/38 Fix cutthrough bug with body lines having a single dot. The dot was incorrectly not doubled on cutthrough transmission, hence seen as a body-termination at the receiving system - resulting in truncated mails. Commonly the sender saw a TCP-level error, and retransmitted the message via the normal store-and-forward channel. This could result in duplicates received - but deduplicating mailstores were liable to retain only the initial truncated version. JH/39 Bug 1781: Fix use of DKIM private-keys having trailing '=' in the base-64. JH/40 Fix crash in queryprogram router when compiled with EXPERIMENTAL_SRS. JH/41 Bug 1792: Fix selection of headers to sign for DKIM: bottom-up. While we're in there, support oversigning also; bug 1309. JH/42 Bug 1796: Fix error logged on a malware scanner connection failure. HS/04 Add support for keep_environment and add_environment options. JH/43 Tidy coding issues detected by gcc --fsanitize=undefined. Some remain; either intentional arithmetic overflow during PRNG, or testing config- induced overflows. JH/44 Bug 1800: The combination of a -bhc commandline option and cutthrough delivery resulted in actual delivery. Cancel cutthrough before DATA stage. JH/45 Fix cutthrough, when connection not opened by verify and target hard- rejects a recipient: pass the reject to the originator. JH/46 Multiple issues raised by Coverity. Some were obvious or plausible bugs. Many were false-positives and ignorable, but it's worth fixing the former class. JH/47 Fix build on HP-UX and older Solaris, which need (un)setenv now also for the new environment-manipulation done at startup. Move the routines from being local to tls.c to being global via the os.c file. JH/48 Bug 1807: Fix ${extract } for the numeric/3-string case. While preparsing an extract embedded as result-arg for a map, the first arg for extract is unavailable so we cannot tell if this is a numbered or keyed extraction. Accept either. Exim version 4.86 ----------------- JH/01 Bug 1545: The smtp transport option "retry_include_ip_address" is now expanded. JH/02 The smtp transport option "multi_domain" is now expanded. JH/03 The smtp transport now requests PRDR by default, if the server offers it. JH/04 Certificate name checking on server certificates, when exim is a client, is now done by default. The transport option tls_verify_cert_hostnames can be used to disable this per-host. The build option EXPERIMENTAL_CERTNAMES is withdrawn. JH/05 The value of the tls_verify_certificates smtp transport and main options default to the word "system" to access the system default CA bundle. For GnuTLS, only version 3.0.20 or later. JH/06 Verification of the server certificate for a TLS connection is now tried (but not required) by default. The verification status is now logged by default, for both outbound TLS and client-certificate supplying inbound TLS connections JH/07 Changed the default rfc1413 lookup settings to disable calls. Few sites use this now. JH/08 The EXPERIMENTAL_DSN compile option is no longer needed; all Delivery Status Notification (bounce) messages are now MIME format per RFC 3464. Support for RFC 3461 DSN options NOTIFY,ENVID,RET,ORCPT can be advertised under the control of the dsn_advertise_hosts option, and routers may have a dsn_lasthop option. JH/09 A timeout of 2 minutes is now applied to all malware scanner types by default, modifiable by a malware= option. The list separator for the options can now be changed in the usual way. Bug 68. JH/10 The smtp_receive_timeout main option is now expanded before use. JH/11 The incoming_interface log option now also enables logging of the local interface on delivery outgoing connections. JH/12 The cutthrough-routing facility now supports multi-recipient mails, if the interface and destination host and port all match. JH/13 Bug 344: The verify = reverse_host_lookup ACL condition now accepts a /defer_ok option. JH/14 Bug 1573: The spam= ACL condition now additionally supports Rspamd. Patch from Andrew Lewis. JH/15 Bug 670: The spamd_address main option (for the spam= ACL condition) now supports optional time-restrictions, weighting, and priority modifiers per server. Patch originally by . JH/16 The spamd_address main option now supports a mixed list of local and remote servers. Remote servers can be IPv6 addresses, and specify a port-range. JH/17 Bug 68: The spamd_address main option now supports an optional timeout value per server. JH/18 Bug 1581: Router and transport options headers_add/remove can now have the list separator specified. JH/19 Bug 392: spamd_address, and clamd av_scanner, now support retry option values. JH/20 Bug 1571: Ensure that $tls_in_peerdn is set, when verification fails under OpenSSL. JH/21 Support for the A6 type of dns record is withdrawn. JH/22 Bug 608: The result of a QUIT or not-QUIT toplevel ACL now matters rather than the verbs used. JH/23 Bug 1572: Increase limit on SMTP confirmation message copy size from 255 to 1024 chars. JH/24 Verification callouts now attempt to use TLS by default. HS/01 DNSSEC options (dnssec_require_domains, dnssec_request_domains) are generic router options now. The defaults didn't change. JH/25 Bug 466: Add RFC2322 support for MIME attachment filenames. Original patch from Alexander Shikoff, worked over by JH. HS/02 Bug 1575: exigrep falls back to autodetection of compressed files if ZCAT_COMMAND is not executable. JH/26 Bug 1539: Add timeout/retry options on dnsdb lookups. JH/27 Bug 286: Support SOA lookup in dnsdb lookups. JH/28 Bug 1588: Do not use the A lookup following an AAAA for setting the FQDN. Normally benign, it bites when the pair was led to by a CNAME; modern usage is to not canonicalize the domain to a CNAME target (and we were inconsistent anyway for A-only vs AAAA+A). JH/29 Bug 1632: Removed the word "rejected" from line logged for ACL discards. JH/30 Check the forward DNS lookup for DNSSEC, in addition to the reverse, when evaluating $sender_host_dnssec. JH/31 Check the HELO verification lookup for DNSSEC, adding new $sender_helo_dnssec variable. JH/32 Bug 1397: Enable ECDHE on OpenSSL, just the NIST P-256 curve. JH/33 Bug 1346: Note MAIL cmd seen in -bS batch, to avoid smtp_no_mail log. JH/34 Bug 1648: Fix a memory leak seen with "mailq" and large queues. JH/35 Bug 1642: Fix support of $spam_ variables at delivery time. Was documented as working, but never had. Support all but $spam_report. JH/36 Bug 1659: Guard checking of input smtp commands again pseudo-command added for tls authenticator. HS/03 Add perl_taintmode main config option Exim version 4.85 ----------------- TL/01 When running the test suite, the README says that variables such as no_msglog_check are global and can be placed anywhere in a specific test's script, however it was observed that placement needed to be near the beginning for it to behave that way. Changed the runtest perl script to read through the entire script once to detect and set these variables, reset to the beginning of the script, and then run through the script parsing/test process like normal. TL/02 The BSD's have an arc4random API. One of the functions to induce adding randomness was arc4random_stir(), but it has been removed in OpenBSD 5.5. Detect this OpenBSD version and skip calling this function when detected. JH/01 Expand the EXPERIMENTAL_TPDA feature. Several different events now cause callback expansion. TL/03 Bugzilla 1518: Clarify "condition" processing in routers; that syntax errors in an expansion can be treated as a string instead of logging or causing an error, due to the internal use of bool_lax instead of bool when processing it. JH/02 Add EXPERIMENTAL_DANE, allowing for using the DNS as trust-anchor for server certificates when making smtp deliveries. JH/03 Support secondary-separator specifier for MX, SRV, TLSA lookups. JH/04 Add ${sort {list}{condition}{extractor}} expansion item. TL/04 Bugzilla 1216: Add -M (related messages) option to exigrep. TL/05 GitHub Issue 18: Adjust logic testing for true/false in redis lookups. Merged patch from Sebastian Wiedenroth. JH/05 Fix results-pipe from transport process. Several recipients, combined with certificate use, exposed issues where response data items split over buffer boundaries were not parsed properly. This eventually resulted in duplicates being sent. This issue only became common enough to notice due to the introduction of connection certificate information, the item size being so much larger. Found and fixed by Wolfgang Breyha. JH/06 Bug 1533: Fix truncation of items in headers_remove lists. A fixed size buffer was used, resulting in syntax errors when an expansion exceeded it. JH/07 Add support for directories of certificates when compiled with a GnuTLS version 3.3.6 or later. JH/08 Rename the TPDA experimental facility to Event Actions. The #ifdef is EXPERIMENTAL_EVENT, the main-configuration and transport options both become "event_action", the variables become $event_name, $event_data and $event_defer_errno. There is a new variable $verify_mode, usable in routers, transports and related events. The tls:cert event is now also raised for inbound connections, if the main configuration event_action option is defined. TL/06 In test suite, disable OCSP for old versions of openssl which contained early OCSP support, but no stapling (appears to be less than 1.0.0). JH/09 When compiled with OpenSSL and EXPERIMENTAL_CERTNAMES, the checks on server certificate names available under the smtp transport option "tls_verify_cert_hostname" now do not permit multi-component wildcard matches. JH/10 Time-related extraction expansions from certificates now use the main option "timezone" setting for output formatting, and are consistent between OpenSSL and GnuTLS compilations. Bug 1541. JH/11 Fix a crash in mime ACL when meeting a zero-length, quoted or RFC2047- encoded parameter in the incoming message. Bug 1558. JH/12 Bug 1527: Autogrow buffer used in reading spool files. Since they now include certificate info, eximon was claiming there were spoolfile syntax errors. JH/13 Bug 1521: Fix ldap lookup for single-attr request, multiple-attr return. JH/14 Log delivery-related information more consistently, using the sequence "H= []" wherever possible. TL/07 Bug 1547: Omit RFCs from release. Draft and RFCs have licenses which are problematic for Debian distribution, omit them from the release tarball. JH/15 Updates and fixes to the EXPERIMENTAL_DSN feature. JH/16 Fix string representation of time values on 64bit time_t architectures. Bug 1561. JH/17 Fix a null-indirection in certextract expansions when a nondefault output list separator was used. Exim version 4.84 ----------------- TL/01 Bugzilla 1506: Re-add a 'return NULL' to silence complaints from static checkers that were complaining about end of non-void function with no return. JH/01 Bug 1513: Fix parsing of quoted parameter values in MIME headers. This was a regression introduced in 4.83 by another bugfix. JH/02 Fix broken compilation when EXPERIMENTAL_DSN is enabled. TL/02 Bug 1509: Fix exipick for enhanced spoolfile specification used when EXPERIMENTAL_DSN is enabled. Fix from Wolfgang Breyha. Exim version 4.83 ----------------- TF/01 Correctly close the server side of TLS when forking for delivery. When a message was received over SMTP with TLS, Exim failed to clear up the incoming connection properly after forking off the child process to deliver the message. In some situations the subsequent outgoing delivery connection happened to have the same fd number as the incoming connection previously had. Exim would try to use TLS and fail, logging a "Bad file descriptor" error. TF/02 Portability fix for building lookup modules on Solaris when the xpg4 utilities have not been installed. JH/01 Fix memory-handling in use of acl as a conditional; avoid free of temporary space as the ACL may create new global variables. TL/01 LDAP support uses per connection or global context settings, depending upon the detected version of the libraries at build time. TL/02 Experimental Proxy Protocol support: allows a proxied SMTP connection to extract and use the src ip:port in logging and expansions as if it were a direct connection from the outside internet. PPv2 support was updated based on HAProxy spec change in May 2014. JH/02 Add ${listextract {number}{list}{success}{fail}}. TL/03 Bugzilla 1433: Fix DMARC SEGV with specific From header contents. Properly escape header and check for NULL return. PP/01 Continue incomplete 4.82 PP/19 by fixing docs too: use dns_dnssec_ok not dns_use_dnssec. JH/03 Bugzilla 1157: support log_selector smtp_confirmation for lmtp. TL/04 Add verify = header_names_ascii check to reject email with non-ASCII characters in header names, implemented as a verify condition. Contributed by Michael Fischer v. Mollard. TL/05 Rename SPF condition results err_perm and err_temp to standardized results permerror and temperror. Previous values are deprecated but still accepted. In a future release, err_perm and err_temp will be completely removed, which will be a backward incompatibility if the ACL tests for either of these two old results. Patch contributed by user bes-internal on the mailing list. JH/04 Add ${utf8clean:} operator. Contributed by Alex Rau. JH/05 Bugzilla 305: Log incoming-TLS details on rejects, subject to log selectors, in both main and reject logs. JH/06 Log outbound-TLS and port details, subject to log selectors, for a failed delivery. JH/07 Add malware type "sock" for talking to simple daemon. JH/08 Bugzilla 1371: Add tls_{,try_}verify_hosts to smtp transport. JH/09 Bugzilla 1431: Support (with limitations) headers_add/headers_remove in routers/transports under cutthrough routing. JH/10 Bugzilla 1005: ACL "condition =" should accept values which are negative numbers. Touch up "bool" conditional to keep the same definition. TL/06 Remove duplicated language in spec file from 4.82 TL/16. JH/11 Add dnsdb tlsa lookup. From Todd Lyons. JH/12 Expand items in router/transport headers_add or headers_remove lists individually rather than the list as a whole. Bug 1452. Required for reasonable handling of multiple headers_ options when they may be empty; requires that headers_remove items with embedded colons must have them doubled (or the list-separator changed). TL/07 Add new dmarc expansion variable $dmarc_domain_policy to directly view the policy declared in the DMARC record. Currently, $dmarc_status is a combined value of both the record presence and the result of the analysis. JH/13 Fix handling of $tls_cipher et.al. in (non-verify) transport. Bug 1455. JH/14 New options dnssec_request_domains, dnssec_require_domains on the dnslookup router and the smtp transport (applying to the forward lookup). TL/08 Bugzilla 1453: New LDAP "SERVERS=" option allows admin to override list of ldap servers used for a specific lookup. Patch provided by Heiko Schlichting. JH/18 New options dnssec_lax, dnssec_strict on dnsdb lookups. New variable $lookup_dnssec_authenticated for observability. TL/09 Bugzilla 609: Add -C option to exiqgrep, specify which exim.conf to use. Patch submitted by Lars Timman. JH/19 EXPERIMENTAL_OCSP support under GnuTLS. Bug 1459. TL/10 Bugzilla 1454: New -oMm option to pass message reference to Exim. Requires trusted mode and valid format message id, aborts otherwise. Patch contributed by Heiko Schlichting. JH/20 New expansion variables tls_(in,out)_(our,peer)cert, and expansion item certextract with support for various fields. Bug 1358. JH/21 Observability of OCSP via variables tls_(in,out)_ocsp. Stapling is requested by default, modifiable by smtp transport option hosts_request_ocsp. JH/22 Expansion operators ${md5:string} and ${sha1:string} can now operate on certificate variables to give certificate fingerprints Also new ${sha256:cert_variable}. JH/23 The PRDR feature is moved from being Experimental into the mainline. TL/11 Bug 1119: fix memory allocation in string_printing2(). Patch from Christian Aistleitner. JH/24 The OCSP stapling feature is moved from Experimental into the mainline. TL/12 Bug 1444: Fix improper \r\n sequence handling when writing spool file. Patch from Wolfgang Breyha. JH/25 Expand the coverage of the delivery $host and $host_address to client authenticators run in verify callout. Bug 1476. JH/26 Port service names are now accepted for tls_on_connect_ports, to align with daemon_smtp_ports. Bug 72. TF/03 Fix udpsend. The ip_connectedsocket() function's socket type support and error reporting did not work properly. TL/13 Bug 1495: Exiqgrep check if -C config file specified on cli exists and is readable. Patch from Andrew Colin Kissa. TL/14 Enhance documentation of ${run expansion and how it parses the commandline after expansion, particularly in the case when an unquoted variable expansion results in an empty value. JH/27 The TLS SNI feature was broken in 4.82. Fix it. PP/02 Fix internal collision of T_APL on systems which support RFC3123 by renaming away from it. Addresses GH issue 15, reported by Jasper Wallace. JH/28 Fix parsing of MIME headers for parameters with quoted semicolons. TL/15 SECURITY: prevent double expansion in math comparison functions (can expand unsanitized data). Not remotely exploitable. CVE-2014-2972 Exim version 4.82 ----------------- PP/01 Add -bI: framework, and -bI:sieve for querying sieve capabilities. PP/02 Make -n do something, by making it not do something. When combined with -bP, the name of an option is not output. PP/03 Added tls_dh_min_bits SMTP transport driver option, only honoured by GnuTLS. PP/04 First step towards DNSSEC, provide $sender_host_dnssec for $sender_host_name and config options to manage this, and basic check routines. PP/05 DSCP support for outbound connections and control modifier for inbound. PP/06 Cyrus SASL: set local and remote IP;port properties for driver. (Only plugin which currently uses this is kerberos4, which nobody should be using, but we should make it available and other future plugins might conceivably use it, even though it would break NAT; stuff *should* be using channel bindings instead). PP/07 Handle "exim -L " to indicate to use syslog with tag as the process name; added for Sendmail compatibility; requires admin caller. Handle -G as equivalent to "control = suppress_local_fixups" (we used to just ignore it); requires trusted caller. Also parse but ignore: -Ac -Am -X Bugzilla 1117. TL/01 Bugzilla 1258 - Refactor MAIL FROM optional args processing. TL/02 Add +smtp_confirmation as a default logging option. TL/03 Bugzilla 198 - Implement remove_header ACL modifier. Patch by Magnus Holmgren from 2007-02-20. TL/04 Bugzilla 1281 - Spec typo. Bugzilla 1283 - Spec typo. Bugzilla 1290 - Spec grammar fixes. TL/05 Bugzilla 1285 - Spec omission, fix docbook errors for spec.txt creation. TL/06 Add Experimental DMARC support using libopendmarc libraries. TL/07 Fix an out of order global option causing a segfault. Reported to dev mailing list by by Dmitry Isaikin. JH/01 Bugzilla 1201 & 304 - New cutthrough-delivery feature, with TLS support. JH/02 Support "G" suffix to numbers in ${if comparisons. PP/08 Handle smtp transport tls_sni option forced-fail for OpenSSL. NM/01 Bugzilla 1197 - Spec typo Bugzilla 1196 - Spec examples corrections JH/03 Add expansion operators ${listnamed:name} and ${listcount:string} PP/09 Add gnutls_allow_auto_pkcs11 option (was originally called gnutls_enable_pkcs11, but renamed to more accurately indicate its function. PP/10 Let Linux makefile inherit CFLAGS/CFLAGS_DYNAMIC. Pulled from Debian 30_dontoverridecflags.dpatch by Andreas Metzler. JH/04 Add expansion item ${acl {name}{arg}...}, expansion condition "acl {{name}{arg}...}", and optional args on acl condition "acl = name arg..." JH/05 Permit multiple router/transport headers_add/remove lines. JH/06 Add dnsdb pseudo-lookup "a+" to do an "aaaa" + "a" combination. JH/07 Avoid using a waiting database for a single-message-only transport. Performance patch from Paul Fisher. Bugzilla 1262. JH/08 Strip leading/trailing newlines from add_header ACL modifier data. Bugzilla 884. JH/09 Add $headers_added variable, with content from use of ACL modifier add_header (but not yet added to the message). Bugzilla 199. JH/10 Add 8bitmime log_selector, for 8bitmime status on the received line. Pulled from Bugzilla 817 by Wolfgang Breyha. PP/11 SECURITY: protect DKIM DNS decoding from remote exploit. CVE-2012-5671 (nb: this is the same fix as in Exim 4.80.1) JH/11 Add A= logging on delivery lines, and a client_set_id option on authenticators. JH/12 Add optional authenticated_sender logging to A= and a log_selector for control. PP/12 Unbreak server_set_id for NTLM/SPA auth, broken by 4.80 PP/29. PP/13 Dovecot auth: log better reason to rejectlog if Dovecot did not advertise SMTP AUTH mechanism to us, instead of a generic protocol violation error. Also, make Exim more robust to bad data from the Dovecot auth socket. TF/01 Fix ultimate retry timeouts for intermittently deliverable recipients. When a queue runner is handling a message, Exim first routes the recipient addresses, during which it prunes them based on the retry hints database. After that it attempts to deliver the message to any remaining recipients. It then updates the hints database using the retry rules. So if a recipient address works intermittently, it can get repeatedly deferred at routing time. The retry hints record remains fresh so the address never reaches the final cutoff time. This is a fairly common occurrence when a user is bumping up against their storage quota. Exim had some logic in its local delivery code to deal with this. However it did not apply to per-recipient defers in remote deliveries, e.g. over LMTP to a separate IMAP message store. This change adds a proper retry rule check during routing so that the final cutoff time is checked against the message's age. We only do this check if there is an address retry record and there is not a domain retry record; this implies that previous attempts to handle the address had the retry_use_local_parts option turned on. We use this as an approximation for the destination being like a local delivery, as in LMTP. I suspect this new check makes the old local delivery cutoff check redundant, but I have not verified this so I left the code in place. TF/02 Correct gecos expansion when From: is a prefix of the username. Test 0254 submits a message to Exim with the header Resent-From: f When I ran the test suite under the user fanf2, Exim expanded the header to contain my full name, whereas it should have added a Resent-Sender: header. It erroneously treats any prefix of the username as equal to the username. This change corrects that bug. GF/01 DCC debug and logging tidyup Error conditions log to paniclog rather than rejectlog. Debug lines prefixed by "DCC: " to remove any ambiguity. TF/03 Avoid unnecessary rebuilds of lookup-related code. PP/14 Fix OCSP reinitialisation in SNI handling for Exim/TLS as server. Bug spotted by Jeremy Harris; was flawed since initial commit. Would have resulted in OCSP responses post-SNI triggering an Exim NULL dereference and crash. JH/13 Add $router_name and $transport_name variables. Bugzilla 308. PP/15 Define SIOCGIFCONF_GIVES_ADDR for GNU Hurd. Bug detection, analysis and fix by Samuel Thibault. Bugzilla 1331, Debian bug #698092. SC/01 Update eximstats to watch out for senders sending 'HELO [IpAddr]' JH/14 SMTP PRDR (http://www.eric-a-hall.com/specs/draft-hall-prdr-00.txt). Server implementation by Todd Lyons, client by JH. Only enabled when compiled with EXPERIMENTAL_PRDR. A new config variable "prdr_enable" controls whether the server advertises the facility. If the client requests PRDR a new acl_data_smtp_prdr ACL is called once for each recipient, after the body content is received and before the acl_smtp_data ACL. The client is controlled by both of: a hosts_try_prdr option on the smtp transport, and the server advertisement. Default client logging of deliveries and rejections involving PRDR are flagged with the string "PRDR". PP/16 Fix problems caused by timeouts during quit ACLs trying to double fclose(). Diagnosis by Todd Lyons. PP/17 Update configure.default to handle IPv6 localhost better. Patch by Alain Williams (plus minor tweaks). Bugzilla 880. PP/18 OpenSSL made graceful with empty tls_verify_certificates setting. This is now consistent with GnuTLS, and is now documented: the previous undocumented portable approach to treating the option as unset was to force an expansion failure. That still works, and an empty string is now equivalent. PP/19 Renamed DNSSEC-enabling option to "dns_dnssec_ok", to make it clearer that Exim is using the DO (DNSSEC OK) EDNS0 resolver flag, not performing validation itself. PP/20 Added force_command boolean option to pipe transport. Patch from Nick Koston, of cPanel Inc. JH/15 AUTH support on callouts (and hence cutthrough-deliveries). Bugzilla 321, 823. TF/04 Added udpsend ACL modifier and hexquote expansion operator PP/21 Fix eximon continuous updating with timestamped log-files. Broken in a format-string cleanup in 4.80, missed when I repaired the other false fix of the same issue. Report and fix from Heiko Schlichting. Bugzilla 1363. PP/22 Guard LDAP TLS usage against Solaris LDAP variant. Report from Prashanth Katuri. PP/23 Support safari_ecdhe_ecdsa_bug for openssl_options. It's SecureTransport, so affects any MacOS clients which use the system-integrated TLS libraries, including email clients. PP/24 Fix segfault from trying to fprintf() to a NULL stdio FILE* if using a MIME ACL for non-SMTP local injection. Report and assistance in diagnosis by Warren Baker. TL/08 Adjust exiqgrep to be case-insensitive for sender/receiver. JH/16 Fix comparisons for 64b. Bugzilla 1385. TL/09 Add expansion variable $authenticated_fail_id to keep track of last id that failed so it may be referenced in subsequent ACL's. TL/10 Bugzilla 1375 - Prevent TLS rebinding in ldap. Patch provided by Alexander Miroch. TL/11 Bugzilla 1382 - Option ldap_require_cert overrides start_tls ldap library initialization, allowing self-signed CA's to be used. Also properly sets require_cert option later in code by using NULL (global ldap config) instead of ldap handle (per session). Bug diagnosis and testing by alxgomz. TL/12 Enhanced documentation in the ratelimit.pl script provided in the src/util/ subdirectory. TL/13 Bug 1031 - Imported transport SQL logging patch from Axel Rau renamed to Transport Post Delivery Action by Jeremy Harris, as EXPERIMENTAL_TPDA. TL/14 Bugzilla 1217 - Redis lookup support has been added. It is only enabled when Exim is compiled with EXPERIMENTAL_REDIS. A new config variable redis_servers = needs to be configured which will be used by the redis lookup. Patch from Warren Baker, of The Packet Hub. TL/15 Fix exiqsumm summary for corner case. Patch provided by Richard Hall. TL/16 Bugzilla 1289 - Clarify host/ip processing when have errors looking up a hostname or reverse DNS when processing a host list. Used suggestions from multiple comments on this bug. TL/17 Bugzilla 1057 - Multiple clamd TCP targets patch from Mark Zealey. TL/18 Had previously added a -CONTINUE option to runtest in the test suite. Missed a few lines, added it to make the runtest require no keyboard interaction. TL/19 Bugzilla 1402 - Test 533 fails if any part of the path to the test suite contains upper case chars. Make router use caseful_local_part. TL/20 Bugzilla 1400 - Add AVOID_GNUTLS_PKCS11 build option. Allows GnuTLS support when GnuTLS has been built with p11-kit. Exim version 4.80.1 ------------------- PP/01 SECURITY: protect DKIM DNS decoding from remote exploit. CVE-2012-5671 This, or similar/improved, will also be change PP/11 of 4.82. Exim version 4.80 ----------------- PP/01 Handle short writes when writing local log-files. In practice, only affects FreeBSD (8 onwards). Bugzilla 1053, with thanks to Dmitry Isaikin. NM/01 Bugzilla 949 - Documentation tweak NM/02 Bugzilla 1093 - eximstats DATA reject detection regexps improved. NM/03 Bugzilla 1169 - primary_hostname spelling was incorrect in docs. PP/02 Implemented gsasl authenticator. PP/03 Implemented heimdal_gssapi authenticator with "server_keytab" option. PP/04 Local/Makefile support for (AUTH|LOOKUP)_*_PC=foo to use `pkg-config foo` for cflags/libs. PP/05 Swapped $auth1/$auth2 for gsasl GSSAPI mechanism, to be more consistent with rest of GSASL and with heimdal_gssapi. PP/06 Local/Makefile support for USE_(GNUTLS|OPENSSL)_PC=foo to use `pkg-config foo` for cflags/libs for the TLS implementation. PP/07 New expansion variable $tls_bits; Cyrus SASL server connection properties get this fed in as external SSF. A number of robustness and debugging improvements to the cyrus_sasl authenticator. PP/08 cyrus_sasl server now expands the server_realm option. PP/09 Bugzilla 1214 - Log authentication information in reject log. Patch by Jeremy Harris. PP/10 Added dbmjz lookup type. PP/11 Let heimdal_gssapi authenticator take a SASL message without an authzid. PP/12 MAIL args handles TAB as well as SP, for better interop with non-compliant senders. Analysis and variant patch by Todd Lyons. NM/04 Bugzilla 1237 - fix cases where printf format usage not indicated Bug report from Lars Müller (via SUSE), Patch from Dirk Mueller PP/13 tls_peerdn now print-escaped for spool files. Observed some $tls_peerdn in wild which contained \n, which resulted in spool file corruption. PP/14 TLS fixes for OpenSSL: support TLS 1.1 & 1.2; new "openssl_options" values; set SSL_MODE_AUTO_RETRY so that OpenSSL will retry a read or write after TLS renegotiation, which otherwise led to messages "Got SSL error 2". TK/01 Bugzilla 1239 - fix DKIM verification when signature was not inserted as a tracking header (ie: a signed header comes before the signature). Patch from Wolfgang Breyha. JH/01 Bugzilla 660 - Multi-valued attributes from ldap now parseable as a comma-sep list; embedded commas doubled. JH/02 Refactored ACL "verify =" logic to table-driven dispatch. PP/15 LDAP: Check for errors of TLS initialisation, to give correct diagnostics. Report and patch from Dmitry Banschikov. PP/16 Removed "dont_insert_empty_fragments" from "openssl_options". Removed SSL_clear() after SSL_new() which led to protocol negotiation failures. We appear to now support TLS1.1+ with Exim. PP/17 OpenSSL: new expansion var $tls_sni, which if used in tls_certificate lets Exim select keys and certificates based upon TLS SNI from client. Also option tls_sni on SMTP Transports. Also clear $tls_bits correctly before an outbound SMTP session. New log_selector, +tls_sni. PP/18 Bugzilla 1122 - check localhost_number expansion for failure, avoid NULL dereference. Report and patch from Alun Jones. PP/19 DNS resolver init changes for NetBSD compatibility. (Risk of breakage on less well tested platforms). Obviates NetBSD pkgsrc patch-ac. Not seeing resolver debug output on NetBSD, but suspect this is a resolver implementation change. PP/20 Revert part of NM/04, it broke log_path containing %D expansions. Left warnings. Added "eximon gdb" invocation mode. PP/21 Defaulting "accept_8bitmime" to true, not false. PP/22 Added -bw for inetd wait mode support. PP/23 Added PCRE_CONFIG=yes support to Makefile for using pcre-config to locate the relevant includes and libraries. Made this the default. PP/24 Fixed headers_only on smtp transports (was not sending trailing dot). Bugzilla 1246, report and most of solution from Tomasz Kusy. JH/03 ${eval } now uses 64-bit and supports a "g" suffix (like to "k" and "m"). This may cause build issues on older platforms. PP/25 Revamped GnuTLS support, passing tls_require_ciphers to gnutls_priority_init, ignoring Exim options gnutls_require_kx, gnutls_require_mac & gnutls_require_protocols (no longer supported). Added SNI support via GnuTLS too. Made ${randint:..} supplier available, if using not-too-old GnuTLS. PP/26 Added EXPERIMENTAL_OCSP for OpenSSL. PP/27 Applied dnsdb SPF support patch from Janne Snabb. Applied second patch from Janne, implementing suggestion to default multiple-strings-in-record handling to match SPF spec. JH/04 Added expansion variable $tod_epoch_l for a higher-precision time. PP/28 Fix DCC dcc_header content corruption (stack memory referenced, read-only, out of scope). Patch from Wolfgang Breyha, report from Stuart Northfield. PP/29 Fix three issues highlighted by clang analyser static analysis. Only crash-plausible issue would require the Cambridge-specific iplookup router and a misconfiguration. Report from Marcin Mirosław. PP/30 Another attempt to deal with PCRE_PRERELEASE, this one less buggy. PP/31 %D in printf continues to cause issues (-Wformat=security), so for now guard some of the printf checks behind WANT_DEEPER_PRINTF_CHECKS. As part of this, removing so much warning spew let me fix some minor real issues in debug logging. PP/32 GnuTLS was always using default tls_require_ciphers, due to a missing assignment on my part. Fixed. PP/33 Added tls_dh_max_bits option, defaulting to current hard-coded limit of NSS, for GnuTLS/NSS interop. Problem root cause diagnosis by Janne Snabb (who went above and beyond: thank you). PP/34 Validate tls_require_ciphers on startup, since debugging an invalid string otherwise requires a connection and a bunch more work and it's relatively easy to get wrong. Should also expose TLS library linkage problems. PP/35 Pull in on Linux, for some portability edge-cases of 64-bit ${eval} (JH/03). PP/36 Define _GNU_SOURCE in exim.h; it's needed for some releases of GNU libc to support some of the 64-bit stuff, should not lead to conflicts. Defined before os.h is pulled in, so if a given platform needs to override this, it can. PP/37 Unbreak Cyrus SASL auth: SSF retrieval was incorrect, Exim thought protection layer was required, which is not implemented. Bugzilla 1254, patch from Wolfgang Breyha. PP/38 Overhaul DH prime handling, supply RFC-specified DH primes as built into Exim, default to IKE id 23 from RFC 5114 (2048 bit). Make tls_dhparam take prime identifiers. Also unbreak combination of OpenSSL+DH_params+TLSSNI. PP/39 Disable SSLv2 by default in OpenSSL support. Exim version 4.77 ----------------- PP/01 Solaris build fix for Oracle's LDAP libraries. Bugzilla 1109, patch from Stephen Usher. TF/01 HP/UX build fix: avoid arithmetic on a void pointer. TK/01 DKIM Verification: Fix relaxed canon for empty headers w/o whitespace trailer TF/02 Fix a couple more cases where we did not log the error message when unlink() failed. See also change 4.74-TF/03. TF/03 Make the exiwhat support code safe for signals. Previously Exim might lock up or crash if it happened to be inside a call to libc when it got a SIGUSR1 from exiwhat. The SIGUSR1 handler appends the current process status to the process log which is later printed by exiwhat. It used to use the general purpose logging code to do this, but several functions it calls are not safe for signals. The new output code in the SIGUSR1 handler is specific to the process log, and simple enough that it's easy to inspect for signal safety. Removing some special cases also simplifies the general logging code. Removing the spurious timestamps from the process log simplifies exiwhat. TF/04 Improved ratelimit ACL condition. The /noupdate option has been deprecated in favour of /readonly which has clearer semantics. The /leaky, /strict, and /readonly update modes are mutually exclusive. The update mode is no longer included in the database key; it just determines when the database is updated. (This means that when you upgrade Exim will forget old rate measurements.) Exim now checks that the per_* options are used with an update mode that makes sense for the current ACL. For example, when Exim is processing a message (e.g. acl_smtp_rcpt or acl_smtp_data, etc.) you can specify per_mail/leaky or per_mail/strict; otherwise (e.g. in acl_smtp_helo) you must specify per_mail/readonly. If you omit the update mode it defaults to /leaky where that makes sense (as before) or /readonly where required. The /noupdate option is now undocumented but still supported for backwards compatibility. It is equivalent to /readonly except that in ACLs where /readonly is required you may specify /leaky/noupdate or /strict/noupdate which are treated the same as /readonly. A useful new feature is the /count= option. This is a generalization of the per_byte option, so that you can measure the throughput of other aggregate values. For example, the per_byte option is now equivalent to per_mail/count=${if >{0}{$message_size} {0} {$message_size} }. The per_rcpt option has been generalized using the /count= mechanism (though it's more complicated than the per_byte equivalence). When it is used in acl_smtp_rcpt, the per_rcpt option adds recipients to the measured rate one at a time; if it is used later (e.g. in acl_smtp_data) or in a non-SMTP ACL it adds all the recipients in one go. (The latter /count=$recipients_count behaviour used to work only in non-SMTP ACLs.) Note that using per_rcpt with a non-readonly update mode in more than one ACL will cause the recipients to be double-counted. (The per_mail and per_byte options don't have this problem.) The handling of very low rates has changed slightly. If the computed rate is less than the event's count (usually one) then this event is the first after a long gap. In this case the rate is set to the same as this event's count, so that the first message of a spam run is counted properly. The major new feature is a mechanism for counting the rate of unique events. The new per_addr option counts the number of different recipients that someone has sent messages to in the last time period. It behaves like per_rcpt if all the recipient addresses are different, but duplicate recipient addresses do not increase the measured rate. Like the /count= option this is a general mechanism, so the per_addr option is equivalent to per_rcpt/unique=$local_part@$domain. You can, for example, measure the rate that a client uses different sender addresses with the options per_mail/unique=$sender_address. There are further details in the main documentation. TF/05 Removed obsolete $Cambridge$ CVS revision strings. TF/06 Removed a few PCRE remnants. TF/07 Automatically extract Exim's version number from tags in the git repository when doing development or release builds. PP/02 Raise smtp_cmd_buffer_size to 16kB. Bugzilla 879. Patch from Paul Fisher. PP/03 Implement SSL-on-connect outbound with protocol=smtps on smtp transport. Heavily based on revision 40f9a89a from Simon Arlott's tree. Bugzilla 97. PP/04 Use .dylib instead of .so for dynamic library loading on MacOS. PP/05 Variable $av_failed, true if the AV scanner deferred. Bugzilla 1078. Patch from John Horne. PP/06 Stop make process more reliably on build failure. Bugzilla 1087. Patch from Heiko Schlittermann. PP/07 Make maildir_use_size_file an _expandable_ boolean. Bugzilla 1089. Patch from Heiko Schlittermann. PP/08 Handle ${run} returning more data than OS pipe buffer size. Bugzilla 1131. Patch from Holger Weiß. PP/09 Handle IPv6 addresses with SPF. Bugzilla 860. Patch from Wolfgang Breyha. PP/10 GnuTLS: support TLS 1.2 & 1.1. Bugzilla 1156. Use gnutls_certificate_verify_peers2() [patch from Andreas Metzler]. Bugzilla 1095. PP/11 match_* no longer expand right-hand-side by default. New compile-time build option, EXPAND_LISTMATCH_RHS. New expansion conditions, "inlist", "inlisti". PP/12 fix uninitialised greeting string from PP/03 (smtps client support). PP/13 shell and compiler warnings fixes for RC1-RC4 changes. PP/14 fix log_write() format string regression from TF/03. Bugzilla 1152. Patch from Dmitry Isaikin. Exim version 4.76 ----------------- PP/01 The new ldap_require_cert option would segfault if used. Fixed. PP/02 Harmonised TLS library version reporting; only show if debugging. Layout now matches that introduced for other libraries in 4.74 PP/03. PP/03 New openssl_options items: no_sslv2 no_sslv3 no_ticket no_tlsv1 PP/04 New "dns_use_edns0" global option. PP/05 Don't segfault on misconfiguration of ref:name exim-user as uid. Bugzilla 1098. PP/06 Extra paranoia around buffer usage at the STARTTLS transition. nb: Exim is not vulnerable to http://www.kb.cert.org/vuls/id/555316 TK/01 Updated PolarSSL code to 0.14.2. Bugzilla 1097. Patch from Andreas Metzler. PP/07 Catch divide-by-zero in ${eval:...}. Fixes bugzilla 1102. PP/08 Condition negation of bool{}/bool_lax{} did not negate. Fixed. Bugzilla 1104. TK/02 Bugzilla 1106: CVE-2011-1764 - DKIM log line was subject to a format-string attack -- SECURITY: remote arbitrary code execution. TK/03 SECURITY - DKIM signature header parsing was double-expanded, second time unintentionally subject to list matching rules, letting the header cause arbitrary Exim lookups (of items which can occur in lists, *not* arbitrary string expansion). This allowed for information disclosure. PP/09 Fix another SIGFPE (x86) in ${eval:...} expansion, this time related to INT_MIN/-1 -- value coerced to INT_MAX. Exim version 4.75 ----------------- NM/01 Workaround for PCRE version dependency in version reporting Bugzilla 1073 TF/01 Update valgrind.h and memcheck.h to copies from valgrind-3.6.0. This fixes portability to compilers other than gcc, notably Solaris CC and HP-UX CC. Fixes Bugzilla 1050. TF/02 Bugzilla 139: Avoid using the += operator in the modular lookup makefiles for portability to HP-UX and POSIX correctness. PP/01 Permit LOOKUP_foo enabling on the make command-line. Also via indented variable definition in the Makefile. (Debugging by Oliver Heesakkers). PP/02 Restore caching of spamd results with expanded spamd_address. Patch from author of expandable spamd_address patch, Wolfgang Breyha. PP/03 Build issue: lookups-Makefile now exports LC_ALL=C Improves build reliability. Fix from: Frank Elsner NM/02 Fix wide character breakage in the rfc2047 coding Fixes bug 1064. Patch from Andrey N. Oktyabrski NM/03 Allow underscore in dnslist lookups Fixes bug 1026. Patch from Graeme Fowler PP/04 Bugzilla 230: Support TLS-enabled LDAP (in addition to ldaps). Code patches from Adam Ciarcinski of NetBSD. NM/04 Fixed exiqgrep to cope with mailq missing size issue Fixes bug 943. PP/05 Bugzilla 1083: when lookup expansion defers, escape the output which is logged, to avoid truncation. Patch from John Horne. PP/06 Bugzilla 1042: implement freeze_signal on pipe transports. Patch from Jakob Hirsch. PP/07 Bugzilla 1061: restrict error messages sent over SMTP to not reveal SQL string expansion failure details. Patch from Andrey Oktyabrski. PP/08 Bugzilla 486: implement %M datestamping in log filenames. Patch from Simon Arlott. PP/09 New lookups functionality failed to compile on old gcc which rejects extern declarations in function scope. Patch from Oliver Fleischmann PP/10 Use sig_atomic_t for flags set from signal handlers. Check getgroups() return and improve debugging. Fixed developed for diagnosis in bug 927 (which turned out to be a kernel bug). PP/11 Bugzilla 1055: Update $message_linecount for maildir_tag. Patch from Mark Zealey. PP/12 Bugzilla 1056: Improved spamd server selection. Patch from Mark Zealey. PP/13 Bugzilla 1086: Deal with maildir quota file races. Based on patch from Heiko Schlittermann. PP/14 Bugzilla 1019: DKIM multiple signature generation fix. Patch from Uwe Doering, sign-off by Michael Haardt. NM/05 Fix to spam.c to accommodate older gcc versions which dislike variable declaration deep within a block. Bug and patch from Dennis Davis. PP/15 lookups-Makefile IRIX compatibility coercion. PP/16 Make DISABLE_DKIM build knob functional. NM/06 Bugzilla 968: child_open_uid: restore default SIGPIPE handler Patch by Simon Arlott TF/03 Fix valgrind.h portability to C89 compilers that do not support variable argument macros. Our copy now differs from upstream. Exim version 4.74 ----------------- TF/01 Failure to get a lock on a hints database can have serious consequences so log it to the panic log. TF/02 Log LMTP confirmation messages in the same way as SMTP, controlled using the smtp_confirmation log selector. TF/03 Include the error message when we fail to unlink a spool file. DW/01 Bugzilla 139: Support dynamically loaded lookups as modules. With thanks to Steve Haslam, Johannes Berg & Serge Demonchaux for maintaining out-of-tree patches for some time. PP/01 Bugzilla 139: Documentation and portability issues. Avoid GNU Makefile-isms, let Exim continue to build on BSD. Handle per-OS dynamic-module compilation flags. PP/02 Let /dev/null have normal permissions. The 4.73 fixes were a little too stringent and complained about the permissions on /dev/null. Exempt it from some checks. Reported by Andreas M. Kirchwitz. PP/03 Report version information for many libraries, including Exim version information for dynamically loaded libraries. Created version.h, now support a version extension string for distributors who patch heavily. Dynamic module ABI change. PP/04 CVE-2011-0017 - check return value of setuid/setgid. This is a privilege escalation vulnerability whereby the Exim run-time user can cause root to append content of the attacker's choosing to arbitrary files. PP/05 Bugzilla 1041: merged DCC maintainer's fixes for return code. (Wolfgang Breyha) PP/06 Bugzilla 1071: fix delivery logging with untrusted macros. If dropping privileges for untrusted macros, we disabled normal logging on the basis that it would fail; for the Exim run-time user, this is not the case, and it resulted in successful deliveries going unlogged. Fixed. Reported by Andreas Metzler. Exim version 4.73 ----------------- PP/01 Date: & Message-Id: revert to normally being appended to a message, only prepend for the Resent-* case. Fixes regression introduced in Exim 4.70 by NM/22 for Bugzilla 607. PP/02 Include check_rfc2047_length in configure.default because we're seeing increasing numbers of administrators be bitten by this. JJ/01 Added DISABLE_DKIM and comment to src/EDITME PP/03 Bugzilla 994: added openssl_options main configuration option. PP/04 Bugzilla 995: provide better SSL diagnostics on failed reads. PP/05 Bugzilla 834: provide a permit_coredump option for pipe transports. PP/06 Adjust NTLM authentication to handle SASL Initial Response. PP/07 If TLS negotiated an anonymous cipher, we could end up with SSL but without a peer certificate, leading to a segfault because of an assumption that peers always have certificates. Be a little more paranoid. Problem reported by Martin Tscholak. PP/08 Bugzilla 926: switch ClamAV to use the new zINSTREAM API for content filtering; old API available if built with WITH_OLD_CLAMAV_STREAM=yes NB: ClamAV planning to remove STREAM in "middle of 2010". CL also introduces -bmalware, various -d+acl logging additions and more caution in buffer sizes. PP/09 Implemented reverse_ip expansion operator. PP/10 Bugzilla 937: provide a "debug" ACL control. PP/11 Bugzilla 922: Documentation dusting, patch provided by John Horne. PP/12 Bugzilla 973: Implement --version. PP/13 Bugzilla 752: Refuse to build/run if Exim user is root/0. PP/14 Build without WITH_CONTENT_SCAN. Path from Andreas Metzler. PP/15 Bugzilla 816: support multiple condition rules on Routers. PP/16 Add bool_lax{} expansion operator and use that for combining multiple condition rules, instead of bool{}. Make both bool{} and bool_lax{} ignore trailing whitespace. JJ/02 prevent non-panic DKIM error from being sent to paniclog JJ/03 added tcp_wrappers_daemon_name to allow host entries other than "exim" to be used PP/17 Fix malware regression for cmdline scanner introduced in PP/08. Notification from Dr Andrew Aitchison. PP/18 Change ClamAV response parsing to be more robust and to handle ClamAV's ExtendedDetectionInfo response format. Notification from John Horne. PP/19 OpenSSL 1.0.0a compatibility const-ness change, should be backwards compatible. PP/20 Added a CONTRIBUTING file. Fixed the documentation build to use http: XSL and documented dependency on system catalogs, with examples of how it normally works. DW/21 Added Valgrind hooks in store.c to help it capture out-of-bounds store access. DW/22 Bugzilla 1044: CVE-2010-4345 - partial fix: restrict default behaviour of CONFIGURE_OWNER and CONFIGURE_GROUP options to no longer allow a configuration file which is writeable by the Exim user or group. DW/23 Bugzilla 1044: CVE-2010-4345 - part two: extend checks for writeability of configuration files to cover files specified with the -C option if they are going to be used with root privileges, not just the default configuration file. DW/24 Bugzilla 1044: CVE-2010-4345 - part three: remove ALT_CONFIG_ROOT_ONLY option (effectively making it always true). DW/25 Add TRUSTED_CONFIG_PREFIX_FILE option to allow alternative configuration files to be used while preserving root privileges. DW/26 Set FD_CLOEXEC on SMTP sockets after forking in the daemon, to ensure that rogue child processes cannot use them. PP/27 Bugzilla 1047: change the default for system_filter_user to be the Exim run-time user, instead of root. PP/28 Add WHITELIST_D_MACROS option to let some macros be overridden by the Exim run-time user without dropping privileges. DW/29 Remove use of va_copy() which breaks pre-C99 systems. Duplicate the result string, instead of calling string_vformat() twice with the same arguments. DW/30 Allow TRUSTED_CONFIG_PREFIX_FILE only for Exim or CONFIGURE_OWNER, not for other users. Others should always drop root privileges if they use -C on the command line, even for a whitelisted configure file. DW/31 Turn TRUSTED_CONFIG_PREFIX_FILE into TRUSTED_CONFIG_FILE. No prefixes. NM/01 Fixed bug #1002 - Message loss when using multiple deliveries Exim version 4.72 ----------------- JJ/01 installed exipick 20100104.1, adding $max_received_linelength, $data_path, and $header_path variables; fixed documentation bugs and typos JJ/02 installed exipick 20100222.0, added --input-dir and --finput to allow exipick to access non-standard spools, including the "frozen" queue (Finput) NM/01 Bugzilla 965: Support mysql stored procedures. Patch from Alain Williams NM/02 Bugzilla 961: Spacing fix (syntax error) on Makefile directives for NetBSD NM/03 Bugzilla 955: Documentation fix for max_rcpts. Patch from Andreas Metzler NM/04 Bugzilla 954: Fix for unknown responses from Dovecot authenticator. Patch from Kirill Miazine NM/05 Bugzilla 671: Added umask to procmail example. JJ/03 installed exipick 20100323.0, fixing doc bug NM/06 Bugzilla 988: CVE-2010-2023 - prevent hardlink attack on sticky mail directory. Notification and patch from Dan Rosenberg. TK/01 PDKIM: Upgrade PolarSSL files to upstream version 0.12.1. TK/02 Improve log output when DKIM signing operation fails. MH/01 Treat the transport option dkim_domain as a colon separated list, not as a single string, and sign the message with each element, omitting multiple occurences of the same signer. NM/07 Null terminate DKIM strings, Null initialise DKIM variable Bugzilla 985, 986. Patch by Simon Arlott NM/08 Bugzilla 967. dnsdb DNS TXT record bug fix (DKIM-related) Patch by Simon Arlott PP/01 Bugzilla 989: CVE-2010-2024 - work round race condition on MBX locking. Notification from Dan Rosenberg. Exim version 4.71 ----------------- TK/01 Bugzilla 912: Fix DKIM segfault on empty headers/body. NM/01 Bugzilla 913: Documentation fix for gnutls_* options. NM/02 Bugzilla 722: Documentation for randint. Better randomness defaults. NM/03 Bugzilla 847: Enable DNSDB lookup by default. NM/04 Bugzilla 915: Flag broken perl installation during build. Exim version 4.70 ----------------- TK/01 Added patch by Johannes Berg that expands the main option "spamd_address" if it starts with a dollar sign. TK/02 Write list of recipients to X-Envelope-Sender header when building the mbox-format spool file for content scanning (suggested by Jakob Hirsch). TK/03 Added patch by Wolfgang Breyha that adds experimental DCC (http://www.dcc-servers.net/) support via dccifd. Activated by setting EXPERIMENTAL_DCC=yes in Local/Makefile. TK/04 Bugzilla 673: Add f-protd malware scanner support. Patch submitted by Mark Daniel Reidel . NM/01 Bugzilla 657: Embedded PCRE removed from the exim source tree. When building exim an external PCRE library is now needed - PCRE is a system library on the majority of modern systems. See entry on PCRE_LIBS in EDITME file. NM/02 Bugzilla 646: Removed unwanted C/R in Dovecot authenticator conversation. Added nologin parameter to request. Patch contributed by Kirill Miazine. TF/01 Do not log submission mode rewrites if they do not change the address. TF/02 Bugzilla 662: Fix stack corruption before exec() in daemon.c. NM/03 Bugzilla 602: exicyclog now handles panic log, and creates empty log files in place. Contributed by Roberto Lima. NM/04 Bugzilla 667: Close socket used by dovecot authenticator. TF/03 Bugzilla 615: When checking the local_parts router precondition after a local_part_suffix or local_part_prefix option, Exim now does not use the address's named list lookup cache, since this contains cached lookups for the whole local part. NM/05 Bugzilla 521: Integrated SPF Best Guess support contributed by Robert Millan. Documentation is in experimental-spec.txt. TF/04 Bugzilla 668: Fix parallel build (make -j). NM/05.2 Bugzilla 437: Prevent Maildir aux files being created with mode 000. NM/05.3 Bugzilla 598: Improvement to Dovecot authenticator handling. Patch provided by Jan Srzednicki. TF/05 Leading white space used to be stripped from $spam_report which wrecked the formatting. Now it is preserved. TF/06 Save $spam_score, $spam_bar, and $spam_report in spool files, so that they are available at delivery time. TF/07 Fix the way ${extract is skipped in the untaken branch of a conditional. TF/08 TLS error reporting now respects the incoming_interface and incoming_port log selectors. TF/09 Produce a more useful error message if an SMTP transport's hosts setting expands to an empty string. NM/06 Bugzilla 744: EXPN did not work under TLS. Patch provided by Phil Pennock. NM/07 Bugzilla 769: Extraneous comma in usage fprintf Patch provided by Richard Godbee. NM/08 Fixed erroneous documentation references to smtp_notquit_acl to be acl_smtp_notquit, added index entry. NM/09 Bugzilla 787: Potential buffer overflow in string_format. Patch provided by Eugene Bujak. NM/10 Bugzilla 770: Problem on some platforms modifying the len parameter to accept(). Patch provided by Maxim Dounin. NM/11 Bugzilla 749: Preserve old behaviour of blanks comparing equal to zero. Patch provided by Phil Pennock. NM/12 Bugzilla 497: Correct behaviour of exiwhat when no config exists. NM/13 Bugzilla 590: Correct handling of Resent-Date headers. Patch provided by Brad "anomie" Jorsch. NM/14 Bugzilla 622: Added timeout setting to transport filter. Patch provided by Dean Brooks. TK/05 Add native DKIM support (does not depend on external libraries). NM/15 Bugzilla 854: Removed code that symlinks to pcre as its no longer useful. Patch provided by Graeme Fowler. NM/16 Bugzilla 851: Documentation example syntax fix. NM/17 Changed NOTICE file to remove references to embedded PCRE. NM/18 Bugzilla 894: Fix issue with very long lines including comments in lsearch. NM/19 Bugzilla 745: TLS version reporting. Patch provided by Phil Pennock. NM/20 Bugzilla 167: bool: condition support. Patch provided by Phil Pennock. NM/21 Bugzilla 665: gnutls_compat_mode to allow compatibility with broken clients. Patch provided by Phil Pennock. NM/22 Bugzilla 607: prepend (not append) Resent-Message-ID and Resent-Date. Patch provided by Brad "anomie" Jorsch. NM/23 Bugzilla 687: Fix misparses in eximstats. Patch provided by Heiko Schlittermann. NM/24 Bugzilla 688: Fix exiwhat to handle log_selector = +pid. Patch provided by Heiko Schlittermann. NM/25 Bugzilla 727: Use transport mode as default mode for maildirsize file. plus update to original patch. NM/26 Bugzilla 799: Documentation correction for ratelimit. NM/27 Bugzilla 802: Improvements to local interface IP addr detection. Patch provided by David Brownlee. NM/28 Bugzilla 807: Improvements to LMTP delivery logging. NM/29 Bugzilla 862, 866, 875: Documentation bugfixes. NM/30 Bugzilla 888: TLS documentation bugfixes. NM/31 Bugzilla 896: Dovecot buffer overrun fix. NM/32 Bugzilla 889: Change all instances of "expr" in shell scripts to "expr --" Unlike the original bugzilla I have changed all shell scripts in src tree. NM/33 Bugzilla 898: Transport filter timeout fix. Patch by Todd Rinaldo. NM/34 Bugzilla 901: Fix sign/unsigned and UTF mismatches. Patch by Serge Demonchaux. NM/35 Bugzilla 39: Base64 decode bug fixes. Patch by Jakob Hirsch. NM/36 Bugzilla 909: Correct connect() call in dcc code. NM/37 Bugzilla 910: Correct issue with relaxed/simple handling. NM/38 Bugzilla 908: Removed NetBSD3 support as no longer needed. NM/39 Bugzilla 911: Fixed MakeLinks build script. Exim version 4.69 ----------------- TK/01 Add preliminary DKIM support. Currently requires a forked version of ALT-N's libdkim that I have put here: http://duncanthrax.net/exim-experimental/ Note to Michael Haardt: I had to rename some vars in sieve.c. They were called 'true' and it seems that C99 defines that as a reserved keyword to be used with 'bool' variable types. That means you could not include C99-style headers which use bools without triggering build errors in sieve.c. NM/01 Bugzilla 592: --help option is handled incorrectly if exim is invoked as mailq or other aliases. Changed the --help handling significantly to do whats expected. exim_usage() emits usage/help information. SC/01 Added the -bylocaldomain option to eximstats. NM/02 Bugzilla 619: Defended against bad data coming back from gethostbyaddr. NM/03 Bugzilla 613: Documentation fix for acl_not_smtp. NM/04 Bugzilla 628: PCRE update to 7.4 (work done by John Hall). Exim version 4.68 ----------------- PH/01 Another patch from the Sieve maintainer. PH/02 When an IPv6 address is converted to a string for single-key lookup in an address list (e.g. for an item such as "net24-dbm;/net/works"), dots are used instead of colons so that keys in lsearch files need not contain colons. This was done some time before quoting was made available in lsearch files. However, iplsearch files do require colons in IPv6 keys (notated using the quote facility) so as to distinguish them from IPv4 keys. This meant that lookups for IP addresses in host lists did not work for iplsearch lookups. This has been fixed by arranging for IPv6 addresses to be expressed with colons if the lookup type is iplsearch. This is not incompatible, because previously such lookups could never work. The situation is now rather anomalous, since one *can* have colons in ordinary lsearch keys. However, making the change in all cases is incompatible and would probably break a number of configurations. TK/01 Change PRVS address formatting scheme to reflect latests BATV draft version. MH/01 The "spam" ACL condition code contained a sscanf() call with a %s conversion specification without a maximum field width, thereby enabling a rogue spamd server to cause a buffer overflow. While nobody in their right mind would setup Exim to query an untrusted spamd server, an attacker that gains access to a server running spamd could potentially exploit this vulnerability to run arbitrary code as the Exim user. TK/02 Bugzilla 502: Apply patch to make the SPF-Received: header use $primary_hostname instead of what libspf2 thinks the hosts name is. MH/02 The dsearch lookup now uses lstat(2) instead of stat(2) to look for a directory entry by the name of the lookup key. Previously, if a symlink pointed to a non-existing file or a file in a directory that Exim lacked permissions to read, a lookup for a key matching that symlink would fail. Now it is enough that a matching directory entry exists, symlink or not. (Bugzilla 503.) PH/03 The body_linecount and body_zerocount variables are now exported in the local_scan API. PH/04 Added the $dnslist_matched variable. PH/05 Unset $tls_cipher and $tls_peerdn before making a connection as a client. This means they are set thereafter only if the connection becomes encrypted. PH/06 Added the client_condition to authenticators so that some can be skipped by clients under certain conditions. PH/07 The error message for a badly-placed control=no_multiline_responses left "_responses" off the end of the name. PH/08 Added -Mvc to output a copy of a message in RFC 2822 format. PH/09 Tidied the code for creating ratelimiting keys, creating them explicitly (without spaces) instead of just copying the configuration text. PH/10 Added the /noupdate option to the ratelimit ACL condition. PH/11 Added $max_received_linelength. PH/12 Added +ignore_defer and +include_defer to host lists. PH/13 Installed PCRE version 7.2. This needed some changes because of the new way in which PCRE > 7.0 is built. PH/14 Implemented queue_only_load_latch. PH/15 Removed an incorrect (int) cast when reading the value of SIZE in a MAIL command. The effect was to mangle the value on 64-bit systems. PH/16 Another patch from the Sieve maintainer. PH/17 Added the NOTQUIT ACL, based on a patch from Ted Cooper. PH/18 If a system quota error occurred while trying to create the file for a maildir delivery, the message "Mailbox is full" was not appended to the bounce if the delivery eventually timed out. Change 4.67/27 below applied only to a quota excession during the actual writing of the file. PH/19 It seems that peer DN values may contain newlines (and other non-printing characters?) which causes problems in log lines. The DN values are now passed through string_printing() before being added to log lines. PH/20 Added the "servers=" facility to MySQL and PostgreSQL lookups. (Oracle and InterBase are left for another time.) PH/21 Added message_body_newlines option. PH/22 Guard against possible overflow in moan_check_errorcopy(). PH/23 POSIX allows open() to be a macro; guard against that. PH/24 If the recipient of an error message contained an @ in the local part (suitably quoted, of course), incorrect values were put in $domain and $local_part during the evaluation of errors_copy. Exim version 4.67 ----------------- MH/01 Fix for bug #448, segfault in Dovecot authenticator when interface_address is unset (happens when testing with -bh and -oMi isn't used). Thanks to Jan Srzednicki. PH/01 Added a new log selector smtp_no_mail, to log SMTP sessions that do not issue a MAIL command. PH/02 In an ACL statement such as deny dnslists = X!=127.0.0.2 : X=127.0.0.2 if a client was not listed at all, or was listed with a value other than 127.0.0.2, in the X list, but was listed with 127.0.0.2 in the Y list, the condition was not true (as it should be), so access was not denied. The bug was that the ! inversion was incorrectly passed on to the second item. This has been fixed. PH/03 Added additional dnslists conditions == and =& which are different from = and & when the dns lookup returns more than one IP address. PH/04 Added gnutls_require_{kx,mac,protocols} to give more control over the cipher suites used by GnuTLS. These options are ignored by OpenSSL. PH/05 After discussion on the list, added a compile time option ENABLE_DISABLE_ FSYNC, which compiles an option called disable_fsync that allows for bypassing fsync(). The documentation is heavily laced with warnings. SC/01 Updated eximstats to collate all SpamAssassin rejects into one bucket. PH/06 Some tidies to the infrastructure of the Test Suite that is concerned with the auxiliary C programs that it uses: (1) Arrange for BIND_8_COMPAT to be defined when compiling on OSX (Darwin); (2) Tidies to the Makefile, including adding "make clean"; (3) Added -fPIC when compiling the test dynamically loaded module, to get rid of a warning. MH/02 Fix for bug #451, causing paniclog entries to be written if a bounce message fails, move_frozen_messages = true and ignore_bounce_errors_after = 0s. The bug is otherwise harmless. PH/07 There was a bug in the dovecot authenticator such that the value of $auth1 could be overwritten, and so not correctly preserved, after a successful authentication. This usually meant that the value preserved by the server_setid option was incorrect. PH/08 Added $smtp_count_at_connection_start, deliberately with a long name. PH/09 Installed PCRE release 7.0. PH/10 The acl_not_smtp_start ACL was, contrary to the documentation, not being run for batched SMTP input. It is now run at the start of every message in the batch. While fixing this I discovered that the process information (output by running exiwhat) was not always getting set for -bs and -bS input. This is fixed, and it now also says "batched" for BSMTP. PH/11 Added control=no_pipelining. PH/12 Added $sending_ip_address and $sending_port (mostly Magnus Holmgren's patch, slightly modified), and move the expansion of helo_data till after the connection is made in the smtp transport (so it can use these values). PH/13 Added ${rfc2047d: to decoded RFC 2047 strings. PH/14 Added log_selector = +pid. PH/15 Flush SMTP output before delaying, unless control=no_delay_flush is set. PH/16 Add ${if forany and ${if forall. PH/17 Added dsn_from option to vary the From: line in DSNs. PH/18 Flush SMTP output before performing a callout, unless control = no_callout_flush is set. PH/19 Change 4.64/PH/36 introduced a bug: when address_retry_include_sender was true (the default) a successful delivery failed to delete the retry item, thus causing premature timeout of the address. The bug is now fixed. PH/20 Added hosts_avoid_pipelining to the smtp transport. PH/21 Long custom messages for fakedefer and fakereject are now split up into multiline responses in the same way that messages for "deny" and other ACL rejections are. PH/22 Applied Jori Hamalainen's speed-up changes and typo fixes to exigrep, with slight modification. PH/23 Applied sieve patches from the maintainer "tracking the latest notify draft, changing the syntax and factoring some duplicate code". PH/24 When the log selector "outgoing_port" was set, the port was shown as -1 for deliveries of the second and subsequent messages over the same SMTP connection. PH/25 Applied Magnus Holmgren's patch for ${addresses, ${map, ${filter, and ${reduce, with only minor "tidies". SC/02 Applied Daniel Tiefnig's patch to improve the '($parent) =' pattern match. PH/26 Added a "continue" ACL modifier that does nothing, for the benefit of its expansion side effects. PH/27 When a message times out after an over-quota error from an Exim-imposed quota, the bounce message says "mailbox is full". This message was not being given when it was a system quota that was exceeded. It now should be the same. MH/03 Made $recipients available in local_scan(). local_scan() already has better access to the recipient list through recipients_list[], but $recipients can be useful in postmaster-provided expansion strings. PH/28 The $smtp_command and $smtp_command_argument variables were not correct in the case of a MAIL command with additional options following the address, for example: MAIL FROM: SIZE=1234. The option settings were accidentally chopped off. PH/29 SMTP synchronization checks are implemented when a command is read - there is a check that no more input is waiting when there shouldn't be any. However, for some commands, a delay in an ACL can mean that it is some time before the response is written. In this time, more input might arrive, invalidly. So now there are extra checks after an ACL has run for HELO/EHLO and after the predata ACL, and likewise for MAIL and RCPT when pipelining has not been advertised. PH/30 MH's patch to allow iscntrl() characters to be list separators. PH/31 Unlike :fail:, a custom message specified with :defer: was not being returned in the SMTP response when smtp_return_error_details was false. This has been fixed. PH/32 Change the Dovecot authenticator to use read() and write() on the socket instead of the C I/O that was originally supplied, because problems were reported on Solaris. PH/33 Compile failed with OpenSSL 0.9.8e. This was due to a coding error in Exim which did not show up earlier: it was assuming that a call to SSL_CTX_set_info_callback() might give an error value. In fact, there is no error. In previous releases of OpenSSL, SSL_CTX_set_info_callback() was a macro that became an assignment, so it seemed to work. This has changed to a proper function call with a void return, hence the compile error. Exim's code has been fixed. PH/34 Change HDA_SIZE in oracle.c from 256 to 512. This is needed for 64-bit cpus. PH/35 Applied a patch from the Sieve maintainer which fixes a bug in "notify". PH/36 Applied John Jetmore's patch to add -v functionality to exigrep. PH/37 If a message is not accepted after it has had an id assigned (e.g. because it turns out to be too big or there is a timeout) there is no "Completed" line in the log. When some messages of this type were selected by exigrep, they were listed as "not completed". Others were picked up by some special patterns. I have improved the selection criteria to be more general. PH/38 The host_find_failed option in the manualroute router can now be set to "ignore", to completely ignore a host whose IP address cannot be found. If all hosts are ignored, the behaviour is controlled by the new host_all_ignored option. PH/39 In a list of hosts for manualroute, if one item (either because of multi- homing or because of multiple MX records with /mx) generated more than one IP address, and the following item turned out to be the local host, all the secondary addresses of the first item were incorrectly removed from the list, along with the local host and any following hosts (which is what is supposed to happen). PH/40 When Exim receives a message, it writes the login name, uid, and gid of whoever called Exim into the -H file. In the case of the daemon it was behaving confusingly. When first started, it used values for whoever started the daemon, but after a SIGHUP it used the Exim user (because it calls itself on a restart). I have changed the code so that it now always uses the Exim user. PH/41 (Following a suggestion from Tony Finch) If all the RCPT commands in a message are rejected with the same error (e.g. no authentication or bad sender address), and a DATA command is nevertheless sent (as can happen with PIPELINING or a stupid MUA), the error message that was given to the RCPT commands is included in the rejection of the DATA command. This is intended to be helpful for MUAs that show only the final error to their users. PH/42 Another patch from the Sieve maintainer. SC/02 Eximstats - Differentiate between permanent and temporary rejects. Eximstats - Fixed some broken HTML links and added missing column headers (Jez Hancock). Eximstats - Fixed Grand Total Summary Domains, Edomains, and Email columns for Rejects, Temp Rejects, Ham, and Spam rows. SC/03 Eximstats - V1.58 Fix to get <> and blackhole to show in edomain tables. PH/43 Yet another patch from the Sieve maintainer. PH/44 I found a way to check for a TCP/IP connection going away before sending the response to the final '.' that terminates a message, but only in the case where the client has not sent further data following the '.' (unfortunately, this is allowed). However, in many cases there won't be any further data because there won't be any more messages to send. A call to select() can be used: if it shows that the input is "ready", there is either input waiting, or the socket has been closed. An attempt to read the next input character can distinguish the two cases. Previously, Exim would have sent an OK response which the client would never have see. This could lead to message repetition. This fix should cure that, at least in a lot of common cases. PH/45 Do not advertise STARTTLS in response to HELP unless it would be advertised in response to EHLO. Exim version 4.66 ----------------- PH/01 Two more bugs that were introduced by 4.64/PH/07, in addition to the one fixed by 4.65/MH/01 (is this a record?) are fixed: (i) An empty string was always treated as zero by the numeric comparison operators. This behaviour has been restored. (ii) It is documented that the numeric comparison operators always treat their arguments as decimal numbers. This was broken in that numbers starting with 0 were being interpreted as octal. While fixing these problems I realized that there was another issue that hadn't been noticed. Values of message_size_limit (both the global option and the transport option) were treated as octal if they started with 0. The documentation was vague. These values are now always treated as decimal, and I will make that clear in the documentation. Exim version 4.65 ----------------- TK/01 Disable default definition of HAVE_LINUX_SENDFILE. Clashes with Linux large file support (_FILE_OFFSET_BITS=64) on older glibc versions. (#438) MH/01 Don't check that the operands of numeric comparison operators are integers when their expansion is in "skipping" mode (fixes bug introduced by 4.64-PH/07). PH/01 If a system filter or a router generates more than SHRT_MAX (32767) child addresses, Exim now panics and dies. Previously, because the count is held in a short int, deliveries were likely to be lost. As such a large number of recipients for a single message is ridiculous (performance will be very, very poor), I have chosen to impose a limit rather than extend the field. Exim version 4.64 ----------------- TK/01 Bugzilla #401. Fix DK spooling code so that it can overwrite a leftover -K file (the existence of which was triggered by #402). While we were at it, introduced process PID as part of the -K filename. This should rule out race conditions when creating these files. TK/02 Bugzilla #402. Apply patch from Simon Arlott, speeding up DK signing processing considerably. Previous code took too long for large mails, triggering a timeout which in turn triggers #401. TK/03 Introduced HAVE_LINUX_SENDFILE to os.h-Linux. Currently only used in the DK code in transports.c. sendfile() is not really portable, hence the _LINUX specificness. TF/01 In the add_headers option to the mail command in an Exim filter, there was a bug that Exim would claim a syntax error in any header after the first one which had an odd number of characters in the field name. PH/01 If a server that rejects MAIL FROM:<> was the target of a sender callout verification, Exim cached a "reject" for the entire domain. This is correct for most verifications, but it is not correct for a recipient verification with use_sender or use_postmaster set, because in that case the callout does not use MAIL FROM:<>. Exim now distinguishes the special case of MAIL FROM:<> rejection from other early rejections (e.g. rejection of HELO). When verifying a recipient using a non-null MAIL address, the cache is ignored if it shows MAIL FROM:<> rejection. Whatever the result of the callout, the value of the domain cache is left unchanged (for any other kind of callout, getting as far as trying RCPT means that the domain itself is ok). PH/02 Tidied a number of unused variable and signed/unsigned warnings that gcc 4.1.1 threw up. PH/03 On Solaris, an unexpectedly close socket (dropped connection) can manifest itself as EPIPE rather than ECONNECT. When tidying away a session, the daemon ignores ECONNECT errors and logs others; it now ignores EPIPE as well. PH/04 Applied Nico Erfurth's refactoring patch to tidy up mime.c (quoted-printable decoding). PH/05 Applied Nico Erfurth's refactoring patch to tidy up spool_mbox.c, and later the small subsequent patch to fix an introduced bug. PH/06 Installed the latest Cygwin Makefile from the Cygwin maintainer. PH/07 There was no check for overflow in expansions such as ${if >{1}{4096M}}. PH/08 An error is now given if message_size_limit is specified negative. PH/09 Applied and tidied up Jakob Hirsch's patch for allowing ACL variables to be given (somewhat) arbitrary names. JJ/01 exipick 20060919.0, allow for arbitrary acl_ variables introduced in 4.64-PH/09. JJ/02 exipick 20060919.0, --show-vars args can now be regular expressions, miscellaneous code fixes PH/10 Added the log_reject_target ACL modifier to specify where to log rejections. PH/11 Callouts were setting the name used for EHLO/HELO from $smtp_active_ hostname. This is wrong, because it relates to the incoming message (and probably the interface on which it is arriving) and not to the outgoing callout (which could be using a different interface). This has been changed to use the value of the helo_data option from the smtp transport instead - this is what is used when a message is actually being sent. If there is no remote transport (possible with a router that sets up host addresses), $smtp_active_hostname is used. PH/12 Installed Andrey Panin's patch to add a dovecot authenticator. Various tweaks were necessary in order to get it to work (see also 21 below): (a) The code assumed that strncpy() returns a negative number on buffer overflow, which isn't the case. Replaced with Exim's string_format() function. (b) There were several signed/unsigned issues. I just did the minimum hacking in of casts. There is scope for a larger refactoring. (c) The code used strcasecmp() which is not a standard C function. Replaced with Exim's strcmpic() function. (d) The code set only $1; it now sets $auth1 as well. (e) A simple test gave the error "authentication client didn't specify service in request". It would seem that Dovecot has changed its interface. Fortunately there's a specification; I followed it and changed what the client sends and it appears to be working now. PH/13 Added $message_headers_raw to provide the headers without RFC 2047 decoding. PH/14 Corrected misleading output from -bv when -v was also used. Suppose the address A is aliased to B and C, where B exists and C does not. Without -v the output is "A verified" because verification stops after a successful redirection if more than one address is generated. However, with -v the child addresses are also verified. Exim was outputting "A failed to verify" and then showing the successful verification for C, with its parentage. It now outputs "B failed to verify", showing B's parentage before showing the successful verification of C. PH/15 Applied Michael Deutschmann's patch to allow DNS black list processing to look up a TXT record in a specific list after matching in a combined list. PH/16 It seems that the options setting for the resolver (RES_DEFNAMES and RES_DNSRCH) can affect the behaviour of gethostbyname() and friends when they consult the DNS. I had assumed they would set it the way they wanted; and indeed my experiments on Linux seem to show that in some cases they do (I could influence IPv6 lookups but not IPv4 lookups). To be on the safe side, however, I have now made the interface to host_find_byname() similar to host_find_bydns(), with an argument containing the DNS resolver options. The host_find_byname() function now sets these options at its start, just as host_find_bydns() does. The smtp transport options dns_qualify_single and dns_search_parents are passed to host_find_byname() when gethostbyname=TRUE in this transport. Other uses of host_find_byname() use the default settings of RES_DEFNAMES (qualify_single) but not RES_DNSRCH (search_parents). PH/17 Applied (a modified version of) Nico Erfurth's patch to make spool_read_header() do less string testing, by means of a preliminary switch on the second character of optional "-foo" lines. (This is overdue, caused by the large number of possibilities that now exist. Originally there were few.) While I was there, I also converted the str(n)cmp tests so they don't re-test the leading "-" and the first character, in the hope this might squeeze out yet more improvement. PH/18 Two problems with "group" syntax in header lines when verifying: (1) The flag allowing group syntax was set by the header_syntax check but not turned off, possible causing trouble later; (2) The flag was not being set at all for the header_verify test, causing "group"-style headers to be rejected. I have now set it in this case, and also caused header_ verify to ignore an empty address taken from a group. While doing this, I came across some other cases where the code for allowing group syntax while scanning a header line wasn't quite right (mostly, not resetting the flag correctly in the right place). These bugs could have caused trouble for malformed header lines. I hope it is now all correct. PH/19 The functions {pwcheck,saslauthd}_verify_password() are always called with the "reply" argument non-NULL. The code, however (which originally came from elsewhere) had *some* tests for NULL when it wrote to *reply, but it didn't always do it. This confused somebody who was copying the code for some other use. I have removed all the tests. PH/20 It was discovered that the GnuTLS code had support for RSA_EXPORT, a feature that was used to support insecure browsers during the U.S. crypto embargo. It requires special client support, and Exim is probably the only MTA that supported it -- and would never use it because real RSA is always available. This code has been removed, because it had the bad effect of slowing Exim down by computing (never used) parameters for the RSA_EXPORT functionality. PH/21 On the advice of Timo Sirainen, added a check to the dovecot authenticator to fail if there's a tab character in the incoming data (there should never be unless someone is messing about, as it's supposed to be base64-encoded). Also added, on Timo's advice, the "secured" option if the connection is using TLS or if the remote IP is the same as the local IP, and the "valid-client-cert option" if a client certificate has been verified. PH/22 As suggested by Dennis Davis, added a server_condition option to *all* authenticators. This can be used for authorization after authentication succeeds. (In the case of plaintext, it servers for both authentication and authorization.) PH/23 Testing for tls_required and lost_connection in a retry rule didn't work if any retry times were supplied. PH/24 Exim crashed if verify=helo was activated during an incoming -bs connection, where there is no client IP address to check. In this situation, the verify now always succeeds. PH/25 Applied John Jetmore's -Mset patch. PH/26 Added -bem to be like -Mset, but loading a message from a file. PH/27 In a string expansion for a processed (not raw) header when multiple headers of the same name were present, leading whitespace was being removed from all of them, but trailing whitespace was being removed only from the last one. Now trailing whitespace is removed from each header before concatenation. Completely empty headers in a concatenation (as before) are ignored. PH/28 Fixed bug in backwards-compatibility feature of PH/09 (thanks to John Jetmore). It would have mis-read ACL variables from pre-4.61 spool files. PH/29 [Removed. This was a change that I later backed out, and forgot to correct the ChangeLog entry (that I had efficiently created) before committing the later change.] PH/30 Exim was sometimes attempting to deliver messages that had suffered address errors (4xx response to RCPT) over the same connection as other messages routed to the same hosts. Such deliveries are always "forced", so retry times are not inspected. This resulted in far too many retries for the affected addresses. The effect occurred only when there were more hosts than the hosts_max_try setting in the smtp transport when it had the 4xx errors. Those hosts that it had tried were not added to the list of hosts for which the message was waiting, so if all were tried, there was no problem. Two fixes have been applied: (i) If there are any address or message errors in an SMTP delivery, none of the hosts (tried or untried) are now added to the list of hosts for which the message is waiting, so the message should not be a candidate for sending over the same connection that was used for a successful delivery of some other message. This seems entirely reasonable: after all the message is NOT "waiting for some host". This is so "obvious" that I'm not sure why it wasn't done previously. Hope I haven't missed anything, but it can't do any harm, as the worst effect is to miss an optimization. (ii) If, despite (i), such a delivery is accidentally attempted, the routing retry time is respected, so at least it doesn't keep hammering the server. PH/31 Installed Andrew Findlay's patch to close the writing end of the socket in ${readsocket because some servers need this prod. PH/32 Added some extra debug output when updating a wait-xxx database. PH/33 The hint "could be header name not terminated by colon", which has been given for certain expansion errors for a long time, was not being given for the ${if def:h_colon_omitted{... case. PH/34 The spec says: "With one important exception, whenever a domain list is being scanned, $domain contains the subject domain." There was at least one case where this was not true. PH/35 The error "getsockname() failed: connection reset by peer" was being written to the panic log as well as the main log, but it isn't really panic-worthy as it just means the connection died rather early on. I have removed the panic log writing for the ECONNRESET error when getsockname() fails. PH/36 After a 4xx response to a RCPT error, that address was delayed (in queue runs only) independently of the message's sender address. This meant that, if the 4xx error was in fact related to the sender, a different message to the same recipient with a different sender could confuse things. In particular, this can happen when sending to a greylisting server, but other circumstances could also provoke similar problems. I have changed the default so that the retry time for these errors is now based a combination of the sender and recipient addresses. This change can be overridden by setting address_retry_include_sender=false in the smtp transport. PH/37 For LMTP over TCP/IP (the smtp transport), error responses from the remote server are returned as part of bounce messages. This was not happening for LMTP over a pipe (the lmtp transport), but now it is the same for both kinds of LMTP. PH/38 Despite being documented as not happening, Exim was rewriting addresses in header lines that were in fact CNAMEs. This is no longer the case. PH/39 If -R or -S was given with -q