[xdm PATCH 3/3] xdmcp: use getnameinfo() to get a name from a struct sockaddr

Jeremy Huddleston jeremyhu at freedesktop.org
Tue Mar 23 13:22:38 PDT 2010


Reviewed-by: Jeremy Huddleston <jeremyhu at 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 <jcristau at 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 at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 5820 bytes
Desc: not available
URL: <http://lists.x.org/archives/xorg-devel/attachments/20100323/9be07a9b/attachment.bin>


More information about the xorg-devel mailing list