[PATCH] xauth: improve to handle FamilyWild necessary for GDM/XDMCP/SSH. #43425
walter harms
wharms at bfs.de
Mon Dec 19 02:55:48 PST 2011
Am 19.12.2011 10:23, schrieb Dr. Tilmann Bubeck:
> 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;
>> + }
i do not know parse_displayname() but i guess it will allocate
memory for host and rest. I do not see a free()
memory leak ?
>> +
>> + 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);
>> +}
>> +
i have a problem with these memcp() block.
could you entangle it a bit to improve readability ?
like
if ( a->address_length != strlen(host) || a->number_length == strlen(dpynumbuf) )
return False;
if ( memcmp(a->address, host, a->address_length) == 0 &&
memcmp(a->number, dpynumbuf, a->number_length) == 0) )
return True;
else
return False;
hope that helps,
re,
wh
>> /* 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;
>> + }
>> }
>> }
>> }
>
>
More information about the xorg-devel
mailing list