On Thu, 9 Aug 2001, Philip Blundell wrote:
> Huh. Seems that Linux takes exception to listening on the same port for both
> IPv6 and IPv4 wildcard addresses.
On different sockets, yes. Here's the sordid story:
The original code listened on ONE wildcard v6 socket. On Linux and
Solaris, this catches both v4 and v6 incoming calls. However, the
maintainers of OpenBSD have security worries about this (a reference to
a document was posted) and in OpenBSD you have to listen on two sockets,
one a v6 socket and one a v4 socket. (Talking to some people here at the
IETF it seems that there is some growing consensus that keeping the two
stacks entirely separate is a Good Idea.) So, I modified Exim to operate
with two different sockets. That works on OpenBSD and FreeBSD, and I
also tested it on Solaris. Stupidly, I did not get it tested on Linux as
well.
It turns out that Linux has taken another approach. It allows the v6
socket to listen for both kinds of call, but *forbids* the use of a v4
wildcard socket at the same time. (Solaris seems quite clever here; if
you use two sockets, each kind of call goes to the appropriate socket.)
So I will have to modify Exim to cope with both approaches. The way to
do this would seem to be to listen on the v6 socket first, then if the
attempt to wildcard listen on the v4 socket fails with that particular
error (address in use), ignore the failure and assume we are on a system
that behaves in the Linux manner. I will do this, but certainly not till
next week and maybe it will be the week after.
People tell me that the details of this behaviour are NOT nailed down in
the RFCs, so one cannot accuse any of these systems of being
non-standard.
The other problem of socket creation failing when the kernel has no
support is different. I clearly have broken the code that handles that.
I will make sure it gets re-instated somehow.
What I will do (when I do it) is to post a patch for everybody to try on
their various OS.
Philip
--
Philip Hazel University of Cambridge Computing Service,
ph10@??? Cambridge, England. Phone: +44 1223 334714.