--- Begin Message ---
Package: xauth
Version: 1:1.0.4-1
Severity: normal
Tags: upstream patch
When using GDM via XDMCP, for examle when accessing GDM via
vncserver->XDMCP->localhost, ssh is no longer able to forward X11.
Invalid MIT-MAGIC-COOKIE-1 keyxterm Xt error: Can't open display:
localhost:10.0
The problem is, that xauth is unable to deal with the Family "FamilyWild" which
is used by GDM in XDMCP to store the MIT-MAGIC-COOKIE-1 for the user.
Attached are two patches, one for 1.0.4-1 and one for 1.0.7-1. The original
Patch is by Dr. Tilmann Bubeck.
Upstream Bug is at
https://bugs.freedesktop.org/show_bug.cgi?id=43425
FWIW, Redhat also has a bug for this:
https://bugzilla.redhat.com/show_bug.cgi?id=505545
-- System Information:
Debian Release: 6.0.6
APT prefers stable
APT policy: (500, 'stable')
Architecture: i386 (i686)
Kernel: Linux 2.6.32-5-xen-686 (SMP w/2 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash
Versions of packages xauth depends on:
ii libc6 2.11.3-4 Embedded GNU C Library: Shared lib
ii libx11-6 2:1.3.3-4 X11 client-side library
ii libxau6 1:1.0.6-1 X11 authorisation library
ii libxext6 2:1.1.2-1 X11 miscellaneous extension librar
ii libxmuu1 2:1.0.5-2 X11 miscellaneous micro-utility li
xauth recommends no packages.
xauth suggests no packages.
-- no debconf information
>From 5da21eaf6ec6537c3aab23adbebd617050e0c2c9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Stefan=20V=C3=B6lkel?= <stefan.volkel....@nsn.com>
Date: Wed, 8 Aug 2012 14:13:08 +0200
Subject: [PATCH] improve to handle FamilyWild necessary for GDM/XDMCP/SSH #43425
---
process.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 67 insertions(+), 9 deletions(-)
diff --git a/process.c b/process.c
index 893b51d..5a3984c 100644
--- a/process.c
+++ b/process.c
@@ -465,8 +465,11 @@ read_auth_entries(FILE *fp, Bool numeric, AuthList
**headp, AuthList **tailp)
return n;
}
-static Bool
-get_displayname_auth(char *displayname, AuthList **authl)
+/**
+ * Parse the given displayname and build a corresponding AuthList.
+ */
+static Bool
+get_displayname_auth(const char *displayname, AuthList **authl)
{
int family;
char *host = NULL, *rest = NULL;
@@ -997,6 +1000,9 @@ dump_entry(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:
@@ -1079,6 +1085,49 @@ 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)) {
+ free(host);
+ free(rest);
+
+ return False;
+ }
+
+ dpynumbuf[0] = '\0';
+ sprintf (dpynumbuf, "%d", dpynum);
+
+ if (a->address_length != strlen(host) || a->number_length !=
strlen(dpynumbuf)) {
+ free(host);
+ free(rest);
+
+ return False;
+ }
+
+ if (memcmp(a->address, host, a->address_length) == 0 &&
+ memcmp(a->number, dpynumbuf, a->number_length) == 0) {
+ free(host);
+ free(rest);
+
+ return True;
+ } else {
+ free(host);
+ free(rest);
+
+ return False;
+ }
+}
+
/* return non-zero iff display and authorization type are the same */
static int
@@ -1242,13 +1291,22 @@ iterdpy (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;
+ }
}
}
}
--
1.7.2.5
>From 1c84f163fd3dcdcb8b1193cc2debe08addf38551 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Stefan=20V=C3=B6lkel?= <stefan.volkel....@nsn.com>
Date: Wed, 8 Aug 2012 14:13:08 +0200
Subject: [PATCH] improve to handle FamilyWild necessary for GDM/XDMCP/SSH #43425
---
process.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 65 insertions(+), 7 deletions(-)
diff --git a/process.c b/process.c
index 283b4a1..03ea366 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,49 @@ 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)) {
+ free(host);
+ free(rest);
+
+ return False;
+ }
+
+ dpynumbuf[0] = '\0';
+ sprintf (dpynumbuf, "%d", dpynum);
+
+ if (a->address_length != strlen(host) || a->number_length !=
strlen(dpynumbuf)) {
+ free(host);
+ free(rest);
+
+ return False;
+ }
+
+ if (memcmp(a->address, host, a->address_length) == 0 &&
+ memcmp(a->number, dpynumbuf, a->number_length) == 0) {
+ free(host);
+ free(rest);
+
+ return True;
+ } else {
+ free(host);
+ free(rest);
+
+ return False;
+ }
+}
+
/* return non-zero iff display and authorization type are the same */
static int
@@ -1236,13 +1285,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;
+ }
}
}
}
--
1.7.2.5
--- End Message ---