diff --git a/process.c b/process.c index 283b4a1..49d1b13 100644 --- a/process.c +++ b/process.c @@ -462,7 +462,10 @@ read_auth_entries(FILE *fp, Bool numeric, AuthList **headp, AuthList **tailp) return n; } -static Bool +/** + * Parse the given displayname and build a corresponding AuthList. + */ +static Bool get_displayname_auth(const char *displayname, AuthList **authl) { int family; @@ -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,39 @@ 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)) { + if (host) free(host); + if (rest) free(rest); + + return False; + } + + dpynumbuf[0] = '\0'; + sprintf (dpynumbuf, "%d", dpynum); + + 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; +} + /* return non-zero iff display and authorization type are the same */ static int @@ -1236,13 +1275,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; + } } } }