Resolver initialization bug in sendmail.
Neil Rickert
rickert at mp.cs.niu.edu
Thu Oct 11 11:20:43 AEST 1990
There is a potential problem in sendmail-5.6[45], relating to proper
initialization of the resolver library. While my tests have been with the
IDA versions of sendmail I believe the problem to also be present in
the Berkeley released version.
The error is that the resolver library is not properly initialized when
a freeze file is in use. A patch is attached at the end of this message.
Demonstrate the error as follows:
(This assumes that the configuration file is /etc/sendmail.cf, and that
the freeze file /etc/sendmail.fc exists).
1. Use the command:
sendmail -bt -d8.8 -C/etc/sendmail.cf
Now, in test mode, test any address which requires a resolver lookup,
using the $[ ... $] operations in sendmail.cf
Notice that a great deal of debugging output is printed by the
resolver library.
2. Repeat the test, this time using the freeze file
sendmail -bt -d8.8
With the same address, notice that the resolver debugging output does
not appear.
Explanation:
The '-d8.8' option should cause the debug options to be set in the
resolver state variable, _res . They are actually set whether a
freeze file is used or not. But when the freeze file is in use the
resolver has not yet been initialized. Thus the first call to the
resolver library internally calls res_init(), which replaces the
current value of _res with the default value.
When the freeze file is not used, the resolver is called very early to
canonicalize the internally defined value of '$w', and this call
initializes the resolver library before the debug options are set.
Implications:
The problem with debug is of course trivial. If this were all that
happened there would be no concern. But the bug potentially effects
any assignment to the state variable _res .
Although I have not attempted to reproduce it, the following scenario
demonstrates what could happen:
Scenario:
Imagine that the current default domain is 'foo.com'. Assume, further,
that there is a WILDCARD MX record for *.foo.com.
Suppose now that sendmail uses a freeze file. Assume mail is received
from a UUCP neighbor, foobar.UUCP. The destination of the mail is
bar.BITNET.
Because of the use of the freeze file, the resolver library is not
consulted for the value of $w. Because the sender address is from
the UUCP domain, it is not processed by a $[ ... $] rule in
the configuration file. Likewise, because the destination is for
the BITNET pseudo-domain, it also is not processed bt $[ ... $].
But ruleset #0 has a specific rule for BITNET mail, something like
R$+@$+.BITNET $# tcp $@ CUNYVM.CUNY.EDU $: $1@$2.BITNET
After ruleset 0 selects the 'tcp' mailer, the mail is processed by
deliver.c. To avoid wildcard MX problems, deliver.c carefully disables
local domain qualification by setting a flag in _res . Unfortunately
the resolver has not been initialized, so this flag is internally
reset during initialization, and getmxrr(), which is called from
deliver.c, incorrectly matches CUNYVM.CUNY.EDU with the local
wildcard MX record, resulting in the incorrect processing of the message.
*** main.c.orig Fri Jul 20 16:19:20 1990
--- main.c Wed Oct 10 14:55:48 1990
***************
*** 220,225 ****
--- 220,230 ----
UserEnviron[i] = NULL;
environ = UserEnviron;
+ #ifdef NAMED_BIND
+ /* Make sure the resolver library is initialized */
+ res_init();
+ #endif /* NAMED_BIND */
+
# ifdef SETPROCTITLE
/*
** Save start and extent of argv for setproctitle.
--
=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
Neil W. Rickert, Computer Science <rickert at cs.niu.edu>
Northern Illinois Univ.
DeKalb, IL 60115. +1-815-753-6940
More information about the Comp.bugs.4bsd.ucb-fixes
mailing list