Change log file for Exim from version 1.60
------------------------------------------


Version 1.73
------------

1. Tidies to the eximon script:

  (a) Different versions of Linux put basename in /usr/bin/basename or
      /bin/basename. Extended the already-existing "look for it" facility for
      Solaris 2 to look in these places, and set the Linux Makefile to request
      looking for it.

  (b) Changed 2nd and subsequent occurrences of CONFIGURE_FILE in the script to
      $config (oversight), and defaulted config to EXIMON_EXIM_CONFIG to make
      overriding it easier.

  (c) The LD library was specified by a variable called X11R5LIB, set in
      eximon.conf. The "R5" part is rather dated, and also it seems better to
      define all the X11 things together, so now there is a variable called
      X11_LD_LIB which is set with all the others in Makefile-Default and can
      be overridden in Local/Makefile. Default setting have been added to those
      OS-specific Makefiles that had X11 settings other than just an include
      file.

2. Give an error if an IPv4 netmask does not consist of a sequence of 1s
followed by a sequence of 0s (either of which may be of length 0).

3. In the default eximon configuration, the line

  WINDOW_TITLE=${EXIMON_WINDOW_TITLE-'${hostname} eximon'}

requires double quotes, not single quotes.

4. Tweak the os-type script to ignore "386BSD" if set in $OSTYPE.

5. Top-bit-set characters enclosed in quotes in an address were causing
failures in the parsing on machines where such characters appear to be negative
numbers. This typically showed up with "headers_check_syntax" set.

6. Top-bit-set characters not enclosed in quotes were also causing failures on
some systems. This depended on what the result of calling iscntrl() on a
negative number was on systems with signed characters. It is undefined in the
ANSI standard. In some cases it just reads a random byte, and so may vary even
on the same system. Address parsing now runs using unsigned character
variables.


Version 1.72
------------

1. Eximon and the other utilities that included some Exim functions were
dragging in a log of unnecessary Exim code. By supplying, for example, an
alternate log_write() function, the size of all these things has been reduced.

2. Exim segv'd during address testing with -bt if an aliasfile director had an
errors_to setting.

3. The syntax checking and rewriting of addresses for "deliver" in filter files
was happening before the string was expanded. If valid syntax or rewriting
depended on an expansion having happened, things went wrong.

4. Fixed an overrun exposure in the static data when HELO is followed by a
large number of spaces and HELO verification is turned on.

5. The variable "stderr" was remaining set in the daemon, even after it closed
all file descriptors. This meant that anything written to the panic log from
the daemon or a sub-process thereof got copied to this stderr, if it happened
to coincide with a real file descriptor. Cases were seen where it ended up
going down the SMTP channel. As some systems don't allow stderr=NULL, a
different variable was introduced.

6. When a short domain name such as "foo" was looked up up in the DNS by
lookuphost, and got expanded into, say "foo.co.uk", and had a lowest-numbered
MX record pointing to the local host, but "foo.co.uk" is not a local domain,
Exim was freezing the address as an error ("lowest MX points to local host").
It now passes the address back for reprocessing by the routers, since it is
possible that some previous router (e.g. a domainlist) can handle the full form
of the domain.

7. A rather odd alias file such as

  philip.hazel   ph10@xxxxxx
  ph10           ph10@xxxxxx

where "xxxxxx" is a single-component name that expands to a FQDN for a local
domain when looked up in the DNS, was not working. (If FQDNs were used in the
alias file, all was well.) The effect was that Exim thought it had a duplicate
address when hitting "ph10@xxxxxx" for the second time, and so it discarded it.

8. The SMTP HELP command was not showing "ETRN" or "EXPN" (though they were
displayed in response to EHLO). They are now shown if there is the possibility
of any host being able to use them, but of course at the time of use the
host's address is checked.

9. The -Mg option (and equivalent eximon menu item) for telling Exim to give up
trying to deliver a message, now does an implicit thaw on the message if
necessary.

10. The use of "@" to stand for the primary host name was not working in host
lists.

11. Some of the rejectlog output generated by sender_verify_log_details (which
is really an Exim debugging thing) was confusing people who turned on that
switch. Did some slight re-wording.

12. Added clarifying words to the "unknown option" message to indictate which
kind of option was expected (and hint about a possible missing ";" for unknown
generic options).

13. Added additional debugging information to transports/smtp.c, retry.c,
dbfn.c, exim.c.

14. Added code to catch SEGV crashes when reading a dbm hints file. Assume the
record is not found and make main and panic log entries. The underlying cause
of these occasional crashes is not known.

15. Write to the log if a delivery process crashes during a queue run.

16. Changing a messages's sender wasn't removing the "user null sender" bit.


Version 1.71
------------

1. Tidying up and corrections to wording in some human-readable files.

2. The "length" expansion operator was broken. It always yielded the complete
substring.

3. Changed the default configuration file to contain

  helo_verify_nets = 0.0.0.0/0
  sender_host_reject_relay = *

as per discussion on the list, to make the default tighter.


