diff options
author | Ilia Mirkin <imirkin@alum.mit.edu> | 2018-02-09 23:00:27 -0500 |
---|---|---|
committer | Ilia Mirkin <imirkin@alum.mit.edu> | 2018-03-08 23:43:37 -0500 |
commit | ac8f7b949e50d96f281b09f7fe96c92ea4d178ec (patch) | |
tree | 3bd5e347ce7f254f082042271337bc7fd029261a | |
parent | 6e2b4bed7b226dce262c7e14f72a29b003791be8 (diff) | |
download | xorg-driver-xf86-video-nouveau-ac8f7b949e50d96f281b09f7fe96c92ea4d178ec.tar.gz |
dri3: don't check permissions on render node
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@alum.mit.edu>
-rw-r--r-- | src/nouveau_dri2.c | 22 |
1 files 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, |