Reviewed-by: Jeremy Huddleston <jerem...@apple.com>

On Mar 23, 2010, at 11:40, Julien Cristau wrote:

xdm uses gethostbyaddr and inet_ntop to get the display name.  This
fails for e.g. link-local ipv6 addresses.  Use getnameinfo instead,
which gives us what we want.

Signed-off-by: Julien Cristau <jcris...@debian.org>
---
I'm not sure this is correct, I don't quite understand where the
connectionType/connectionAddress are coming from, and why/if they should be used instead of the originalAddress. But I tested that I could get a
login window with 'X -query fe80::dead:beff:feef:0123%eth0', which
didn't work before because the interface was lost when going from
address to display name.

xdmcp.c |   43 +++++++++++++++----------------------------
1 files changed, 15 insertions(+), 28 deletions(-)

diff --git a/xdmcp.c b/xdmcp.c
index 66a5e0f..640d845 100644
--- a/xdmcp.c
+++ b/xdmcp.c
@@ -516,6 +516,7 @@ NetworkAddressToName(
    CARD16      connectionType,
    ARRAY8Ptr   connectionAddress,
    struct sockaddr   *originalAddress,
+    int addrlen,
    CARD16      displayNumber)
{
    switch (connectionType)
@@ -526,39 +527,34 @@ NetworkAddressToName(
        {
            CARD8               *data;
            struct hostent      *hostent;
-           char                *hostname = NULL;
+           char                hostname[NI_MAXHOST];
            char                *name;
            char                *localhost;
            int                  multiHomed = 0;
            struct addrinfo      hints, *ai = NULL, *nai;
            int                  type;
+           int                  rc;

-           if (connectionType == FamilyInternet6)
-               type = AF_INET6;
-           else
-               type = AF_INET;
+           rc = getnameinfo(originalAddress, addrlen, hostname, NI_MAXHOST,
+                            NULL, 0, 0);

-           data = connectionAddress->data;
-           hostent = gethostbyaddr ((char *)data,
-                                    connectionAddress->length, type);
-           if (hostent) {
+           if (!rc) {
                if (sourceAddress) {
                    bzero(&hints, sizeof(hints));
                    hints.ai_flags = AI_CANONNAME;
-                   if (getaddrinfo(hostent->h_name, NULL, &hints, &ai) == 0) {
-                       hostname = ai->ai_canonname;
+                   if (getaddrinfo(hostname, NULL, &hints, &ai) == 0) {
                        for (nai = ai->ai_next; nai!=NULL; nai=nai->ai_next) {
                            if ((ai->ai_protocol == nai->ai_protocol) &&
-                               (ai->ai_addrlen == nai->ai_addrlen) &&
-                               (memcmp(ai->ai_addr,nai->ai_addr,
-                                       ai->ai_addrlen) != 0) ) {
+                               (ai->ai_addrlen == nai->ai_addrlen) &&
+                               (memcmp(ai->ai_addr, nai->ai_addr,
+                                       ai->ai_addrlen) != 0) ) {
                                multiHomed = 1;
                            }
                        }
                    }
-               } else {
-                   hostname = hostent->h_name;
                }
+           } else {
+               hostname[0] = '\0';
            }

            localhost = localHostname ();
@@ -566,7 +562,7 @@ NetworkAddressToName(
            /*
             * protect against bogus host names
             */
-           if (hostname && hostname[0] && (hostname[0] != '.')
+           if (hostname[0] && (hostname[0] != '.')
                        && !multiHomed)
            {
                if (!strcmp (localhost, hostname))
@@ -615,17 +611,7 @@ NetworkAddressToName(
                        freeaddrinfo(ai);
                    return NULL;
                }
-               if (multiHomed) {
-                   if (connectionType == FamilyInternet) {
-                       data = (CARD8 *)
-                         &((struct sockaddr_in *)originalAddress)->
-                         sin_addr;
-                   } else {
-                       data = (CARD8 *)
-                         &((struct sockaddr_in6 *)originalAddress)->sin6_addr;
-                   }
-               }
-               if (inet_ntop(type, data, name, INET6_ADDRSTRLEN) == NULL) {
+ if (getnameinfo(originalAddress, addrlen, name, INET6_ADDRSTRLEN, NULL, 0, NI_NUMERICHOST) != 0) {
                    free(name);
                    if (ai)
                        freeaddrinfo(ai);
@@ -1200,6 +1186,7 @@ manage (
            name = NetworkAddressToName (pdpy->connectionType,
                                         &pdpy->connectionAddress,
                                         from,
+                                        fromlen,
                                         pdpy->displayNumber);
            Debug ("Computed display name: %s for: %s\n",
                   name, (char *)pdpy->connectionAddress.data);
--
1.7.0

_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Attachment: smime.p7s
Description: S/MIME cryptographic signature

_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to