Version 1.70
------------

1. Change of operation style for Eximon. When expanded to full size, if the
window cannot be fully seen where it currently is, it is moved back to where it
was the last time it was at full size, rather than to the left and top.

2. Put the tab character in scripts/Configure-config.h into a variable which is
then substituted, because some tabs got lost again, causing an error from
/bin/sh - as it happens, a harmless one.

3. Tighten up the source somewhat, with security in mind. In particular, do
more checking to prevent potential string overflows.

4. Added "ESMTP" to the default smtp greeting banner, and removed "ready at",
which doesn't really add anything.

5. The iplookup router was changing the domain when verifying a sender address,
which isn't correct.

6. Upgraded the version of libident that is shipped with Exim to 0.21.

7. Fixed a crash that could occur on systems where uid_t is a short.

8. Added syntax_errors_to to aliasfile and forwardfile for generating mail when
a syntax error is skipped.

9. Added the -dropcr option.

10. As route addresses are getting more and more deprecated, remote any
reference to "route address" in error messages from the parser.

11. Typo "HAVE_IPv6" in host.c corrected; only some compilers notice.

12. The saved uid/gid when running a system filter were accidentally defined as
int rather than uid_t/gid_t.

13. Yet another fiddle with the makefile to ensure targets which are listed
as dependencies for exim (e.g. routers/routers.a) are actually present. It has
actually got a bit simpler.

14. Added headers_sender_verify[_errmsg], headers_check_syntax, and
headers_checks_fail.

15. SMTP rejections for policy reasons now all changed to 550 in line with
latest thinking.

16. Added use_shell to the pipe transport.

17. Added use_fcntl_lock, mode_fail_narrower, maildir_format, and
maildir_retries to the appendfile transport.

18. Added interpretation of file names from alias and forward (and filter)
files that end in / to be directory names, and the consequential addition of
address_directory to handle them.

19. Added hold_domains and hold_domains_except.

20. Add the result to the process info string after SMTP delivery attempt.

21. A deadlocking bug concerned with parallel remote delivery has been fixed.
If a single remote delivery subprocess was handling a large number (say 100) of
addresses (at the same domain, usually) the amount of data it wrote back to the
main process down its pipe could fill the pipe and therefore block. The main
process wasn't reading anything until the subprocess had finished. Silly me.
The pipes of subprocesses are now read whenever they contain any data.

22. Eximstats: buglet when called with only one option and no file name.

23. Eximstats: bug when volume of data overlowed the amount that can be
held in a 32-bit number. Now prints in GB if over 10GB.

24. primary_hostname was lower cased if specified explicitly, but not if
obtained automatically. Some people like uppercase letters in their host names
and hence in qualify domains. Exim no longer forces lower case for
primary_hostname and qualify_domain.

25. Retry after certain DNS unexpected failure cases instead of treating them
as domain not found.

26. Only try to write the remainder of the block if write() partially succeeds
when writing to a file, not to a pipe or socket.

27. Make -M require an admin user, to go along with -q. However, add the option
prod_requires_admin so the restriction can be relaxed.

28. Added log_arguments.

29. If CONFIGURE_FILE_USE_NODE was set, the installation script screwed up
finding the name of the configuration file.

30. The substr expansion operator can now take negative offsets for counting
from the end of the string. Also, the absence of a length => "the rest", either
to the left or right.

31. When exim cannot open its panic log, it tries as a last resort to write to
the system log. This is now opened with LOG_PID+LOG_CONS and the facility code
of LOG_MAIL. The message itself is written at priority LOG_CRIT.

32. No longer insist that SPOOL_DIRECTORY be set at build time; the run-time
value is expanded, so can contain the host name. Ditto for LOG_FILE_PATH
and PID_FILE_PATH.

33. sender_host_address, sender_host_name, sender_ident are now preserved on
the spool so they can be re-instated during delivery.

34. Added TEXT_DEPTH as an eximon configuration thing, and defaulted all
of them to 200 (for some reason, for header display it used 500).

35. Bug in eximon fixed: if an address generates other addresses via an alias
or forward file, and these addresses are deferred, eximon notices the deferral
on the log and adds the addresses to the list it displays. However, when such
addresses were subsequently delivered, it did not notice.

36. System filter: action not getting initialized.

37. Added the generic new_director option.

38. Added sender_reject_except.

39. If an address is routed via MX records, and the current host was in the
original MX list, ignore any fallback_hosts that are set on the smtp transport.
Also if any host in a list of hosts in a domainlist router is the local host
(causing the rest of the list to be ignored). This is to provide some
protection against loops.

40. Added -Rf.

41. IPv4 addresses in netlists can now be followed by single-integer mask
specifications, e.g. 123.123.0.0/16.

42. Netlist items can now be file names; the file must contain one net item per
line. Blank lines and lines starting with # are ignored, and indeed, # can be
used to add a comment to any line.

43. Add actual size and sender address to the reject log entry for incoming
SMTP messages that are rejected because they are too big.

