Exim version 4.02 ----------------- 1. Bug in string expansion: if a "fail" substring of a conditional contained another conditional that used the "fail" facility, Exim didn't swallow the right number of closing parentheses in the case when the original condition succeeded (i.e. when the condition containing the "fail" should be skipped). 2. helo_verify_hosts wasn't working when comparing host names. 3. When delivering down an existing SMTP connection, the error "Unexpectedly no free subprocess slot" was sometimes given for other addresses in the message. 4. Binary zeroes in the message body are now turned into spaces in the contents of $message_body and $message_body_end. 5. If the value of a field in a MySQL result was SQL NULL, and more than one field was selected, Exim crashed. 6. It seems that many OS treat 0.0.0.0 as meaning the local host, typically making it behave like 127.0.0.1. Since there have been incidents where this was found in the DNS, two changes have been made: (a) Added 0.0.0.0 to the ignore_target_hosts setting in the default configuration. (b) Unconditionally recognize 0.0.0.0 as the local host while routing. 7. Added chars_allow_in_helo so people can let in underscores if they really have to. Sigh. 8. Give configuration error if "maildir_format" or "mailstore_format" is specified for appendfile without specifying "directory". 9. When return_path was expanded in an smtp transport, the values of $local_part and $domain were not set up. 10. The optimization for sending multiple copies of a single message over one SMTP connection when there are lots of recipients (but too many for one copy of the message) was messing up in the case when max_rcpt was set to 1 (for VERP). It would send lots of copies with one RCPT each, correctly, but because the transport was passed more than one address, $local_part and $domain weren't set. Since setting max_rcpt to 1 is almost always associated with VERP (or at least, you do it because you want to use $domain or $local_part), I've made that a special case where the optimization is disabled. 11. Cygwin has case-insensitive file names. Therefore, we can't use base 62 numbers for Exim's identifiers. We have to use base 36 instead. Luckily 6 base 36 digits are still plenty enough to hold the time for some years to come. There's now a macro that is set either to 62 or 36, but the names and documentation still talk about "base 62". 12. Added build-time variable MAX_LOCALHOST_NUMBER (default 256) to allow the localhost number to be traded off against the maximum number of messages one process can receive in one second. This is relevant only when localhost_number is set. It may be useful for Cygwin, where the maximum sequence number is much less when up to 256 hosts are allowed. 13. Extended MySQL server data to allow for the specification of an alternate Unix domain socket. 14. Give error if too many slashes in mysql_servers or pgsql_servers item. 15. Changed the wording "debug string overflowed buffer" to "debug string too long - truncated" to make it clearer that it's not a big disaster. 16. Now that I finally understand the difference between the resolver's returns HOST_NOT_FOUND and NO_DATA, I've optimized Exim's DNS lookup so that if an MX lookup gets HOST_NOT_FOUND, it doesn't bother to try to look up an address record. Only if it gets NO_DATA does it do that. 17. The contents of Envelope-To: were not correct in cases when more than one envelope address was redirected to a single delivery address via an intermediate address, because the duplication was detected at the intermediate stage, but the checking for Envelope-To: only looked at duplicates of the final address. 18. If a message with the -N flag was on the spool, and was selected during a queue run by -R or -S, the -N flag was incorrectly passed on to all subsequent messages, leading to their being thrown away. 19. Remove unnecessary check for the local host when looking up host names in host lists. 20. If tls_certificate is supplied, but tls_privatekey is not, assume that both are in the tls_certificate file. 21. If a router set transport_current_directory or transport_home_directory to something that involved an LDAP lookup, and there was more than one local delivery to be done for a single message, all but the first got deferred because the LDAP connection for those variables got opened in the superior process, but closed in the first subprocess. The second subprocess then assumed it was still open. We now ensure that each subprocess starts with a clean slate (everything closed down) so that it can open and close its own connections as needed. 22. After a failure of ldap_result(), Exim was calling ldap_result2error() in order to get an error message. However, it appears that it shouldn't do this if the value of result variable is NULL. As I can't find any way of getting an error message out of LDAP in this circumstance, Exim now just gives says "ldap_result failed and result is NULL". 23. If a message arrives over a TLS connection via inetd, close down the SSL library in the subprocess for message delivery (but don't molest the parent's SSL connection). ****