PATCH /usr/include/X11/Xtrans/Xtranssock.c [WAS: Re: xhost package not compiled for IPv6]

Jon TURNEY jon.turney@dronecode.org.uk
Wed Aug 12 12:54:00 GMT 2009


On 12/08/2009 07:19, cygwin wrote:
> The following patch corrects the problem reported as:

Thanks very much for the patch.

>
> "The server listens on IPv6 addresses ok and recognizes incoming
> connections, but then the client just hangs. The server logs
> "_XSERVTransSocketINETAccept: accept() failed"
>
>
> --- /usr/include/X11/Xtrans/Xtranssock.c.orig 2009-08-12
> 02:02:43.640625000 -0400
> +++ /usr/include/X11/Xtrans/Xtranssock.c 2009-08-12 02:04:10.078125000
> -0400
> @@ -1255,7 +1255,7 @@
>
> {
> XtransConnInfo newciptr;
> - struct sockaddr_in sockname;
> + struct sockaddr_storage sockname;
> SOCKLEN_T namelen = sizeof(sockname);
>
> PRMSG (2, "SocketINETAccept(%p,%d)\n", ciptr, ciptr->fd, 0);
>
>
> With this in place, and recompiling the X11 server it will properly
> accept client connections over IPv6 transport.

While auditing the rest of libxtrans to see if the same problem occurs 
anywhere else, I notice that this should probably be written as below to avoid 
breaking compilation on IPv4-only systems.

diff --git a/Xtranssock.c b/Xtranssock.c
index 0935744..4d2e2cb 100644
--- a/Xtranssock.c
+++ b/Xtranssock.c
@@ -1260,7 +1260,11 @@ TRANS(SocketINETAccept) (XtransConnInfo ciptr, int *status)

  {
      XtransConnInfo     newciptr;
+#if defined(IPv6) && defined(AF_INET6)
+    struct sockaddr_storage    sockname;
+#else
      struct sockaddr_in sockname;
+#endif
      SOCKLEN_T          namelen = sizeof(sockname);

      PRMSG (2, "SocketINETAccept(%p,%d)\n", ciptr, ciptr->fd, 0);


Hmmm... but if it's really the size of the sockname argument which is causing 
the accept() to fail, this would be a bug in cygwin's accept() implementation, 
as it's supposed to truncate the data written to the sockname, rather than 
fail if it won't fit [1].  If that actually is the case, since we don't 
actually use the peer address here, the code as stands is correct (if a little 
odd).

I suppose I need to write a small test case to look at this...

> The IPv6 socket implementation for the X11 server seems rather poorly
> written, it does not follow the generally recommended practice of
> porting IPv4 code for IPv6/IPv4 dual stack.

Yes, xtrans is recognized as a bit of mess, so well done making any sense out 
of it :-)

[1] http://www.opengroup.org/onlinepubs/009695399/functions/accept.html

-- 
Jon TURNEY
Volunteer Cygwin/X X Server maintainer

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://x.cygwin.com/docs/
FAQ:                   http://x.cygwin.com/docs/faq/



More information about the Cygwin-xfree mailing list