[PATCH] xauth: improve to handle FamilyWild necessary for GDM/XDMCP/SSH. #43425

Dr. Tilmann Bubeck t.bubeck at reinform.de
Mon Dec 19 01:23:00 PST 2011


Hello xorg,

I sent you the mail below a few days ago with a patch for xauth. According  
to http://www.x.org/wiki/Development/Documentation/SubmittingPatches I am  
now pinging the list again. I do not know any maintainer to CC, so I only  
wrote to this list.

I would be glad if this patch gets included.

Also feel free to contact me, if anything has to be changed.

Kind regards,
   Till




On Thu, 01 Dec 2011 17:44:02 +0100, Dr. Tilmann Bubeck  
<t.bubeck at reinform.de> wrote:

> From: "Dr. Tilmann Bubeck" <t.bubeck at reinform.de>
>
> xauth is currently unable to handle FamilyWild. This gives problems
> with GDM receiving XDMCP request which used FamilyWild. More details
> in the referenced freedesktop bugzilla entry.
>
> The patch improves xauth to handle that Family:
>   * allow "dump_entry" to deal with that Family and output
>     such entries correctly.
>   * allow "list $DISPLAY" to match against an entry in
>     XAUTHORITY of type FamilyWild.
>
> Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=43425
>
> Signed-off-by: Dr. Tilmann Bubeck <t.bubeck at reinform.de>
> ---
>  process.c |   55 ++++++++++++++++++++++++++++++++++++++++++++++++-------
>  1 files changed, 48 insertions(+), 7 deletions(-)
>
> diff --git a/process.c b/process.c
> index 283b4a1..651bea0 100644
> --- a/process.c
> +++ b/process.c
> @@ -462,6 +462,9 @@ read_auth_entries(FILE *fp, Bool numeric, AuthList  
> **headp, AuthList **tailp)
>      return n;
>  }
> +/**
> + * Parse the given displayname and build a corresponding AuthList.
> + */
>  static Bool
>  get_displayname_auth(const char *displayname, AuthList **authl)
>  {
> @@ -991,6 +994,9 @@ dump_entry(const char *inputfilename, int lineno,  
> Xauth *auth, char *data)
>  	    fwrite (auth->address, sizeof (char), auth->address_length, fp);
>  	    fprintf (fp, "/unix");
>  	    break;
> +  	  case FamilyWild:
> +	    fwrite (auth->address, sizeof (char), auth->address_length, fp);
> +	    break;
>  	  case FamilyInternet:
>  #if defined(IPv6) && defined(AF_INET6)
>  	  case FamilyInternet6:
> @@ -1073,6 +1079,32 @@ match_auth_dpy(register Xauth *a, register Xauth  
> *b)
>  	     memcmp(a->number, b->number, a->number_length) == 0) ? 1 : 0);
>  }
> +static int
> +match_authwild_dpy(register Xauth *a, const char *displayname)
> +{
> +    int family;
> +    char *host = NULL, *rest = NULL;
> +    int dpynum, scrnum;
> +    char dpynumbuf[40];			/* want to hold largest display num */
> +
> +    if ( a->family != FamilyWild ) {
> +	return False;
> +    }
> +
> +    if (!parse_displayname (displayname,
> +			    &family, &host, &dpynum, &scrnum, &rest)) {
> +	return False;
> +    }
> +
> +    dpynumbuf[0] = '\0';
> +    sprintf (dpynumbuf, "%d", dpynum);
> +
> +    return ((a->address_length == strlen(host) &&
> +	     a->number_length == strlen(dpynumbuf) &&
> +	     memcmp(a->address, host, a->address_length) == 0 &&
> +	     memcmp(a->number, dpynumbuf, a->number_length) == 0) ? 1 : 0);
> +}
> +
>  /* return non-zero iff display and authorization type are the same */
> static int
> @@ -1236,13 +1268,22 @@ iterdpy (const char *inputfilename, int lineno,  
> int start,
>  	    /* l may be freed by remove_entry below. so save its contents */
>  	    next = l->next;
>  	    tmp_auth = copyAuth(l->auth);
> -	    for (proto = proto_head; proto; proto = proto->next) {
> -		if (match_auth_dpy (proto->auth, tmp_auth)) {
> -		    matched = True;
> -		    if (yfunc) {
> -			status = (*yfunc) (inputfilename, lineno,
> -					   tmp_auth, data);
> -			if (status < 0) break;
> +
> +	    if ( match_authwild_dpy(tmp_auth, displayname) ) {
> +	        matched = True;
> +		if (yfunc) {
> +		    status = (*yfunc) (inputfilename, lineno,
> +				       tmp_auth, data);
> +		}
> +	    } else {
> +	        for (proto = proto_head; proto; proto = proto->next) {
> +		    if (match_auth_dpy (proto->auth, tmp_auth)) {
> +		        matched = True;
> +		        if (yfunc) {
> +			    status = (*yfunc) (inputfilename, lineno,
> +				   	       tmp_auth, data);
> +			    if (status < 0) break;
> +			}
>  		    }
>  		}
>  	    }


-- 
Mit freundlichen Gruessen,
    Tilmann Bubeck

+-------+-------------------------------------------------------------+
|       | dr. tilmann bubeck               reinform medien- und       |
|       |                                  informationstechnologie AG |
| rein  | fon  : +49 (711) 7 82 76-52      loeffelstr. 40             |
| form  | fax  : +49 (711) 7 82 76-46      70597 stuttgart / germany  |
|    AG | cell.: +49 (172) 8 84 29 72      fon: +49 (711) 75 86 56-10 |
|       | email: t.bubeck at reinform.de      http://www.reinform.de     |
|       +-------------------------------------------------------------+
|       | pflichtangaben nach paragraph 80, AktG:                     |
|       | reinform medien- und informationstechnologie AG, stuttgart  |
|       | handelsregister stuttgart, HRB 23001                        |
|       | vorstand:     dr. tilmann bubeck (vorsitz)                  |
|       | aufsichtsrat: frank stege (vorsitz)                         |
+-------+-------------------------------------------------------------+


More information about the xorg-devel mailing list