mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-22 15:40:11 +01:00
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: da997ebec9 ("vulkan: Add KHR_display extension using DRM [v10]")
Cc: Andres Rodriguez <andresx7@gmail.com>
Cc: Jason Ekstrand <jason@jlekstrand.net>
Cc: Keith Packard <keithp@keithp.com>
Reported-by: Andres Rodriguez <andresx7@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
This commit is contained in:
parent
1a9367c134
commit
c962a78f18
1 changed files with 27 additions and 0 deletions
|
|
@ -1812,6 +1812,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,
|
||||
|
|
@ -1827,6 +1851,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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue