1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-09 17:38:00 +00:00

Avoid treating non-X GDK display names as X ones

When running on Wayland, gdk_display_get_name() can return things like
"wayland-0" rather than valid X display names.  PuTTY nonetheless
treated them as X display names, meaning that when running under
Wayland, pterm would set DISPLAY to "wayland-0" in subprocesses, and
PuTTY's X forwarding wouldn't work properly.

To fix this, places that call gdk_display_get_name() now only do so on
displays for which GDK_IS_X_DISPLAY() is true.  As with
GDK_IS_X_WINDOW(), this requires some backward-compatibility for GDK
versions where everything is implicitly running on X.

To make this work usefully, pterm now also won't unset DISPLAY if it
can't get an X display name and instead will pass through whatever value
of DISPLAY it received.  I think that's better behaviour anyway.

There are two separate parts of PuTTY that call gdk_display_get_name().
platform_get_x_display() in unix/putty.c is used for X forwarding, while
gtk_seat_get_x_display() in unix/window.c is used used for setting DISPLAY
and recording in utmp.  I've updated both of them.
This commit is contained in:
Ben Harris 2023-07-15 21:05:41 +01:00
parent 1ce8ec9c82
commit 09095a7d92
4 changed files with 16 additions and 7 deletions

View File

@ -187,6 +187,7 @@
#endif /* 2.24 */ #endif /* 2.24 */
#if !GTK_CHECK_VERSION(3,0,0) #if !GTK_CHECK_VERSION(3,0,0)
#define GDK_IS_X11_DISPLAY(display) (1)
#define GDK_IS_X11_WINDOW(window) (1) #define GDK_IS_X11_WINDOW(window) (1)
#endif #endif

View File

@ -1138,8 +1138,6 @@ Backend *pty_backend_create(
char *x_display_env_var = dupprintf("DISPLAY=%s", x_display); char *x_display_env_var = dupprintf("DISPLAY=%s", x_display);
putenv(x_display_env_var); putenv(x_display_env_var);
/* As above, we don't free this. */ /* As above, we don't free this. */
} else {
unsetenv("DISPLAY");
} }
} }
#endif #endif

View File

@ -18,6 +18,10 @@
#include "gtkcompat.h" #include "gtkcompat.h"
#ifndef NOT_X_WINDOWS
#include <gdk/gdkx.h>
#endif
/* /*
* Stubs to avoid pty.c needing to be linked in. * Stubs to avoid pty.c needing to be linked in.
*/ */
@ -62,8 +66,11 @@ const bool dup_check_launchable = true;
char *platform_get_x_display(void) { char *platform_get_x_display(void) {
const char *display; const char *display;
#ifndef NOT_X_WINDOWS
/* Try to take account of --display and what have you. */ /* Try to take account of --display and what have you. */
if (!(display = gdk_get_display())) if (!GDK_IS_X11_DISPLAY(gdk_display_get_default()) ||
!(display = gdk_get_display()))
#endif
/* fall back to traditional method */ /* fall back to traditional method */
display = getenv("DISPLAY"); display = getenv("DISPLAY");
return dupstr(display); return dupstr(display);

View File

@ -411,8 +411,8 @@ StripCtrlChars *gtk_seat_stripctrl_new(
static void gtk_seat_notify_remote_exit(Seat *seat); static void gtk_seat_notify_remote_exit(Seat *seat);
static void gtk_seat_update_specials_menu(Seat *seat); static void gtk_seat_update_specials_menu(Seat *seat);
static void gtk_seat_set_busy_status(Seat *seat, BusyStatus status); static void gtk_seat_set_busy_status(Seat *seat, BusyStatus status);
static const char *gtk_seat_get_x_display(Seat *seat);
#ifndef NOT_X_WINDOWS #ifndef NOT_X_WINDOWS
static const char *gtk_seat_get_x_display(Seat *seat);
static bool gtk_seat_get_windowid(Seat *seat, long *id); static bool gtk_seat_get_windowid(Seat *seat, long *id);
#endif #endif
static void gtk_seat_set_trust_status(Seat *seat, bool trusted); static void gtk_seat_set_trust_status(Seat *seat, bool trusted);
@ -439,10 +439,11 @@ static const SeatVtable gtk_seat_vt = {
.prompt_descriptions = gtk_seat_prompt_descriptions, .prompt_descriptions = gtk_seat_prompt_descriptions,
.is_utf8 = gtk_seat_is_utf8, .is_utf8 = gtk_seat_is_utf8,
.echoedit_update = nullseat_echoedit_update, .echoedit_update = nullseat_echoedit_update,
.get_x_display = gtk_seat_get_x_display,
#ifdef NOT_X_WINDOWS #ifdef NOT_X_WINDOWS
.get_x_display = nullseat_get_x_display,
.get_windowid = nullseat_get_windowid, .get_windowid = nullseat_get_windowid,
#else #else
.get_x_display = gtk_seat_get_x_display,
.get_windowid = gtk_seat_get_windowid, .get_windowid = gtk_seat_get_windowid,
#endif #endif
.get_window_pixel_size = gtk_seat_get_window_pixel_size, .get_window_pixel_size = gtk_seat_get_window_pixel_size,
@ -4348,12 +4349,14 @@ void modalfatalbox(const char *p, ...)
exit(1); exit(1);
} }
#ifndef NOT_X_WINDOWS
static const char *gtk_seat_get_x_display(Seat *seat) static const char *gtk_seat_get_x_display(Seat *seat)
{ {
return gdk_get_display(); if (GDK_IS_X11_DISPLAY(gdk_display_get_default()))
return gdk_get_display();
return NULL;
} }
#ifndef NOT_X_WINDOWS
static bool gtk_seat_get_windowid(Seat *seat, long *id) static bool gtk_seat_get_windowid(Seat *seat, long *id)
{ {
GtkFrontend *inst = container_of(seat, GtkFrontend, seat); GtkFrontend *inst = container_of(seat, GtkFrontend, seat);