[Nouveau] [PATCH] dri3: don't check permissions on render node

Ilia Mirkin imirkin at alum.mit.edu
Sat Feb 10 04:03:38 UTC 2018


The permission check fails if udev sets the render node to 0666 but
leaves the card at 0660, as is done in at least udev-236.

Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
---
 src/nouveau_dri2.c | 22 ++++++++--------------
 1 file changed, 8 insertions(+), 14 deletions(-)

diff --git a/src/nouveau_dri2.c b/src/nouveau_dri2.c
index ac0ca09..a726e86 100644
--- a/src/nouveau_dri2.c
+++ b/src/nouveau_dri2.c
@@ -1024,15 +1024,16 @@ nouveau_dri2_fini(ScreenPtr pScreen)
 }
 
 #ifdef DRI3
-static int is_render_node(int fd, struct stat *st)
+static int is_render_node(int fd)
 {
-	if (fstat(fd, st))
+	struct stat st;
+	if (fstat(fd, &st))
 		return 0;
 
-	if (!S_ISCHR(st->st_mode))
+	if (!S_ISCHR(st.st_mode))
 		return 0;
 
-	return st->st_rdev & 0x80;
+	return st.st_rdev & 0x80;
   }
 
 static int
@@ -1041,7 +1042,6 @@ nouveau_dri3_open(ScreenPtr screen, RRProviderPtr provider, int *out)
 	ScrnInfoPtr pScrn = xf86ScreenToScrn(screen);
 	NVPtr pNv = NVPTR(pScrn);
 	int fd = -1;
-	struct stat buff;
 
 #ifdef O_CLOEXEC
 	fd = open(pNv->render_node, O_RDWR | O_CLOEXEC);
@@ -1051,11 +1051,7 @@ nouveau_dri3_open(ScreenPtr screen, RRProviderPtr provider, int *out)
 	if (fd < 0)
 		return -BadAlloc;
 
-	if (fstat(fd, &buff)) {
-		close(fd);
-		return -BadMatch;
-	}
-	if (!is_render_node(fd, &buff)) {
+	if (!is_render_node(fd)) {
 		drm_magic_t magic;
 
 		if (drmGetMagic(fd, &magic) || drmAuthMagic(pNv->dev->fd, magic)) {
@@ -1131,15 +1127,13 @@ nouveau_dri3_screen_init(ScreenPtr screen)
 #ifdef DRI3
 	ScrnInfoPtr pScrn = xf86ScreenToScrn(screen);
 	NVPtr pNv = NVPTR(pScrn);
-	struct stat master, render;
 	char *buf;
 
-	if (is_render_node(pNv->dev->fd, &master))
+	if (is_render_node(pNv->dev->fd))
 		return TRUE;
 
 	buf = drmGetRenderDeviceNameFromFd(pNv->dev->fd);
-	if (buf && stat(buf, &render) == 0 &&
-	    master.st_mode == render.st_mode) {
+	if (buf) {
 		pNv->render_node = buf;
 		if (dri3_screen_init(screen, &nouveau_dri3_screen_info)) {
 			xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-- 
2.13.6



More information about the Nouveau mailing list