diff options
Diffstat (limited to 'ssh.c')
-rw-r--r-- | ssh.c | 21 |
1 files changed, 17 insertions, 4 deletions
@@ -39,7 +39,7 @@ | |||
39 | */ | 39 | */ |
40 | 40 | ||
41 | #include "includes.h" | 41 | #include "includes.h" |
42 | RCSID("$OpenBSD: ssh.c,v 1.158 2002/01/16 13:17:51 markus Exp $"); | 42 | RCSID("$OpenBSD: ssh.c,v 1.159 2002/01/27 18:08:17 stevesk Exp $"); |
43 | 43 | ||
44 | #include <openssl/evp.h> | 44 | #include <openssl/evp.h> |
45 | #include <openssl/err.h> | 45 | #include <openssl/err.h> |
@@ -793,14 +793,27 @@ x11_get_proto(char **_proto, char **_data) | |||
793 | static char proto[512], data[512]; | 793 | static char proto[512], data[512]; |
794 | FILE *f; | 794 | FILE *f; |
795 | int got_data = 0, i; | 795 | int got_data = 0, i; |
796 | char *display; | ||
796 | 797 | ||
797 | *_proto = proto; | 798 | *_proto = proto; |
798 | *_data = data; | 799 | *_data = data; |
799 | proto[0] = data[0] = '\0'; | 800 | proto[0] = data[0] = '\0'; |
800 | if (options.xauth_location) { | 801 | if (options.xauth_location && (display = getenv("DISPLAY"))) { |
801 | /* Try to get Xauthority information for the display. */ | 802 | /* Try to get Xauthority information for the display. */ |
802 | snprintf(line, sizeof line, "%.100s list %.200s 2>" _PATH_DEVNULL, | 803 | if (strncmp(display, "localhost:", 10) == 0) |
803 | options.xauth_location, getenv("DISPLAY")); | 804 | /* |
805 | * Handle FamilyLocal case where $DISPLAY does | ||
806 | * not match an authorization entry. For this we | ||
807 | * just try "xauth list unix:displaynum.screennum". | ||
808 | * XXX: "localhost" match to determine FamilyLocal | ||
809 | * is not perfect. | ||
810 | */ | ||
811 | snprintf(line, sizeof line, "%.100s list unix:%s 2>" | ||
812 | _PATH_DEVNULL, options.xauth_location, display+10); | ||
813 | else | ||
814 | snprintf(line, sizeof line, "%.100s list %.200s 2>" | ||
815 | _PATH_DEVNULL, options.xauth_location, display); | ||
816 | debug2("x11_get_proto %s", line); | ||
804 | f = popen(line, "r"); | 817 | f = popen(line, "r"); |
805 | if (f && fgets(line, sizeof(line), f) && | 818 | if (f && fgets(line, sizeof(line), f) && |
806 | sscanf(line, "%*s %511s %511s", proto, data) == 2) | 819 | sscanf(line, "%*s %511s %511s", proto, data) == 2) |