OpenBSD 4.4 gnutls-serv IPv6 Only Bug
pdh at wiredyne.com
Thu Apr 30 05:15:25 CEST 2009
> > Yes, but it's somewhat complicated, you have to create a socket for each
> > returned addrinfo structure, bind them all, set them non-blocking, and
> > then poll across them to wait for a connection, and cope with the edge
> > cases with v6-mapped IPv4 addresses which make it not that simple.
> I tried to implement that:
> Peter, can you test the latest daily snapshot?
I tested the 20090424 snapshot under OpenBSD 4.4 and gnutls-serv emits
a bind error for the IPv4 socket and only listens on the IPv6 socket.
When bind() is called in listen_socket(), it is given two "res->"
arguments, but it should be two "ptr->" arguments. Otherwise it
doesn't move to ptr->ai_next the second time through the for loop.
> diff serv.c.orig serv.c
> < if (bind (s, res->ai_addr, res->ai_addrlen) < 0)
> > if (bind (s, ptr->ai_addr, ptr->ai_addrlen) < 0)
And I suspect this problem has the same cause:
> There seems to be a cosmetic problem, though, on my normal debian
> jas at mocca:~/src/gnutls/src master$ ./gnutls-serv
> Set static Diffie Hellman parameters, consider --dhparams.
> Echo Server listening to 0.0.0.0:5556 (family 2)...done
> Echo Server listening to :::5556 (family 10)...bind() failed: Invalid argument
> ^CExiting via signal 2
> jas at mocca:~/src/gnutls/src master$
> It seems bind fail on my IPv6 interface, which is probably right because
> I haven't setup IPv6 here. Is ignoring bind failures the right thing?
> I'm not sure why getaddrinfo returns the IPv6 interface at all.
My guess is that you actually have an IPv6 address assigned to an
interface. It's probably a "link-local" default address, but an
address nontheless. It is proper that getaddrinfo returns an entry
for it -- and when it does you get hit by the bad call to bind().
More information about the Gnutls-devel