drm: Branch 'master'

[email protected] (GitLab Mirror) Thu, 7 Feb 2019 17:59:11 +0000 (UTC)
Newsgroups gmane.comp.video.dri.patches
Message-ID <[email protected]>
 xf86drm.c |   18 ++++++++++++++++++
 xf86drm.h |    2 ++
 2 files changed, 20 insertions(+)

New commits:
commit 17dfe3ac93217b43f93bc81d1129bd38a89d0368
Author: Christopher James Halse Rogers <[email protected]>
Date:   Wed Jan 23 15:38:45 2019 +1100

    xf86drm: Add drmIsMaster()
    
    We can't use drmSetMaster to query whether or not a drm fd is master
    because it requires CAP_SYS_ADMIN, even if the fd *is* a master fd.
    
    Pick DRM_IOCTL_MODE_ATTACHMODE as a long-deprecated ioctl that is
    DRM_MASTER but not DRM_ROOT_ONLY as the probe by which we can detect
    whether or not the fd is master.
    
    This is useful for code that might get master by open()ing the drm device
    while no other master exists, but can't call drmSetMaster itself because
    it's not running as root or is in a container, where container-root isn't
    real-root.
    
    v2: Use the AUTH_MAGIC request rather than MODE_ATTACHMODE, as it's more
        clearly related to master status.
    
    v3: [Emil] Don't expose internals, check for -EACCES.
    
    Signed-off-by: Christopher James Halse Rogers <[email protected]>
    Reviewed-by: Daniel Vetter <[email protected]> (v2)
    Signed-off-by: Emil Velikov <[email protected]>
    Reviewed-by: Emil Velikov <[email protected]>

diff --git a/xf86drm.c b/xf86drm.c
index e67391b1..ac7af0d6 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -2743,6 +2743,24 @@ drm_public int drmDropMaster(int fd)
         return drmIoctl(fd, DRM_IOCTL_DROP_MASTER, NULL);
 }
 
+drm_public bool drmIsMaster(int fd)
+{
+        /* Detect master by attempting something that requires master.
+         *
+         * Authenticating magic tokens requires master and 0 is an
+         * internal kernel detail which we could use. Attempting this on
+         * a master fd would fail therefore fail with EINVAL because 0
+         * is invalid.
+         *
+         * A non-master fd will fail with EACCES, as the kernel checks
+         * for master before attempting to do anything else.
+         *
+         * Since we don't want to leak implementation details, use
+         * EACCES.
+         */
+        return drmAuthMagic(fd, 0) != -EACCES;
+}
+
 drm_public char *drmGetDeviceNameFromFd(int fd)
 {
     char name[128];
diff --git a/xf86drm.h b/xf86drm.h
index 7773d71a..9e920db9 100644
--- a/xf86drm.h
+++ b/xf86drm.h
@@ -37,6 +37,7 @@
 #include <stdarg.h>
 #include <sys/types.h>
 #include <stdint.h>
+#include <stdbool.h>
 #include <drm.h>
 
 #if defined(__cplusplus)
@@ -733,6 +734,7 @@ extern void drmMsg(const char *format, ...) DRM_PRINTFLIKE(1, 2);
 
 extern int drmSetMaster(int fd);
 extern int drmDropMaster(int fd);
+extern bool drmIsMaster(int fd);
 
 #define DRM_EVENT_CONTEXT_VERSION 4
 


--