Mesa (staging/19.0): vulkan/wsi: check if the display_fd given is master

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Apr 29 16:03:22 UTC 2019


Module: Mesa
Branch: staging/19.0
Commit: 28ec25e273bda78bfed688ff50d146c002065161
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=28ec25e273bda78bfed688ff50d146c002065161

Author: Emil Velikov <emil.velikov at collabora.com>
Date:   Wed Apr 17 17:49:09 2019 +0100

vulkan/wsi: check if the display_fd given is master

As effectively required by the extension, we need to ensure we're master

Currently drivers employ vendor specific solutions, which check if the
device behind the fd is capable*, yet none of them do the master check.

*In the radv case, if acceleration is available.

Instead of duplicating the check in each driver, keep it where it's
needed and used.

Note this copies libdrm's drmIsMaster() to avoid depending on bleeding
edge version of the library.

v2: set the fd to -1 if not master (Bas)

Fixes: da997ebec92 ("vulkan: Add KHR_display extension using DRM [v10]")
Cc: Andres Rodriguez <andresx7 at gmail.com>
Cc: Jason Ekstrand <jason at jlekstrand.net>
Cc: Keith Packard <keithp at keithp.com>
Reported-by: Andres Rodriguez <andresx7 at gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Signed-off-by: Emil Velikov <emil.velikov at collabora.com>
(cherry picked from commit c962a78f18284e2971301bf68c9c60500ca398e4)

---

 src/vulkan/wsi/wsi_common_display.c | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/src/vulkan/wsi/wsi_common_display.c b/src/vulkan/wsi/wsi_common_display.c
index 20209b0cbd0..0a1cf62d498 100644
--- a/src/vulkan/wsi/wsi_common_display.c
+++ b/src/vulkan/wsi/wsi_common_display.c
@@ -1798,6 +1798,30 @@ fail_attr_init:
    return ret;
 }
 
+
+/*
+ * Local version fo the libdrm helper. Added to avoid depending on bleeding
+ * edge version of the library.
+ */
+static int
+local_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;
+}
+
 VkResult
 wsi_display_init_wsi(struct wsi_device *wsi_device,
                      const VkAllocationCallbacks *alloc,
@@ -1813,6 +1837,9 @@ wsi_display_init_wsi(struct wsi_device *wsi_device,
    }
 
    wsi->fd = display_fd;
+   if (wsi->fd != -1 && !local_drmIsMaster(wsi->fd))
+      wsi->fd = -1;
+
    wsi->alloc = alloc;
 
    list_inithead(&wsi->connectors);




More information about the mesa-commit mailing list