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 theconnectionType/connectionAddress are coming from, and why/if they should be used instead of the originalAddress. But I tested that I could get alogin 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
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