Stefan Dirsch
e98de749e7
* Fix a long standing problem that for ssh tunneled connections a display variable of the form: localhost:<N>.<M> leads to correct authorization when an X client is started but "xauth list $DISPLAY" returns nothing. * Fix for: If using GDM with XDMCP, then ssh is not able to start X11 clients on the remote side. You get a "No xauth data; using fake authentication data for X11 forwarding." from SSH. - obsoletes xauth-1.0.2.diff, u_xauth_Look-for-FamilyLocal-if-inet-or-inet6-addr.patch - adjusted xauth-tolerant-hostname-changes.diff - added new test_xauth tool to %files section OBS-URL: https://build.opensuse.org/package/show/X11:XOrg/xauth?expand=0&rev=4
175 lines
6.3 KiB
Diff
175 lines
6.3 KiB
Diff
Index: xauth-1.0.8/gethost.c
|
|
===================================================================
|
|
--- xauth-1.0.8.orig/gethost.c
|
|
+++ xauth-1.0.8/gethost.c
|
|
@@ -156,7 +156,8 @@ struct addrlist *get_address_info (
|
|
int family,
|
|
const char *fulldpyname,
|
|
int prefix,
|
|
- char *host)
|
|
+ char *host,
|
|
+ char *localhostname)
|
|
{
|
|
struct addrlist *retval = NULL;
|
|
int len = 0;
|
|
@@ -183,7 +184,7 @@ struct addrlist *get_address_info (
|
|
if (prefix == 0 && (strncmp (fulldpyname, "unix:", 5) == 0 ||
|
|
fulldpyname[0] == ':')) {
|
|
|
|
- if (!get_local_hostname (buf, sizeof buf)) {
|
|
+ if (!get_local_hostname (buf, sizeof buf, localhostname)) {
|
|
len = 0;
|
|
} else {
|
|
src = buf;
|
|
@@ -233,7 +234,7 @@ struct addrlist *get_address_info (
|
|
src = &(sin->sin_addr);
|
|
if (*(const in_addr_t *) src == htonl(INADDR_LOOPBACK)) {
|
|
family = FamilyLocal;
|
|
- if (get_local_hostname (buf, sizeof buf)) {
|
|
+ if (get_local_hostname (buf, sizeof buf, localhostname)) {
|
|
src = buf;
|
|
len = strlen (buf);
|
|
} else
|
|
@@ -248,7 +249,7 @@ struct addrlist *get_address_info (
|
|
if (!IN6_IS_ADDR_V4MAPPED((const struct in6_addr *)src)) {
|
|
if (IN6_IS_ADDR_LOOPBACK((const struct in6_addr *)src)) {
|
|
family = FamilyLocal;
|
|
- if (get_local_hostname (buf, sizeof buf)) {
|
|
+ if (get_local_hostname (buf, sizeof buf, localhostname)) {
|
|
src = buf;
|
|
len = strlen (buf);
|
|
} else
|
|
@@ -303,7 +304,7 @@ struct addrlist *get_address_info (
|
|
src = (char *) &hostinetaddr;
|
|
if (*(const in_addr_t *) src == htonl(INADDR_LOOPBACK)) {
|
|
family = FamilyLocal;
|
|
- if (get_local_hostname (buf, sizeof buf)) {
|
|
+ if (get_local_hostname (buf, sizeof buf, localhostname)) {
|
|
src = buf;
|
|
len = strlen (buf);
|
|
} else {
|
|
Index: xauth-1.0.8/parsedpy.c
|
|
===================================================================
|
|
--- xauth-1.0.8.orig/parsedpy.c
|
|
+++ xauth-1.0.8/parsedpy.c
|
|
@@ -70,20 +70,23 @@ copystring (const char *src, int len)
|
|
|
|
|
|
char *
|
|
-get_local_hostname (char *buf, int maxlen)
|
|
+get_local_hostname (char *buf, int maxlen, char *localhostname)
|
|
{
|
|
buf[0] = '\0';
|
|
+ if (localhostname)
|
|
+ strncpy(buf, localhostname, maxlen);
|
|
+ else
|
|
(void) XmuGetHostname (buf, maxlen);
|
|
return (buf[0] ? buf : NULL);
|
|
}
|
|
|
|
#ifndef UNIXCONN
|
|
static char *
|
|
-copyhostname (void)
|
|
+copyhostname (char *localhostname)
|
|
{
|
|
char buf[256];
|
|
|
|
- return (get_local_hostname (buf, sizeof buf) ?
|
|
+ return (get_local_hostname (buf, sizeof buf, localhostname) ?
|
|
copystring (buf, strlen (buf)) : NULL);
|
|
}
|
|
#endif
|
|
@@ -93,6 +96,7 @@ copyhostname (void)
|
|
*/
|
|
Bool
|
|
parse_displayname (const char *displayname,
|
|
+ char *localhostname,
|
|
int *familyp, /* return */
|
|
char **hostp, /* return */
|
|
int *dpynump, /* return */
|
|
@@ -134,7 +138,7 @@ parse_displayname (const char *displayna
|
|
host = copystring ("0", 1);
|
|
family = FamilyDECnet;
|
|
} else {
|
|
- host = copyhostname ();
|
|
+ host = copyhostname (localhostname);
|
|
family = FamilyInternet;
|
|
}
|
|
#endif
|
|
Index: xauth-1.0.8/process.c
|
|
===================================================================
|
|
--- xauth-1.0.8.orig/process.c
|
|
+++ xauth-1.0.8/process.c
|
|
@@ -470,7 +470,7 @@ read_auth_entries(FILE *fp, Bool numeric
|
|
}
|
|
|
|
static Bool
|
|
-get_displayname_auth(const char *displayname, AuthList **authl)
|
|
+get_displayname_auth(const char *displayname, AuthList **authl, char *localhostname)
|
|
{
|
|
int family;
|
|
char *host = NULL, *rest = NULL;
|
|
@@ -490,11 +490,13 @@ get_displayname_auth(const char *display
|
|
prelen = (cp - displayname);
|
|
|
|
if (!parse_displayname (displayname + ((prelen > 0) ? prelen + 1 : 0),
|
|
+ localhostname,
|
|
&family, &host, &dpynum, &scrnum, &rest)) {
|
|
return False;
|
|
}
|
|
|
|
- addrlist_head = get_address_info(family, displayname, prelen, host);
|
|
+ addrlist_head = get_address_info(family, displayname, prelen, host,
|
|
+ localhostname);
|
|
if (addrlist_head) {
|
|
char buf[40]; /* want to hold largest display num */
|
|
unsigned short dpylen;
|
|
@@ -1240,13 +1242,18 @@ iterdpy (const char *inputfilename, int
|
|
Xauth *tmp_auth;
|
|
AuthList *proto_head, *proto;
|
|
AuthList *l, *next;
|
|
-
|
|
+ /*
|
|
+ * get saved local address from environment in case the host
|
|
+ * name has changed after the credential was added.
|
|
+ */
|
|
+ char *xlocalhostname = getenv("XAUTHLOCALHOSTNAME");
|
|
+
|
|
/*
|
|
* iterate
|
|
*/
|
|
for (i = start; i < argc; i++) {
|
|
const char *displayname = argv[i];
|
|
- if (!get_displayname_auth (displayname, &proto_head)) {
|
|
+ if (!get_displayname_auth (displayname, &proto_head, xlocalhostname)) {
|
|
prefix (inputfilename, lineno);
|
|
baddisplayname (displayname, argv[0]);
|
|
errors++;
|
|
@@ -1601,7 +1608,7 @@ do_add(const char *inputfilename, int li
|
|
}
|
|
}
|
|
|
|
- if (!get_displayname_auth (dpyname, &list)) {
|
|
+ if (!get_displayname_auth (dpyname, &list, NULL)) {
|
|
prefix (inputfilename, lineno);
|
|
baddisplayname (dpyname, argv[0]);
|
|
free (key);
|
|
Index: xauth-1.0.8/xauth.h
|
|
===================================================================
|
|
--- xauth-1.0.8.orig/xauth.h
|
|
+++ xauth-1.0.8/xauth.h
|
|
@@ -48,10 +48,10 @@ struct addrlist {
|
|
};
|
|
|
|
extern const char *get_hostname ( Xauth *auth );
|
|
-extern struct addrlist *get_address_info ( int family, const char *fulldpyname, int prefix, char *host);
|
|
+extern struct addrlist *get_address_info ( int family, const char *fulldpyname, int prefix, char *host, char *localhostname);
|
|
extern char *copystring ( const char *src, int len );
|
|
-extern char *get_local_hostname ( char *buf, int maxlen );
|
|
-extern Bool parse_displayname ( const char *displayname, int *familyp, char **hostp, int *dpynump, int *scrnump, char **restp );
|
|
+extern char *get_local_hostname ( char *buf, int maxlen, char *localhostname );
|
|
+extern Bool parse_displayname ( const char *displayname, char *localhostname, int *familyp, char **hostp, int *dpynump, int *scrnump, char **restp );
|
|
extern int auth_initialize ( const char *authfilename );
|
|
extern int auth_finalize ( void );
|
|
extern int process_command ( const char *inputfilename, int lineno, int argc, const char **argv );
|