xf86-video-ati: Branch 'master'

Michel Dänzer daenzer at kemper.freedesktop.org
Wed Mar 30 09:32:02 UTC 2016


 src/radeon_dri3.c |   39 ++++++++++++++++++++++++++++++++++++++-
 1 file changed, 38 insertions(+), 1 deletion(-)

New commits:
commit 0b3aac1de9db42bfca545fa331e4985836682ec7
Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Mon Mar 28 18:43:36 2016 +0900

    DRI3: Refuse to open DRM file descriptor for ssh clients (v2)
    
    Fixes hangs when attempting to use DRI3 on display connections forwarded
    via SSH.
    
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=93261
    
    v2: Don't do this for Xorg > 1.18.99.1 since the corresponding xserver
        change has landed in Git master.
    
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com> (v1)

diff --git a/src/radeon_dri3.c b/src/radeon_dri3.c
index 1415a0d..43a073b 100644
--- a/src/radeon_dri3.c
+++ b/src/radeon_dri3.c
@@ -38,6 +38,7 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <errno.h>
+#include <libgen.h>
 
 
 static int
@@ -86,6 +87,38 @@ radeon_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
+radeon_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 radeon_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 radeon_dri3_pixmap_from_fd(ScreenPtr screen,
 					    int fd,
 					    CARD16 width,
@@ -179,9 +212,13 @@ static int radeon_dri3_fd_from_pixmap(ScreenPtr screen,
 }
 
 static dri3_screen_info_rec radeon_dri3_screen_info = {
+#if DRI3_SCREEN_INFO_VERSION >= 1 && XORG_VERSION_CURRENT <= XORG_VERSION_NUMERIC(1,18,99,1,0)
+	.version = 1,
+	.open_client = radeon_dri3_open_client,
+#else
 	.version = 0,
-
 	.open = radeon_dri3_open,
+#endif
 	.pixmap_from_fd = radeon_dri3_pixmap_from_fd,
 	.fd_from_pixmap = radeon_dri3_fd_from_pixmap
 };


More information about the xorg-commit mailing list