44. If an aliasfile or forwardfile director set up an errors_to address with a
prefix or suffix, e.g. xxxx-request@yyyy, and the verification of that address
involved a director that had a prefix or suffix setting, then the address that
was eventually used for errors_to lost the prefix or suffix.

45. Added senders and except_senders to directors and transports.

46. Eximon looped if the first attempt to bring up a menu wasn't pointing
at a message.

47. Implemented split_spool_directory.

48. If the attempt to send a delivery error message failed, Exim correctly left
the failing addresses on the spool, but crashed on some systems instead of
ending cleanly after logging the incident. One cause of this was an incorrect
setting of exim_path.

49. If a non-trusted user used the -bS option and an error was detected in the
sender (MAIL FROM) address in a message, Exim crashed while trying to send an
error message.

50. Handling of errors in batch SMTP (-bS) input was poor; Exim was failing to
skip the remainder of the current message after an error in the envelope.

51. An error response to QUIT got logged without massaging to ensure control
characters were escaped.

52. Permit white space between :include: and the file name (previously it got
included in the file name, leading to a silly error message).

53. Implemented transport filtering.

54. The expansion function was accidentally starting off the new data block
with size "sizeof(string)+50" instead of "strlen(string)+50", but that
shouldn't have caused any serious problem.

55. Updated the call to getpeername() in exim.c for initd calls to use IPv6
data structures when HAVE_IPV6 is set. Updated the SunOS5 os.h for the latest
Sun IPv6 prototype release by removing renaming macros no longer needed.

56. If a $h_ expansion was used in a filter file, and there was more than one
header of the given type, Exim got a bit of store that was one byte too short
to hold the concatenated data. This could cause a crash if the strings were of
appropriate lengths.

57. Cope with race condition while creating maildir subdirectories.

58. Added the -oee option, for sendmail compatibility. Acts like -oem, but
gives return code 0 on error, provided an error message was successfully sent.

59. Added deliver_queue_load_max and queue_run_in_order.

60. Exim incorrectly logged "abandoning queue run" whenever it abandoned
*any* delivery because of a high load average.

61. Added $(LIBS) to the compile command for buildconfig; needed on the Mips
box to get -liberty, which provides strstr().

62. Give an error message if an option is set twice.

63. If a host list contains wild cards (other than "*") or if a host name
cannot be looked up in the DNS, an attempt to match the list causes a reverse
lookup of the IP address. If this failed, Exim was previously ignoring the
relevant item in the list. Now it behaves as if the host does not match in
cases where the list is permissive (e.g. sender_accept_hosts) and as if it does
in cases where the list is prohibitive (e.g. sender_reject_hosts).

64. Added smtp_expn_{hosts,nets}, support for EXPN, and the generic expn option
for directors.

65. The appearance of an item or the form user@lsearch;/x/y/z in one of the
sender accept or address lists caused the daemon to crash at start up.

66. Added the "@@" address-matching lookup feature.

67. Error message improved for unknown expansion operator.

68. Added the expiry stuff to smartuser. Later cut out pending discussion
of desirability.

69. Added receiver_verify_addresses.

70. Always qualify receiver "postmaster" as per DRUMS new draft for 821.

71. Upgrate the iplookup router to use an IPv6 socket if HAVE_IPV6 is set.

72. If any of the host-type options include "localhost" or equivalent, it
didn't always work correctly.

73. Sender headers weren't being treated as senders during rewriting. This
mattered only if there were different qualifying strings configured.

74. Qualification of unqualified addresses in headers is now controlled by the
same options that allow them in incoming SMTP commands. Locally-sourced
messages can always be qualified, of course.

75. If Exim suffers a disastrous error and consequently bombs out while there
is an SMTP call outstanding, it now tries to send a 421 error message, and
subsequently waits for QUIT (or a timeout) before closing the connection.

76. The test for not-reusing a director if it had previously handled an address
now includes checking suffix and prefix as well. This allows the smartuser
director to be used for various lookup transformations several times on an
address. As a long stop, a maximum of 100 parents has been imposed. Exim
panics if the limit is hit.

77. If a user has submitted a message with "-f <>" then the -bp listing now
shows the sender as <> with the user's address in brackets instead of showing
just the sender's address. Ditto for Eximon.

78. String overflow in a filter was giving an incorrect error message about a
missing " instead of saying "string too long".

79. Increased maximum string length for arguments of the "mail" command in
filter files to 1024.

80. Added recipients_reject_except.

81. Added ignore_errmsg_errors_after.

82. Added log_refused_recipients.

83. Fiddled a bit with Christoph Lameter's queue summary script, and installed
it in util.

84. Added check_{spool,log}_{space,inodes}.

85. Added interface option to the smtp transport.

86. DBM support: Changed the locking code for database files from a sleep loop
to a blocking call to fcntl with a timeout. Added DB_LOCKS_ITSELF to cut out
Exim's locking for libraries that do their own, and added sleep/wait loop for
open calls that return EAGAIN, both of these for gdbm. Renamed everything in
Exim that started db_ in order to avoid clashes with DB 2.x. Provided test_dbfn
as a way of checking up on the locking. Extended USE_DB to use native DB 2.x
calls.

