[cvsnt] ipv6 handling in cvsnt is broken

Arkadiusz Miskiewicz arekm at maven.pl
Sun Nov 9 23:30:04 GMT 2008


On Sunday 09 of November 2008, Tony Hoyle wrote:
> Arkadiusz Miskiewicz wrote:
> > IPv6 support seems quite broken in cvsnt (looking at 2.5.04.3236)
> >
> > It doesn't support [ipv6]:port notation, binds to ::1 port while it
> > should bind to ipv4 address, too (cvslockd as example. Server tries to
> > use "localhost" name which resolves only to 127.0.0.1 address, tries to
> > connect to it but lockserver is available only at ::1).
>
> The production cvs.cvsnt.org server has been running on ipv6 for several
> years with no issues.  All the test boxes at the Salford site are ipv6
> enabled as well*.
>
> cvslockd (and cvsservice, which is substantially the same code) binds to
> all available protocols, not limited to ipv4 and ipv6 even (it doesn't
> care).
>
> On many OSs (linux for example) binding to ::1 causes an automatic bind
> to 127.0.0.1, 

This rule only applies to ::, not ::1.

> which causes the second bind to fail, but that's expected 
> and entirely harmless.  

On Linux this is controlled by net.ipv6.bindv6only syscall. Users can have 
both behaviours if they wish (default is 0, so socket bound to :: also gets 
127.0.0.1 directed connections). Better is to have constant behaviour thanks 
to IPV6_V6ONLY opt.

> cvsnt doesn't specifically support *any* notation - that's 100% an OS
> issue.  

You are wrong here. Tell me how to specify LockServer being ::1 with port 432 
in PServer config file? Parsing is done in cvsnt, I see strchr used there for 
example.

[ipv6address]:port notation is defined in RFC2732 and it comonly used not only 
for URLs. This should be fixed in cvsnt itself.

> If you want to specify the lockserver at ip6-localhost then then you can
> - although it's entirely pointless unless you're trying to run a single
> stack ipv6 host, and I've never seen that done on a production machine
> as there's so much software that simply won't work in that environment.

Somehow cvslockd is bound only to ::1 and not 127.0.0.1 here. Which is weird 
since getaddrinfo(NULL seems to be used).

Consider adding code like this in CSocketIO::create():

#ifdef IPV6_V6ONLY
                /* Only communicate in IPv6 over AF_INET6 sockets. */
                if (ai->ai_family == AF_INET6) {
                        if (::setsockopt(listen_sock, IPPROTO_IPV6, 
IPV6_V6ONLY,
                            &on, sizeof(on)) == -1)
                                CServerIo::trace(3, "setsockopt 
IPV6_V6ONLY: %s",
                                    strerror(errno));
                }
#endif


It will cause IPv6 sockets to do not interfere with IPv4 traffic. Tested here 
locally - fixes the problem for me.

Complete patch:
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/SOURCES/cvsnt-ipv6.patch?rev=1.1;content-type=text%2Fplain

> Tony


-- 
Arkadiusz Miśkiewicz        PLD/Linux Team
arekm / maven.pl            http://ftp.pld-linux.org/


More information about the cvsnt mailing list