mirror of
https://github.com/X11Libre/xf86-video-amdgpu.git
synced 2026-03-24 01:24:31 +00:00
DRI3: Refuse to open DRM file descriptor for ssh clients
Fixes hangs when attempting to use DRI3 on display connections forwarded via SSH. Don't do this for Xorg > 1.18.99.1 since the corresponding xserver change has landed in Git master. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=93261 (Ported from radeon commit 0b3aac1de9db42bfca545fa331e4985836682ec7) Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
@@ -38,6 +38,7 @@
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <libgen.h>
|
||||
|
||||
|
||||
static int
|
||||
@@ -87,6 +88,38 @@ amdgpu_dri3_open(ScreenPtr screen, RRProviderPtr provider, int *out)
|
||||
return Success;
|
||||
}
|
||||
|
||||
#if DRI3_SCREEN_INFO_VERSION >= 1 && XORG_VERSION_CURRENT <= XORG_VERSION_NUMERIC(1,18,99,1,0)
|
||||
|
||||
static int
|
||||
amdgpu_dri3_open_client(ClientPtr client, ScreenPtr screen,
|
||||
RRProviderPtr provider, int *out)
|
||||
{
|
||||
const char *cmdname = GetClientCmdName(client);
|
||||
Bool is_ssh = FALSE;
|
||||
|
||||
/* If the executable name is "ssh", assume that this client connection
|
||||
* is forwarded from another host via SSH
|
||||
*/
|
||||
if (cmdname) {
|
||||
char *cmd = strdup(cmdname);
|
||||
|
||||
/* Cut off any colon and whatever comes after it, see
|
||||
* https://lists.freedesktop.org/archives/xorg-devel/2015-December/048164.html
|
||||
*/
|
||||
cmd = strtok(cmd, ":");
|
||||
|
||||
is_ssh = strcmp(basename(cmd), "ssh") == 0;
|
||||
free(cmd);
|
||||
}
|
||||
|
||||
if (!is_ssh)
|
||||
return amdgpu_dri3_open(screen, provider, out);
|
||||
|
||||
return BadAccess;
|
||||
}
|
||||
|
||||
#endif /* DRI3_SCREEN_INFO_VERSION >= 1 && XORG_VERSION_CURRENT <= XORG_VERSION_NUMERIC(1,18,99,1,0) */
|
||||
|
||||
static PixmapPtr amdgpu_dri3_pixmap_from_fd(ScreenPtr screen,
|
||||
int fd,
|
||||
CARD16 width,
|
||||
@@ -172,9 +205,13 @@ static int amdgpu_dri3_fd_from_pixmap(ScreenPtr screen,
|
||||
}
|
||||
|
||||
static dri3_screen_info_rec amdgpu_dri3_screen_info = {
|
||||
#if DRI3_SCREEN_INFO_VERSION >= 1 && XORG_VERSION_CURRENT <= XORG_VERSION_NUMERIC(1,18,99,1,0)
|
||||
.version = 1,
|
||||
.open_client = amdgpu_dri3_open_client,
|
||||
#else
|
||||
.version = 0,
|
||||
|
||||
.open = amdgpu_dri3_open,
|
||||
#endif
|
||||
.pixmap_from_fd = amdgpu_dri3_pixmap_from_fd,
|
||||
.fd_from_pixmap = amdgpu_dri3_fd_from_pixmap
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user