87. Ignore setgroups() error if effective uid is not root.

88. Return code for relay rejection changed to 550 in line with latest
thinking.

89. Added relay_domains_inclode_local_mx.

90. Extended the regular expression facilities a bit with some Perlish things.

91. If a rewriting rule with the w flag was followed by one without, the w
didn't get noticed, and the original comments didn't get changed.

92. Modified libident modules ident.c and id_open.c and the header ident.h
to suppost IPv6 and adjusted Exim's makefile stuff to build it in the right
way.

93. Fixed serious bug in the handling of remote parallel deliveries. The
subprocess was just using the file descriptor for the data file that it
inherited from the parent. This meant that all parallel deliveries were working
with the same file pointer, leading to potential loss of data.

94. Removed unnecessary HAVE_SYS_PARAM_H option from the monitor; as
sys/param.h is already always included in Exim, it must be present in all
systems anyway.

95. Both the -bt and -bv options now give return code 2 if any address failed
outright, and 1 if no address failed outright but at least one could not be
resolved. Return code 0 is given only when all addresses succeed.

96. Added the "q" rewrite flag.

97. Address lists can now contain items of the form <xxx>@@ where the second
"@" stands for "primary_hostname"; cf domain lists.

98. Added sender_verify_batch.

99. Added uid/gid and "+" option to require_files.

100. If recipients_max_reject is set true, then Exim rejects messages
containing too many recipients by giving 550 errors to the surplus RCPT TO
commands, and a 554 error to the eventual DATA command.

101. Added -bpu and -bpa options.

102. Log the number of bytes written when an SMTP connection times out.

103. Fixed performance buglet. If a local address that contained uppercase
letters caused other addresses to be generated, and they were all delivered
but other addresses caused the message to be tried again later, Exim still went
through the process of generating the children of the address containing
uppercase letters the next time, even though they had previously been
delivered. It failed to record correctly that the parent address was complete.
This didn't cause any wrong deliveries or anything; just wasted work.

104. "partial0" was not working (to search right down to a "*" entry).

105. Added the "*" option to search types.

106. The regular expression for setting up eximon stripcharts wasn't correctly
recognizing the remote_smtp transport in the default configuration.

107. -bp, -bpu, -bpa can be followed by a list of message ids.

108. If a message disappeared (completed) after a list had been compiled but
before the data was read during -bp processing, an error was given.

109. Added include_domain to aliasfile.

110. Added generic transport options add_headers and remove_headers.

111. Added qualify_domain and qualify_recipient expansion variables.

112. Added $recipients expansion variable, valid only in the system filter
file.

113. Arranged for the rewriting function, when called from .forward file
processing, to change its uid/gid back to exim for the replacement expansion,
so that it can lookup in non-world-readable files.

114. Eximon wasn't taking note of -J files and consequently wasn't noticing
completed deliveries as soon as it might.

115. Split up the target in the toplevel makefile so that it is now possible to
do "make build-directory" independently.

116. Bug in the ipliteral router: the host wasn't being given a unique name,
and this could cause confusion in the processing for messages waiting for
transmission to that host.

117. Modified the conversion program that builds a TeXinfo source of the
documentation to make the node linking more the way TeXinfo documents are.

118. If local_domains ended with a colon and local_domains_includes_host
or local_domains_includes_host_literal was set, the doubled colon generated by
adding domains onto the end of the list was causing items in the list to get
concatenated. In addition to fixing this, the primay_hostname is now added at
the front of the list, as that seems more sensible.

119. Avoid trying to write to the log when called with -C from by unprivileged
user.

120. Implemented receiver_verify_senders.

121. Fixed :include: overrun exposure.

122. Moved sys/types.h before dirent.h in exim.h and em_hdr.h for FreeBSD.
I don't think it will screw up any other OS.

123. Freeze_tell_mailmaster wasn't being checked when the message was frozen by
a system filter.

124. Some more tightening up of string handling, thanks to someone who kindly
read the source carefully and pointed out things to me.

125. The daemon didn't log things if log_arguments was set.

126. If used in a system filter file, "personal" caused a crash. It doesn't
actually make must sense there, but it shouldn't crash. It now just yields
FALSE.

127. Change to makefile to avoid use of $(LOCAL) which caused a problem in some
systems during the config.h building.

128. If $OSTYPE is just "irix", ignore it and go on to find the real OS type
from uname.

129. The utilities exim_dumpdb and exim_fixdb needed "#include config.h" adding
in order to pick up USE_DB for use in the dbfn.h header.

130. Aliasfile lookups were accidentally being done as "partial0".

131. Added receiver_verify_senders_except.

132. If relay_domains set but no host or net accepts or rejects, assume reject
all instead of accept all.

133. If exim is not seteuid root, don't attempt to fork for delivery after
accepting a local message - there's no point, and it will give permission
denied if the original caller isn't an admin user.


Version 1.62
------------

1. The text widgets in the monitor now have the attribute editType set to
XawreadAppend. This causes the "replace" parts of the search pop-up window to
get greyed out on systems where the unmodified TextPop widget has to be used
because the modified one can't be linked in (BSDI, HP-UX). [The modified
version has the "replace" items totally removed from the pop-up window.]

2. Removed unnecessary definition of bcopy() from the modified StripChart
widget, since it is defined in Xfuncs.h.

3. Ensured that any ident value is added to the log messages for various
rejections (correcting oversight).

4. Make name of hitching post file appear in error message complaining that it
cannot be created.

5. Added commented-out entries setting group=mail and mode=0660 to the default
configuration for systems that work that way.

6. Re-jigged the makefile yet again. Now "make makefile" *just* rebuilds the
makefile; it does not go on to build everything else.

7. After a partial lookup for a domain, as well as having $1 set to the wild
part of the domain, $2 is now set to the fixed part. These might be $2 and $3
if a wild local part is part of the key being matched, e.g. in a rewriting
rule.

8. After a non-regular expression address-matching operation, $0 was getting
set to the local part rather than the whole thing.

9. The variables $1 and $2 now contain the wild/non-wild parts of the key
during the replacement text for a partial ${lookup operation. If there is no
partial lookup (or it fails), they keep their external values.

10. Linux version 2.1.15 uses the more sensible structure name "ip_options"
instead of just "options". Code changed to use the new name, and a fudge added
to define a macro converter on older systems.

11. The loop-detection logic for direction was testing only the local parts of
addresses. This caused incorrect operation when a director was handling several
different domains. It now compares both the local part and the domain.

12. Some minor C infelicities causing warnings from the Sun compiler fixed.
Included inventing DN_EXPAND_ARG4_TYPE because IRIX uses u_char * when all the
others (I've looked at) use char *.

13. Typo in the db.c file caused a file of the wrong name to be opened after an
EINVAL error.

14. Missing close of dbm file in transport.c when bad data detected in the
file.

15. More cases of errno usage (in exim.c, readconf.c, and retry.c) had been
overlooked. Renamed.

16. Added prototype support for IPv6. See README.IPV6.

17. Leading and trailing spaces removed from items in string lists.

18. Three bugs in smartuser concerned with the use of new_address; I suspect
nobody had ever used it before...

  (a) Trailing @ left on local part for a local transport.
  (b) Incorrect local part (contained domain) for a remote transport.
  (c) Domain & local part incorrect if new_address got rewritten by a
      rewrite rule and the length of the local part changed.

19. The functions string_{first,next}inlist() kept an internal state and
returned output in a static buffer. These functions are used independently and
also by match_isinlist(). There was one known instance (verify hostlist, when
local_interfaces was set) where they were called again before completing the
first sequence. They have been replaced by a single function called
string_nextinlist(), which does not keep any local state, making the whole
thing much safer.

20. Only the first suffix in a list of suffixes on a director was recognized.

21. If either of the sender_reject options contained a lookup, the daemon was
holding the relevant files open.

22. Under fvwm (and at least one other window manager), the "size" button in
eximon put the window furniture off the screen. Experiment seems to indicate a
difference in the way the different managers position windows, with twm
including the WM furniture, and the others not. I have kludged up the code so
that it works under twm and fvwm. I hope the kludge is good enough for other
window managers.

23. Reworked exim_install to avoid the use of "grep -h", which it seems is
non-standard.

24. Exim was allowing a "From " line in a message to override a sender set by
-f on the command line. Sendmail has the opposite priority, so Exim has been
changed to be the same.

25. Change 98 for 1.60 was incorrectly implemented. All addresses following the
empty one were ignored.

26. If appendfile was used for a "remote" delivery (e.g. batched SMTP) it could
crash because of a reference to deliver_localpart, which is unset in such
cases.

27. Parameterized chown and chgrp for exicyclog, because chown lives in sbin in
BSD systems. Also parameterized rm and mv while at it, just in case.

28. BSD systems can return structures of a non-standard length on the
SIOCGIFCONF ioctl (used for finding all local interface addresses). The
contained sockaddr structure may be longer than its sizeof, and there's a field
containing the length. If HAVE_SA_LEN is defined, code to use this is compiled.
This macro is set by default for BSD systems.

29. Bug in change 65 of 1.60; inadvertent use of strcat() instead of strcpy()
meant that text from the final line of the configuration file got included in
the inserted text if it was long enough.

30. When a queue run is abandoned because the load average is too high, the
log is now written from within the delivery process that aborted, so as to use
the same load average value. Previously the outer process read the average
again, and as it can change quite quickly, this could lead to confusing log
entries.

31. Warning added to error message when forward file starts with filter header
but filtering not enabled.

32. Added debug_level option; -d overrides.

33. Added check_ancestor to forwardfile and put it in as default in the default
configuration for .fowards.

34. When relaying is forbidden because the host is not acceptable, the logged
message now contains either "(host accept)" or "(host reject)" to indicate
whether it was failed by an accept list or a reject list.

35. Added relay_match_host_or_sender.

36. If a frozen message was delivered via the Eximon menu operation, Eximon
failed to notice that it had been unfrozen as part of the delivery, and
continued to display * next to it.

37. Improved error message for screwed-up local part in route address. Instead
of just saying "missing @" say "@ or . expected after xxxx".

38. There is a fundamental difference between BSD and SYSV in the matter of
groups (it has been discovered). On BSD systems there is a single group list,
and the first entry in it is the current group. On SYSV there is a
supplementary group list, which is in *addition* to the current group. The
existing code setgroups(0,NULL), which clears the supplementary group list on
SYSV, fails on BSD. Exim now tries setgroups(1,<main group>) when
setgroups(0,NULL) fails. This should make is clear out any supplementary groups
on both kinds of system.


Version 1.61
------------

1. Calling Exim (incorrectly) with just the -h option (not followed by a
number) causes a segmentation fault.

2. Exim could crash when handling multiple directions for a single message,
especially if caused by several chained aliases.


Version 1.60
------------

1. Include extended eximstats script in this version.

2. For historical reasons, the eximon script did its own check of the operating
system to find where the "basename" and "hostname" commands were. This code has
been replaced by settings derived from the main configuration files.

3. A binary zero in the first line of a message body that was not separated
from the headers by a blank line was not getting through.

4. A sequence of two or more "bare" CR characters in a message was getting
corrupted.

5. I have found a recommendation that LF's without CR's in incoming SMTP should
*not* be treated as line terminators, so Exim no longer does so, but it
applies this rule only to external incoming SMTP. HA! Later there was
discussion about this and it seems there are plenty of sites that do it, so
change 67 below reverses this one.

6. If there was a problem with one of the alternate configuration files, the
error message gave the generic name rather than the name of the alternate file.

7. If a file existence test (for require_files) causes an address to be
deferred because it cannot determine whether the file exists or not, the
deferment message now contains the strerror() output from the errno that was
returned by stat(), to help in debugging.

8. Make -bP output uid lists colon-separated.

9. Add sender information to the log line when a recipient verify fails.

10. Sender_address_relay wasn't working for non-regular expressions in cases
where the sender was a local address that got rewritten such that the local
part changed its length.

11. Put signal(SIGCHLD, SIG_DFL) at the start of Exim to cope with MUAs that
manage to call it with SIG_IGN set, which causes completed subprocesses not to
wait for wait(). Also, detect ECHILD in wait() loops, log an anomaly, and break
the loop.

12. Fetched the latest version of the libident library (0.20) to distribute
with Exim. It should get rid of some compiler warnings on HP-UX.

13. Lines longer than 256 characters in lsearch lookups were being chopped.
Increased the limit to 4096.

14. Give new address in log entry when fixing up return paths for
sender_verify_fixup.

15. Insist that only an admin user may start the daemon or force a queue run
with -q.

16. Put the Exim version number into the daemon start-up log line.

17. If the expansion of the hostlist item in a domainlist router was forced to
fail, just fail the router. An unforced fail still freezes.

18. Incorrect error message given for a string expansion if the expansion of a
substring in a condition failed.

19. Randomize MX records of equal priority, and randomize A records for
multihomed hosts.

20. Following discussion on the mailing list, the default configuration no
longer contains ignore_status in the address_pipe transport.

21. Messages listed with -bp are now sorted into file name order - which is the
order of message arrival. This is fixing an oversight.

22. Implemented log_level, always_bcc, queue_remote, -odqr, accept_8bitmime,
helo_verify_nets.

23. Failure of exec after SIGHUP logged on main log as well as panic log.

24. Added OS configuration files for SCO SVR4.2MP (and maybe Unixware), as
received from "Kevin" <kadokev@relay.ripco.com>.

25. Typo in deliver.c fixed; would have caused a crash if a parallel remote
delivery process failed to end cleanly.

26. A substring consisting of just the character "@" in a domain list matches
the primary name of the host. Thus local_domains = "@" is another way of doing
local_domains_include_host, and it also works for other domain lists such as
percent_hack_domains and the domains generic options of directors and routers.

27. Reworked retry matching rules: (1) Allow file lookups; (2) local domains
can appear without local parts, implying all local parts match; (3) check for
domain as well as host for remote failures. Added -brt option for testing.

28. Added -brw option for testing rewrite rules, and revamped the rewrite rule
syntax to make more flexible.

29. Colons can be got into colon-separated lists by doubling. This could be
useful for lists of addresses, which sometimes contain colons (in quotes).

30. Fixed obscurish bug in the code for scanning colon-separated strings. If a
loop was exited in the middle, and the next string to be scanned was in fact
NULL, then the remainder of the old string got scanned instead. Various odd
effects resulted.

31. Documented things in os.c and os.h in a new file called os.Configure, and
added the omitted HAVE_SETRESUID to Makefile-Default.

32. Improve the make files so that if the created makefile gets deleted owing
to a bomb-out during an initial make, it automatically gets rebuilt next time.

33. Improvements to the arch-type and os-type scripts.

34. Added missing (void *) casts to the second arguments of read() and write().

35. Give expanded pipe command in error messages when a pipe delivery fails,
rather than the unexpanded version.

36. If expansion of an argument in a pipe command failed, the pipe delivery
process crashed rather than giving a sensible error message.

37. Added connect_timeout to the smtp transport (I've realized how to do it).

38. When the only viable MX records point to a non-existent host, a better
error message than "unknown mail domain" is now given.

39. An obscure case where a timeout would not operate for the writing of chunk
of data has been fixed.

40. Eximon: suppress queue display updates while a menu is displayed. This was
previously the cause of some loops.

41. With sender_verify set, if the verification suffers a temporary failure,
Exim now goes on to read the headers and gives the 451 failure code after the
data instead of after MAIL FROM, thus allowing it to log the headers.
Furthermore, if sender_verify_fixup is set, it will now try to fix the sender
in this case.

42. When a local delivery is made to a pipe, file, or autoreply transport, and
the immediate parent address of the final target is not the top-level address,
that parent is shown in brackets after the address in the log entry.

43. Fixed typo: MAILER_DAEMON => MAILER-DAEMON in default prefix line in pipe
transport (it was ok in appendfile).

44. Put SHELL=/bin/sh at the top of the make files to make them work in systems
such as IRIX that use the SHELL variable and default to csh.

45. Reorganized all code concerned with uids and gids to allow them to be
negative for AIX. This has involved adding a flag variable to all those that
need to have a set/unset indication. At the same time, ensure they all use the
types uid_t and gid_t rather than int. This has been a pretty massive re-
organization all round. I wonder how much I have broken?

46. Option list for the forwardfile driver was out of alphabetical order; this
could have led to some options not being accessible, but there were no
complaints!

47. If the file for forward file was specified as absolute, the directory
wasn't getting passed over as HOME for pipe deliveries.

48. Set the SIGCHLD signal to SIG_IGN rather than SIG_DFL in the process for
receiving an incoming SMTP message. That way, child delivery processes should
(on some systems at least) go away immediately they complete instead of
becoming defunct and waiting for wait().

49. Added max_rcpt to the smtp transport.

50. Splitting of verify and fail_verify into separate _receiver and _sender
options for routers and directors.

51. Addition of verify_only to routers/directors.

52. The final "message accepted" message for an incoming SMTP message now has
the message id appended.

53. Added log_subject and log_smtp_confirmation.

54. If a number of addresses were passed to the smtp transport, and some were
delivered to one host and some to another (because they received temporary
failures from the first host), all but the first were logged with -> which
isn't right. At the same time, made suppressed deliveries because of -N use
"*>" in the log.

55. Updated the cunning locking algorithm in appendfile, after consultation
with its originator (the author or procmail). This will partly paper over the
problem that is seen in those versions of Linux that do not update their inode
cache after a link() call.

56. Added "rewrite" options to aliasfile and forwardfile.

57. Changed "*" to "D" in -bp output; may be less confusing.

58. Added return_fail_output, log_output, log_fail_output to the pipe
transport.

59. The variable message_size contained only the count of bytes in the message
body; the header lengths are now included.

60. Added the quota option to appendfile.

61. Added defensive code to exigrep to avoid Perl warning if a log line should
be less than 20 characters.

62. Makefile-Linux updated to point to X11R6, since I'm told that is now
generally in use in various variants.

63. Exinext: was not searching the output from exim_dumpdb in a
case-independent way.

64. Multi-line SMTP error responses were causing unexpected newlines in the
log. Now shown with \n for the newlines, but sent as newlines in error
messages.

65. Replace occurrences of '&' in the gecos field with the login name; the
first characters is uppercased. This is a fudge that seems to be found in many
Unixes.

66. For historical reasons, the script exim_install allowed overriding of the
"cp" command by a user-set variable called "cp". Turns out that some versions
of AIX have such a thing set. All the relevant variables are now preceded by
"inst_".

67. It seems there are sites that send only LF instead of CRLF in their SMTP
transactions, and that smail and sendmail can handle them. Relax Exim's
constraints so as to run with the herd.

68. Added the "substr" operator and "match" condition to expansions.

69. Added message_precedence expansion variable.

70. Added the "w" flag to rewriting rules.

71. The message id was appearing twice in log messages for manual status
changes (e.g. adding recipients).

72. There were originally so few options I just implemented a sequential
search. There are now so many more that I have (with luck) speeded things up a
bit by putting in a switch on the first character after the '-'.

73. Addition of -qf, -qfl, and -ql options.

74. Separation of home directory and current directory for local deliveries,
and addition of new options to various directors and transports.

75. The handling of select() and accept() failures in the daemon was copied
from smail: a 5 second pause after each one, and crash the daemon after more
than 10 in succession. The comment about the latter is that accept() fails
continuously on some OS. However, it seems that genuine errors can occur here,
and maybe the looping thing is now a dead duck. Changed Exim to carry on
regardless, but to batch up successive error messages into a single message
with a count. Messages are now written to the main log rather than the panic
log, but if a batch gets up to 50, there is output to both logs.

76. Added dns_retrans and dns_retry.

77. Give the sender and the list of as-yet-undelivered addresses in the
freeze_tell_mailmaster message.

78. Made DB utilities more robust against corrupt files.

79. Re-organized delivery recording to use a journal while delivering, and a
single spool file update at the end. More robust against sub-process crashes
after completing a delivery, and possibly even cheaper when many addresses
involved.

80. Exim crashed after successful SMTP delivery to a host whose identity was
obtained from an expanded string set as the "hosts" parameter of the transport.
Even without a successful delivery, it could crash if fallback hosts were
involved and there was more than one SMTP connection made via the same
transport in the same process.

81. Eximon was crashing if "edit sender" or "mark delivered" was selected from
the menu.

82. Addition of simple macros to configuration file.

83. Don't explicitly unlock DBM file before closing.

84. Fixed obscure store-overwriting bug provoked by address-rewriting. Showed
up when more than one message was received by SMTP in the same connection, and
verify_recipients was turned on. Very dependent on precise store usage;
changing a single line of the DATA changed things.

85. If a process opens a Berkeley DB file and thereby causes it to be created,
it doesn't actually write anything to the file immediately. Another process
that opens the same file then gets an EINVAL error, since the data in the file
is invalid. As the second process can't open the file, it can't try to lock it
and wait for it to become available. Exim now tries several times, with pauses,
if it gets EINVAL when trying to open a database file.

86. Argument combinations "-bp -q" and "-bd -q" diagnosed as nonsensical.

87. If the Exim is called as "rmail" treat it as equivalent to "exim -i";
thus allowing UUCP messages to be input using non-SMTP mode ie preventing a
single dot on a line from terminating the message.

88. Bug in parsing lists of addresses in .forward and alias files; commas
inside comments (brackets) were not being correctly skipped.

98. Ignore empty addresses in alias and forward files (e.g. a line containing
just a comment in brackets).

100. Added skip_syntax_errors option to aliasfile & forwardfile.

101. Added retry_use_local_part option to appendfile and pipe transports.
Forced it "off" for deliveries by smtp batching local transports

102. Filter processing. Expansion of conditions was happening while parsing the
file, which meant that numerical variable insertions were not happening. Now
the expansions happen when the conditions are tested, and the numerical
variables remain in existence for ever after a regular expression test.

103. Added recipients_max.

104. Eximon: added the test links=0 for detecting log file rolling over, for
Digital systems.

105. Eximon: added BODY_MAX parameter to limit the amount of body shown.

106: Eximon and -bp options: display message sizes.

107. Added local_interfaces: specifies those interfaces to be considered as
local for outgoing SMTP, and those on which to listen in the daemon.

108. Added serialize_{hosts,nets} to smtp transport.

109. Domainlist: added ability to specify transport on each item.

110. Added ability to queryprogram router to return a string that is passed as
a parameter to the transport. A general facility is now available, but
currently only queryprogram makes use of it.

111. Added some configuration structure for IPV6 so people can develop.

112. Added log_ip_options and kill_ip_options.

113. Added "batch" option to appendfile and pipe, and expansion variable
$transport_recipients. In conjunction with "batch" this makes a more flexible
interface to, e.g. UUCP.

114. Added "expand" option to aliasfile.

115. Re-jigged the -R code to stop it forking a subprocess for every message on
the queue. It now does the testing first, and forks only when it hits a message
it wants to deliver.

116. Added sender_accept and sender_accept_recipients, cf the corresponding
reject options.

117. Added ETRN command (RFC 1985) and smtp_etrn{hosts,nets}.

118. Added receiver_verify_except_{hosts,nets}.

119. Permitting unqualified senders/recipients failed for all but the first
message in an SMTP connection if the firsts message's sender/recipients *were*
qualified.

120. Changed appendfile so that it creates a lock file before opening the
mailbox. This should reduce the window of risk when two exims are both
delivering over NFS to the same mailbox.

121. Ancient and obscure bug in reading in the spool header file fixed. The
effect was to set incorrect balancing values in the tree of non-recipients.
This in turn could lead to crashes when updating the tree. Also made the tree
functions more proof against this happening again.

122. Made -ov synonymous with -v. Sendmail distinguishes them, but does things
that don't apply to Exim.

123. Calling Exim as "runq" is equivalent to "exim -q".

124. Renamed all structure fields called "errno" as "basic_errno" as errno is
permitted to be a macro in ANSI C, and in some implementations it is.

125. Did some code tidies to get rid of warnings from -Wall in gcc.

126. Made scripts/os-type recognize "freebsd*" as FreeBSD.

[Entries for earlier versions of Exim have been archived]

****
